2007/1/16

基地邊緣

從1/5入手兩本基地後傳之後,我花了五天空閒的時間,漫長的等待就是為了那最終靈光一現的真相。作者冗長的舖陳下,耐心等待的結果真的令人吃驚,既出現了以生命為前提集合了群眾意識的第三勢力蓋亞,又讓最後的答案回到地球本身這個未解的謎團上,看來得看完基地與地球才能知道結論了。



在基地邊緣中,端點星議員崔維茲配合斐洛拉特,取代了謝頓成為思考的主角。一心認為掌握了銀河的第一基地,卻一直籠罩在第二基地傳說的陰影當中,因此端點星市長布拉諾派遣崔維茲與斐洛拉特,出發尋找第二基地的下落。以為掌握了第一基地這個傀儡的第二基地,一心認為操縱了第一基地,未來將會建造第二帝國,但是在堅迪柏的線民康普幫助下,發現第一基地想要消滅第二基地的意圖,在過程中意外發現可能有反騾的存在,也就是當初騾所懼怕的那一股力量,所以第一發言者桑帝斯派遣堅迪柏與阿姆女子諾微追蹤崔維茲,追查第二基地可能會面臨的危機。



這一切都在蓋亞的掌握當中,所有人都在蓋亞星球生命群體意識的引導下,來到蓋亞的星域,原因是因為蓋亞感受到自己即將面臨到的危機,一個足以毀滅蓋亞的危機,寄望與眾不同的崔維茲能協助蓋亞解決問題。這個問題就是第一基地,希望建立軍事第二銀河帝國,而以川陀第二基地為藍本的帝國,卻是一個工於心計的父權式帝國,依靠計算維生。蓋亞星系,是以巨大的融合生命體為藍本,將所有生命形式包含有機與無機的生命體,全都融合成一個群眾意識。



雖然蓋亞擁有操控第一與第二基地的力量,但因為他們一開始是借助機器人建立的,所以也內建了機器人學三大法則,將第一法則擴充至「蓋亞不得傷害生命,或袖手旁觀坐視生命受到傷害。」為了遵循這個定律,蓋亞不知道如何處理三股力量互相牽引的衝突,也不知道如何避免銀河中的生命受到重大傷害,也不知道如何減低犧牲的程度。所以寄望與眾不同的崔維茲能藉由他自身的思考判斷,幫蓋亞決定未來。



然而崔維茲卻在做出決定之後,才說出自己也受到蓋亞間接的影響,才有這樣的決定,他也發現一直在他們身邊的寶綺思是一個監督蓋亞的機器人。崔維茲自一開始就認為在群眾意識的前提下,又能擁有個體的思想,似乎是一件不可思議的事,難道沒有特定的個體不遵循群體意識嗎?但他的抉擇只出於一個簡單的推理,因為建立蓋亞星系要花很長的時間,拖延了這段時間就能讓他有機會修正或扭轉既定的方向。崔維茲在最後也下定決心要尋找突然消失的地球,他覺得只有找到地球才能找到真正的答案。

2006/12/25

SAC - Solid State Society (SSS)

這部攻殼Stand Alone Comples的OVA作品,表面上看起來延續了前面的劇情,但實際上劇情內容並沒有像Innocence一樣那麼艱澀,網路上的討論文章,有褒有貶,Solid State Society這篇文章批評的內容與質疑的地方,確實都是SSS劇情裡隱藏的缺陷,但是仔細想想,卻似乎可以自圓其說。



舉例來說,劇情一開始就以連續自殺事件作為「傀儡迴」的引子,但不合理的地方在於,為甚麼九課在處理自殺犯人的時候,沒有採用光學迷彩解決犯人,而讓犯人直接在他們面前自殺成功,除非編劇想要在這裡顯示德古沙的領導跟素子少校還有一大段差距,才故意讓他們做出錯誤的判斷。這一段劇情跟後面少校以光學迷彩突然出現阻止德古沙自殺的劇情差距甚大。但巴特卻又在後面說除了少校外,他最佩服德古沙,也許他只是佩服德古沙有這個勇氣放棄左輪手槍的堅持,電子腦化義體化。



老化的社會在未來的確會成為重大的社會問題,於是產生了老人的看護網路,連接著全自動老人看護系統,實行了最低限度照顧措施的老人,但卻因為這個網路而產生了許多「貴腐老人」,但那個時代已經是義體與電子腦技術普及的時代,照道理說,應該不會有很多人老化,因為多數人都會在老化前選擇電子化。兩萬名失蹤兒童,也是為了吸引這些老人而讓看護網路產生的工具,以便吸引這些老人把財產合法交給政府。



不過如果仔細想想,德古沙不是也一直地抗拒義體化,顯然義體化並不是大家都能接受的,那麼這些老人的存在就是合理的。但利用兒童去繼承老人財產,也不是那麼合理的方式,要讓這些老人交出遺產,只要透過立法直接接收就可以了。雖然這一段的情節有點怪怪的,但故事能將高齡化的問題,提出時代的大問題,確實也是件不容易的事。但正如同一開始提到的blog文章所說的,這樣的情節跟「老人Z」比較起來,的確是略遜一籌。



少校的消失再出現,九課的德古沙轉變,巴特還是一如往常沒變,課長為了權宜,領導失去少校的九課,改變自己的定位角色,致力成為用八成的力量解決三件案子的組織,兩年的變化這麼大,真的讓人吃驚。



SSS一樣在劇情當中,提出了許多名言,不過值得欣慰的是,沒有像Innocence那麼高深莫測。

1. 「這樣好嗎? 還未獲得許可啊。」「如果無人知道潘朵拉之盒曾經打開過,就不算是違反承諾了。」

2. 「與其花費十成的力量解決一件案子,還不如創造一個能夠用八成的力量解決三件案子的組織。」

3. 「你考慮一下再結婚的事吧,孤獨的老人可是很悲慘的。」「因為我不想拿著一些帶不進墳墓的東西。」

4. 「子女像父母,機器像人類,你卻一點也不像我。老鴉巢中能飛出鳳凰,我很欣慰,多注意身體健康啊。」

5. 「課長,我們又能做些什麼事呢?」「我現在能回答你的,就是我們只能在管理自我的規範之中,無奈地與其對抗下去。」

6. 「超越了表象,我到底看透了什麼?你覺得我是為了什麼而在網路中徘徊的?真理? 知己?還是某個特定的人呢?也許只是把自己的無能,怪罪於組織或系統。」

7. 「雖然身處規範之中的時候,覺得十分無趣,但是毫無規範的行為本身,卻又無法作為行為成立,結果完全相同。」





Solid State Society

攻殼機動隊 S.A.C. Solid State Society

Solid State Society

攻殼機動隊 SAC Solid State Society

2006/11/28

談美 by 朱光潛

美學在理性主義當道的現代社會中,總是無法受到重視,小朋友們會學英文、學算數、學畫畫、學鋼琴,但到了中學時代以後,升學成了唯一的一件事,漸漸地,大家學會算圓錐曲線、學會語文的修辭,但忘記了小時候塗鴉的快樂,所以很多人都跟我一樣,繪畫只停留在幼稚園的程度,也忘記了怎麼欣賞美的事物。

談美這本書,是新文化運動後的作品,在朱自清的序中,就提到當時大家只知道不斷複製西洋名畫,卻不懂得美感究竟是什麼。其實每一個人的人生,都是一件唯一的藝術作品,大家每天會琢磨塑造這件作品,但每一個人的功力用心不同,結果就跟著不一樣,有些即能稱上是一件藝術品,有些就不行。人生可分成實用、科學、美感三種活動的綜合體,只有這三者平均發展,才有一個美滿的人生。

作者朱光潛在書中明確說明美感的定義,然後將一般人的誤解一一解釋排除,例如美感不是快感,美感不是聯想(因美感不該帶有理性思考,他是純粹直覺的),考證與批評不是欣賞,自然並不是美,遊戲是藝術的雛形,美感一定有想像加上情感,再加上配合的格律。學習從模仿開始,想要學一門藝術,就得先學它書特殊的筋肉技巧。

一般人只會在面對大自然,或是看到帥哥美女,就認為這是美的東西,發出讚嘆之語。然而作者告訴我們,事物的表面不能決定美醜,重要的是每一個人自己怎麼觀察,怎麼欣賞,在感受到美的境界的一瞬間,會忘記自己的存在,進入美感的世界。

作者以作詩為例,討論創造與模仿的差異,學習一項藝術,要先學會該項藝術的技巧,而學習是從模仿開始的,思想離不開語言,語言離不開喉舌的動作,所以雖然作文得先學會朗誦,朗誦既久,則古人之聲就能在喉舌上留下痕跡,等到下筆時,自然就能因襲這活動,而創作出詩文,這個道理,直到現在才瞭解。因為學生時代總是以紙筆的考試為主,自然而然就習慣以默讀的方式,配合筆寫讀書,而現在來看,這長久的習慣,對學習詩文創作來說,卻是一種慢性毒藥。

家裡的小朋友會跟著大人念詩或三字經,往往念了一兩個星期,他就能記熟那些詩文的音韻,自然而然就默記下來了,而我們還只能透過眼睛,然後唸出文字,無法背誦,我想這就是學習語言的黃金時期在3~5歲的原因吧!

美感不在外物上,而在每一個人自己觀察事物的角度與方法,當忘卻自我、沈醉的事物形象的那一瞬間,美感油然而生,而自己也彷彿置身於另一個世界。

軟體的美感存在於Pattern的技巧上,Pattern是軟體設計常見的樣式,在一步一步重構的過程中,軟體工藝品也逐漸顯露出美的形體,當忘記自己的時候,聯繫軟體與程式設計師的,就是藝術的美。

2006/11/20

品牌思考很簡單-只要跟15個哲學大師借腦 by 湯姆.布勞恩

從書本的名稱,就知道內容是以哲學的角度來觀察品牌思考。「哲學」對一般人來說是種沈重的高談闊論,沒有很多人喜歡討論一些看起來就是真理的哲學問題,例如「價值觀是什麼?」「真實世界的組成是什麼?」「人的認知世界是什麼?」這樣的問題。但這些奇怪的哲學問題,都是在討論「人」以什麼角度、要以什麼態度面對這個世界,建構自己的價值觀與生活態度,才能真正地瞭解人的世界。

這15個西洋哲學大師,各有其傳誦於世的經典理論,這本書把這些理論套用在品牌管理上,因為品牌只存在於「人」身上,透過哲學思考的引導,我們就能更深入瞭解與掌握品牌管理的哲學。

博士的英文是Doctor of Philosophy(Ph.D.),在維基百科的解釋說道,哲學博士並不一定修讀「哲學」,而是指博士對其知識範疇的理論、內容及發展等都具有相當的認識,能獨力進行研究,並在該範疇內對學術界有所建樹。但更深層地來看,我們可說所有科學的根源都是哲學,也就是根源於一般人的思考方式。

以下以章節目錄為順序,列出閱讀過程中圈點的話。
# 1 赫拉克利特斯——一個起點
思考課題:品牌的經營必須立足於不斷變動的基礎上。
世界永遠處於變動的狀態下
變動的狀態可適用於萬物之上
品牌只存在於消費者的腦子裡,虛幻無常,不可以視為穩定的假象,沒有任何事物是理所當然的

# 2 蘇格拉底——詰問的藝術
思考課題:定義品牌價值觀與品牌策略,不可忽略慎密嚴謹的重要性。
道德哲學關注的核心是理解我們行為的動機
思想背後有兩個驅動力:為了追求真理而不斷質疑發問,不屈不撓地探求理解真理而影響我們的行為
起點是不斷提問,終點是造成行為的改變
不要把事物是為理所當然,以積極態度謹慎提問,獲得更深入的理解,只要感覺起來不像真理,就不要輕易接受

# 3 柏拉圖——勘透表象
思考課題:你的品牌必須要有兩種本質:變與不變,不斷變化的表象經驗界,與恆常不變的真實理型界。
理型論
一切事物都在形成的過程當中,沒有任何事物是存在的
必須把重點放在品牌能夠成為什麼,而不在於品牌是什麼。在形成的過程中,一邊不斷變化品牌的虛幻面,一邊賦予品牌存在理由的不變事物(價值觀)
柏拉圖的洞穴迷思:直接經驗中的品牌,也只反映出某種真實的表象而已
成功的品牌必須同時「合乎當下」又「恆久不變」

# 4 亞里斯多德——結構的重要性
思考課題:絕對要問品牌的目的是什麼,才能勝過其他品牌。
在經驗界中檢視品牌,並問「品牌存在究竟有什麼意義?」
決定的要素不是零件的物質特徵,而是車子的結構與形式。車輛的形式是品牌的核心
品牌四因:物質因、動力因、形式因、目的因
是什麼、來自哪裡、看起來什麼模樣、能夠造成什麼效果

柏拉圖的無形價值觀 vs 亞里斯多德的功能性利益(目的)

# 5 笛卡兒——理性的應用
思考課題:找出維繫品牌與消費者之間關係的原因,你必須深入消費者的腦子。
Cogito ergo sum 我思,故我在
我們是否能夠確知任何事物?
數學,內部一致性,概念科學
品牌管理的基礎:若X則Y,思考方法必須奠基於無可置疑的前提之上,在這個基礎上建構知識的過程,必須完全透明而可供人檢視
世界存於兩個層面之上:物質的層面、思想的層面
品牌就是想法
「為甚麼」
笛卡兒的二元論,消費者內心的世界、看得見摸得著的世界
竭盡全力找出品牌中無可置疑的核心,也就是維繫品牌與消費者關係的原因,了解消費者內心深處的動機及思考過程,然後就可以循著理性與邏輯逐步發展

# 6 史賓諾莎與萊布尼茲——系統性的方法
思考課題:品牌的陳述必須不斷加以證實。
史賓諾莎:在一個完全依循數學原理和確定性而運行的世界中,哪裡有「上帝」存在的空間
否認物質與心智之間有所區別
笛卡兒:人有軀殼與靈魂 史賓諾莎:每個人都是一個統一的實體,身體與靈魂只是談論一個人的兩種方式而已,不能分開

萊布尼茲:分析陳述(可為真或偽)、綜合陳述(真偽取決於陳述本身以外的事實)
談論品牌時,要區分確實為真的陳述,和我們自己希望為真的陳述。如果是綜合陳述,就得不斷加以證實

# 7 洛克——經驗主義的傳統
思考課題:無論如何,一定要緊緊把握住品牌的特色。
我們對於一切所擁有的知識,都是透過意識的經驗(智識上、情感上、感官上),這些輸入都稱為「觀念」
經驗主義:觀念原本存在於外在,透過感官傳遞到大腦(內在),然後才組合成有意義的東西

經驗主義 vs 純粹理性主義

品牌建構的重點不在解譯消費者最初的動機,而在創造(對消費者來說)有意義的觀念
所有品牌都有客觀、主要屬性(可測量的),還有次要屬性,取決於品牌與每一個消費著之間的關係,消費者的主觀經驗

創造品牌特色,和世界的現況保持一致

# 8 休謨——理性的限制
思考課題:把注意力放在消費者的感受與情感上,不要讓自己成為品牌理論的奴隸!
英國經驗主義的高峰
一切都是知覺,所有知識來自於經驗。品牌是高度主觀的實體,奠基於各種感官提示之上
世界是一堆個人知覺與經驗的組合,沒有任何證據證明,這一切之間都互有因果關係
可能性
品牌管理的關鍵是感受、情感、愛好,而不是思想
沒有任何事物是確定的,因此我們應該隨時都在實驗
理性有其限制,把注意力放在消費者的感受與情感上

# 9 盧梭——感受的重要性
思考課題:品牌關乎感受與情感,品牌的力量來自於能夠遠離理性。
社會契約論:人生而自由,卻無往不在枷鎖之中。人民的「全體意志」概念
愛彌兒:教育是一種發展過程,受「自然」引導,而不是刻意培育
以自然取代理性,訴諸情感而不是理性,情感價值是品牌塑造的中心
人希望能夠與群體的情感表達保持一致的慾望 -> 微觀行銷,沒有一體通用的產品

# 10 康德——平衡的觀點
思考課題:在品牌行銷當中,只要改變思考方式,就能夠改變消費者及市場。
結合了理性與經驗主義,終結了「形上學」的辯論,明確指出我們根本無法證明上帝存在(也無法證明不存在)
「純粹理性批判」
我們只能知道我們能夠知道的事情,受限於我們能夠知道的事物範圍,受限於理解的儀器(感官與心智功能),所有儀器都負責一項特定任務
別輕易假設自己能夠知道的事情,等同於該項總和。任何研究都只代表部份看法
我們在世界裡所看見的關聯,就是讓人生可以管理的要素,這些關聯奠基於我們內在的思想架構,關聯取決於主體而不是客體的性質
世界沒有客觀的範疇,只要改變對他們的思考方式,就能夠改變消費者、市場及品牌的分類範疇,
最重大的改變,通常來自於對「範疇」的認知變化,例如切割市場的方式


# 11 黑格爾——過程的優先性
思考課題:品牌行銷的關鍵在於搶先達到下一個重要的「合題」。
系統化的變動過程,把歷史視為過程
過程不但具有潛在的結構,也有最終的目的,變化不是單純為了變化而變化,而是不斷朝一個目標前進
生命的本質Geist透過歷史過程,逐步朝向徹底和諧與自知的最終狀態前進
右翼:希特勒 左翼:馬克思(唯物史觀)
要邁向前進,唯一的方式就是解決目前的衝突與緊張:辯證過程
正題 -> 反題 -> 合題
試著把若干互相衝突競爭的性質、價值觀、優點放在一起,站在當今的時代精神的先鋒地位,恰是時候
搶先達到下一個重要的合題

# 12 尼采——價值的創造
思考課題:價值觀是品牌的核心。要成為「超級品牌」,就得盤據符合這些價值觀的領域。
世界是一個實體,一個我們能夠完整經驗的實體,沒時間理會存在於我們理解範圍之外的世界,也沒有時間理會上帝,「上帝已死」
不是設法讓現存的價值觀與現況產生關聯,就是要創造新的價值觀
品牌想要建立獨特性,唯有創造自己的價值體系
「權力意志」,對這方面徹底發揮潛力的人,稱為「超人」,如果品牌展現出這種完全按照本身心意而行的意志,稱為「超級品牌」
精明的競爭者會重新定義市場與市場規則
價值觀是品牌的核心,品牌都將成為有機體

# 13 維根斯坦——把品牌視為工具
思考課題:品牌的意義是其各種用途與價值觀的總和。以這種方式管理「意義」,就是現代品牌管理的精髓所在。
把品牌視為圖像
知覺、思想、語言及表達的關係,語言的中心地位,意義圖像理論
不論是圖像還是現實世界,都具備有同樣的「邏輯形式」
品牌「代表」了某一件事物
品牌行銷者必須確保自己的品牌代表不只一件事物
把品牌視為工具 -> 品牌成長策略


# 14 存在主義——把品牌視為個體
思考課題:品牌存在主義為我們提供了另一副可用來看待成長機會的哲學鏡片。
齊克果、沙特
過程與體系都是不存在的,只有個體才存在
對於任何哲學性的事物的理解,都必須奠基於對個體如何以及為何存在的瞭解
存在主義就是探討個人如何透過自己所做的決定,而為自己的人生賦予意義
海德格
品牌是一個個體,重點不在於賦予品牌意義,而在於賦予其生命
創造一個品牌世界,「體驗行銷」
為品牌賦予自由,給予品牌自由發展與自我表現的空間


#15 波普——尋求更佳的模型
思考課題:不要再抱持確定性的觀點。我們應該隨時尋求更佳的新思考方式來取代現有的方式。
向確定的知識說再見
一旦模型出現不足之處,一定會再出現另一個新的知識架構
顯著的確定性只是人類思想的產物,不是客觀事實
沒有理論能被證明為正確,但任何理論都可以被證明為偽
培養批判的文化,批判是進步的起點

# 16 眺望未來——哲學在品牌塑造中的真正角色
大多數人在大部分的時候,都是已可辨識的實體加以思考
人生就是把這些實體找出來,並組合成多少令人滿足的狀態
我們的思考過程,主要適合於建構關聯
品牌創造慾望,不只單純滿足慾望
品牌塑造主要就是關於一般人的思考方式

2006/11/17

Portlet JSR-168 Note

Portlet JSR-168 Note

************************
PLT.5 The Portlet Interface
PLT.5.1 Number of Portlet Instances
每個portlet container針對每一個portlet definition,只能產生一個object

PLT.5.2 Portlet Life Cycle
portlet的life cycle透過javax.portlet.Portlet裡的init, processAction, render, destory methods來處理

PLT.5.2.1 Loading and Instantiation
portlet container在啟動時或是portlet被呼叫時,負責loading and instantiating portlets

PLT.5.2.2 Initialization
container以implement javax.portlet.PortletConfig 的唯一物件,透過javax.portlet.Portlet裡的init初始化portlet,並提供定義裡的ResourceBundle。PortletConfigImpl也必須提供描述portlet runtime environment(context物件, implements java.portlet.PortletContext)的access介面

PLT.5.2.2.1 Error Conditions on Initialization
initiallization時,portlet可能會throw UnavailableException或PortletException,這時候就必須要呼叫portlet的destroy
在portlet初始化失敗後,可以再次重新嘗試初始化,但必須在等待一段時間之後
初始化時的RuntimeException要以PortletException的方式處理

PLT.5.2.2.2 Tools Considerations

PLT.5.2.3 Portlet Window
preferences objects是以定義中的初始值初始化,container要提供客製化preferences物件的機制
當portlet放入portal page中,就有一個配置的preferences object,portlet跟preferences object合在一起稱為portlet window,由container負責維護他們之間的關係
管理配置pref objects與產生portlet window的方式交由container implementation,也可提供進階功能,例如階層式管理pref objects

PLT.5.2.4 Request Handling
javax.portlet.Portlet定義了processAction, render兩個methods
當container呼叫portlet的processAction時,request會參考action request,當container呼叫render時,request會參考render request
通常client的request是由portlet產生的URL trigger,稱為portlet URLs,一個portlet URL會指向一個特定的portlet。portlet URL有兩種,action URLs 或 render URLs
當client request經由action URL被trigger時,container要先處理目標portlet的processAction,然後再處理其他portlet的render。當client request經由render URL被trigger時,container就執行所有portlet的render
如果portlet有caching功能,container可選擇不執行render,而使用cached content

PLT.5.2.4.1 Action Request
在處理action request時,portlet會以action request裡的參數更新自己的state
Portlet裡的processAction有兩個參數,ActionRequest, ActionResponse
ActionRequest提供access許多參數資訊的介面,action request, window state, portlet mode, portal context, portlet session, portlet preferences data
在處理actio request的時候,portlet可以讓container重導到某個特定的URL
portlet在處理action request時,會在ActionResponse中改變portlet mode與window state,portlet mode會影響render的結果

PLT.5.2.4.2 Render Request
Portlet的render有兩個參數,RenderRequest, RenderResponse
RenderRequest提供許多參數的存取介面,render request, window state, portlet mode, portal context, portlet session, portlet preferences data
portlet由RenderResponse的writer產生content,也可以交給servlet或jsp處理

PLT.5.2.4.2.1 GenericPortlet
render會set title(在定義中)並執行doDispatch
doDispatch幫忙根據portlet mode處理request,doView:處理VIEW, doEdit:處理EDIT, doHelp:處理HELP
如果portlet的window state為MINIMIZED,則render不會執行任何一個render methods

PLT.5.2.4.3 Multithreading Issues During Request Handling
container負責處理concurrent requests的問題,Portlet developer也要在processAction與render中處理concurrent的問題

PLT.5.2.4.4 Exceptions During Request Handling
portlet可能會throw PortletException, PortletSecurityException, UnavailableException
PortletException表示處理request時發生錯誤,container必須要停止繼續執行該portlet,但其他portlet還是要繼續處理render。
PortletSecurityException表示request因user沒有足夠的權限被中止
UnavailableException表示portlet暫時或永久不能處理request
RuntimeException的處理方式跟PortletException一樣

PLT.5.2.4.5 Thread Safety
request跟response object都不保證thread safe

PLT.5.2.5 End of Service
當container因記憶體不足或shutdown的時候,可呼叫destroy後結束portlet object


************************
PLT.6 Portlet Config
PLT.6.1 Initialization Parameters
PortletConfig的getInitParameterNames, getInitParameter會傳回portlet定義中的initialization parameter names/values

PLT.6.2 Portlet Resource Bundle
在定義中的裡有title, short-title, keywords
如果有定義com.foo.myApp.QuotePortlet,container必須要產生ResourceBundle提供大家使用,render method會使用PortletConfig裡的ResourceBundle取回ResourceBundle裡定義的title資料

************************
PLT.7 Portlet URLs
portlet需要產生參考到自身的portlet的URL,作為content的一部分
PLT.7.1 PortletURL
portlet會藉由RenderResponse裡的createActionURL與createRenderURL產生PortletURL介面的實作,createActionURL產生action URLs,createRenderURL產生render URLs
因為有些container會產生一些狀態碼放在URL上,portlet開發人員不應該自己寫form並使用HTTP GET method取得資料
portlet可以在PortletURL中加入自己的參數,setParameter與setParameters
container必須要 "x-www-form-urlencoded"對參數名字與值編碼,但developer不需要encode parameter names/values
ex: PortletURL url = response.createRenderURL();
url.setParameter("customer", "foo.com");
url.setParameter("show", "summary");
writer.print("Summary");

PLT.7.1.1 Including a Portlet Mode or a Window State
portlet URL 必須要包含portlet mode的參數,PortletURL裡有setWindowState, setPortletMode兩個methods
ex: PortletURL url = response.createActionURL();
url.setParameter("paymentMethod", "creaditCard");
url.setWindowState(WindowState.MAXIMIZED);
writer.print("< FORM METHOD=\"POST\" ACTION=\""+ url.toString()+"\" >");

portlet不能設定未定義的PortletMode,會產生PortletModeException
portlet不能設定未定義的WindowState,會產生WindowStateException

PLT.7.1.2 Portlet URL security
PortletURL.setSecure可指定為HTTPS or HTTP,如果未指定,則跟current request一樣


************************
PLT.8 Portlet Modes
VIEW, EDIT, HELP

PLT.8.1 VIEW Portlet Mode
Portlet一定要support VIEW mode,overriding doView

PLT.8.2 EDIT Portlet Mode
Portlet不一定要支援EDIT mode
overriding doEdit

PLT.8.3 HELP Portlet Mode
Portlet不一定要支援HELP mode
overriding doHelp

PLT.8.4 Custom Portlet Modes
Portal廠商可以自己定義自己的mode,要寫在定義檔裡的custom-portlet-mode裡面,在PLT.A裡面有建議提供的自訂Portlet Modes
ex:

Creates content for Cut and Paste
clipboard


Provides administration functions
config


PLT.8.5 GenericPortlet Render Handling
GenericPortlet實作的render method會將request dispatch到doView, doEdit, doHelp,如果Portlet提供自訂modes,則必須要override doDispatch

PLT.8.6 Defining Portlet Modes Support
ex:

text/html
edit
help
...


text/vnd.wap.wml
help
...


***********************
PLT.9 Window States
window state代表portal page上可填寫的content畫面空間大小
標準有三種window states: NORMAL, MAXIMIZED, MINIMIZED

PLT.9.1 NORMAL Window State
PLT.9.2 MAXIMIZED Window State
PLT.9.3 MINIMIZED Window State
PLT.9.4 Custom Window States
ex:

Occupies 50% of the portal page
half_page



*****************
PLT.10 Portlet Context
PortletContext定義了portlet執行中的時候,Portlet application中的portlet能做什麼事情,例如使用PortletContext,portlet能夠log events, obtain portlet application resources, set/store attributes for other portlets/servlets

PLT.10.1 Scope of the Portlet Context
在containter中PortletContext的實作instance只會有一個

PLT.10.2 Portlet Context functionality
透過PortletContext,能夠 access context initialization parameters, retrieve/store context attributes, obtain static resources, obtain a request dispatcher to include servlets/JSPs

PLT.10.3 Relationship with the Servlet Context
context-wide initialization parameters跟servlet context的一樣
context attributes跟servlet context一起共用,透過PortletContext跟ServletContext取得的initialization parameters會完全一樣
透過ServletContext跟PortletContext存取的attributes都一樣

??? PortletContext必須處理ServletContext中所提供的temporary working directory (Servlet spec 2.3 javax.servlet.context.tempdir)

PLT.10.4 Correspondence between ServletContext and PortletContext methods
PortletContext必須仿照ServletContext提供 getAttribute, getAttributeNames, getInitParameter, getInitParameterNames, getMimeType, getRealPath, getResource, getResourcePaths, getResourceAsStream, log, removeAttribute, setAttribute


*********************
PLT.11 Portlet Requests
PLT.11.1 PortletRequest Interface
PortletRequest提供ActionRequest與RenderRequest共用的功能

PLT.11.1.1 Request Parameters
如果portlet收到client端的request,URL必須要encode(PortletURL),request object的parameters必須要是"x-www-form-urlencoded" decoded
containter不能從action request傳遞參數給後續的render requests,如果portlet需要這樣作,則必須要在ActionRespponse裡的processAction中使用setRenderParameter or setRenderParameters

portlet不可以取得傳遞到別的portlet中的參數

取得參數的介面methods: getParameter, getParameterNames, getParameterValues, getParameterMap

PLT.11.1.2 Extra Request Parameters
containter可以在portlet URL上增加參數,幫助route/process request
以"javax.portlet."為prefix的參數,保留給container使用

PLT.11.1.3 Request Attributes
JSP/servlet透過PortletRequestDispatcher分享使用request attributes
PortletRequest可以set, obtain, remove參數,methods: getAttribute, getAttributeNames, setAttribute, removeAttribute

以"javax.portlet."為prefix的attributes,保留給container使用

PLT.11.1.4 Request Properties
HTTP client request裡的headers可透過 PortletRequest的getProperty, getProperties, getPropertyNames取得

PLT.11.1.5 Request Context Path
context path是portlet app被deploy時的路徑,path不能以"/"開頭,不能以"/"結尾

PLT.11.1.6 Security Attributes
PortletRequest裡的 getAuthType, getRemoteUser, getUserPrincipal, isUserInRole, isSecure

getAuthType: portal使用的authentication scheme, ex: BASIC_AUTH, DIGEST_AUTH, CERT_AUTH, FORM_AUTH,如果USER沒有authenicated,則getAuthType會return null

getRemoteUser: 回傳java.security.Principal物件

isUserInRole: 表示user內含於某個特定角色中

isSecure: request是否是以HTTPS傳送

PLT.11.1.7 Response Content Types
portlet可透過getResponseContentType取得default content type
getResponseContentTypes中要回傳container支援的所有content types

getResponseContentType可回傳 *

PLT.11.1.8 Internationalization
container要決定user產生reponse時使用的locale,container可以使用request中的 Accept-Language header訊息,PortletRequest.getLocale會回傳container選擇的locale

PLT.11.1.9 Portlet Mode
PortletRequest.getPortletMode容許portlet取得目前的 portlet mode
PortletRequest.isPortletModeAllowed 可決定是否支援某個portlet mode

PLT.11.1.10 Window State
PortletRequest.getWindowState 回傳目前的window state
PortletRequest.isWindowStateAllowed 可判斷是否可使用某個window state

PLT.11.2 ActionRquest Interface
ActionRequst extends PortletRequest,用在Portlet.processAction中

PLT.11.2.1 Retrieving Uploaded Data
input stream在client request中包含HTTP POST data(除了 application/x-www-form-urlencoded之外)時很有用
ActionRequest.getReader, getPortletInputStream 可取得POST data資料,可能會throw IllegalStateException

ActionRequest提供四個method處理input stream: getContentType, getCharacterEncoding, setCharacterEncoding, getContentLength,如果POST data是 application/x-www-form-urlencoded 這種type,則getReader/getPortletInputStream 會throw IllegalStateException

PLT.11.3 RenderRequest
目前RenderRequest沒有定義任何methods

PLT.11.4 Lifetime of the Request Objects
每一個request objects只在processAction or render method裡面可以使用


**********************
PLT.12 Portlet Response
PLT.12.1 PortletResponse Interface
PortletResponse定義ActionResponse, RenderResponse共用介面

PLT.12.1.1 Response Properties
PortletResponse.setProperty, addProperty

portlet要使用encodeURL建立URLs


PLT.12.2 ActionResponse Interface
ActionResponse extends PortletResponse,由Portlet.processAction使用,提供 redirect, set render parameters, change window state, change portlet mode 的功能

PLT.12.2.1 Redirections
sendRedirect必須要指定一個 fully qualified URL,否則會傳回 IllegalArgumentException

如果在ActionResponse.setPortletMode, setWindowState, setRenderParameter, setRenderParameters後面呼叫sendRedirect,就會 throw IllegalArgumentException

PLT.12.2.2 Portlet Modes and Window State Changes
setPortletMode可改變current portlet mode,如果指定一個不支援的mode,就會 throw PortletModeException

setWindowState可改變window state,如果指定一個不支援的state,就會throw WindowStateException

sendRedirect之後呼叫setPortletMode, setWindowState,就會 throw IllegalArgumentException

PLT.12.2.3 Render Parameters
ActionResponse.setRenderParameter, setRenderParameters設定render parameters

PLT.12.3 RenderResponse Interface
RenderResponse extends PortletResponse,用在Portlet.render

PLT.12.3.1 Content Type
RenderResponse.setContentType要跟PortletRequest.getResponseContentType吻合,否則會忽略設定值

getWriter, getPortletOutputStream呼叫前,就要先呼叫setContentType

PLT.12.3.2 Output Stream and Writer Objects
RenderResponse 將content寫入 OutputStream, or Writer

PLT.12.3.3 Buffering
RenderResponse.getBufferSize, setBufferSize, isCommitted, reset, resetBuffer, flushBuffer

getBufferSize: returns the size of the underlying buffer being used

setBufferSize:

isCommitted: 表示所有response bytes已經回傳給client

flushBuffer: 強制flush contents

reset: clear data in the buffer

PLT.12.3.4 Namespace encoding
getNamespace提供portlet保證回傳唯一字串的method(在整個portal page中唯一),必須在一次render request中,呼叫幾次都回傳一樣的字串

PLT.12.3.5 Portlet Title
由container決定是否要支援自訂title
setTitle在每次portlet commit output前一定要被呼叫一次

PLT.12.4 Lifetime of Response Objects
每一個response object只在processAction, render裡面才能使用


******************
PLT.13 Portal Context
PortalContext 提供整個portal的資料,portlet可以呼叫

getPortalInfo: return portal vendor/version資料

getProperty, getPropertyNames: return portal properties

getSupportedPortletModes: return supported porlet modes

getSupportedWindowStates: return supported window states

getPortalContext: 從request object中取得 PortalContext object


**************************
PLT.14 Portlet Preferences
PLT.14.1 PortletPreferences Interface
portlet 可以在processAction過程中,修改preferences attributes

methods: getNames, getValue, setValue, getValues, setValues, getMap, isReadOnly, reset, store

ex:
PortletPreferences prefs = req.getPreferences();
String[] symbols =prefs.getValues("preferredStockSymbols",new String[]{"ACME","FOO"});
String url = prefs.getValue("quotesFeedURL",null);
int refreshInterval =Integer.parseInt(prefs.getValue("refresh","10"));

如果是read-only,則當setValue, reset時,會throw ReadOnlyException

store: 儲存修改後的PortletPreferences,如果在render中呼叫store,則會throw IllegalStateException

PLT.14.2 Preference Attributes Scopes

PLT.14.3 Preference Attributes definition



PreferredStockSymbols
FOO
XYZ
true


quotesFeedURL
http://www.foomarket.com/quotes




PLT.14.3.1 Localizing Preference Attributes
portlet spec沒有定義localizaing preference attributes

PLT.14.4 Validating Preference values

...

com.foo.portlets.XYZValidator



一個implements PreferencesValidator的class,必須要有thread safe manner
store必須要呼叫validator,可能會throw ValidatorException


*********************
PLT.15 Sessions
PortletSession介面

PLT.15.1 Creating a Session
PLT.15.2 Session Scope
PortletSession必須要scoped at the portlet application context level

PLT.15.3 Binding Attributes into a Session
PortletSession定義了兩個scope: APPLICATION_SCOPE, PORTLET_SCOPE
APPLICATION_SCOPE: 所有portlet可以使用的資料,javax.portlet.p.?,ID是container提供的id,一定要有?字元,ATTRIBUTE_NAME是用來設定PORTLET_SCOPE物件
PORTLET_SCOPE: 在一個portlet window中可以使用的資料

ex:
PortletSession session = request.getSession(true);
URL url = new URL("http://www.foo.com");
session.setAttribute("home.url",url,PortletSession.APPLICATION_SCOPE);
session.setAttribute("bkg.color","RED",PortletSession.PORTLET_SCOPE);

要得知有沒有物件新增或移除自Session,就要implements HttpSessionBindingListener,PortletSesionUtil提供判斷是否為PORTLET_SCOPE的物件,decodeAttributeName可以移除container prefix


PLT.15.4 Relationship with the Web Application HttpSession
PortletSesion必須把所有attributes存在HttpSession中

PLT.15.4.1 HttpSession Method Mapping
PortletSession.getCreationTime, getId, getLastAccessedTime, getMaxInactiveInterval, invalidate, isNew, setMaxInactiveInterval跟HttpSession一樣
getAttribute, setAttribute, removeAttribute, getAttributeNames除了跟HttpSession的一樣外,還要有額外的功能: APPLICATION_SCOPE attribute names必須要一樣,PORTLET_SCOPE的attribute name要有特定的prefix,不提供SCOPE功能的變型method必須要把全部的attributes視為PORTLET_SCOPE

PLT.15.5 Reserved HttpSession Attribute Names
以"javax.portlet."開頭的attributes保留給portlet使用

PLT.15.6 Session Timeouts

PLT.15.7 Last Accessed Times

PLT.15.8 Important Session Semantics



**********************
PLT.16 Dispatching Requests to Servlets and JSPs
PortletRequestDispatcher

PLT.16.1 Obtaining a PortletRequestDispatcher
portlet只能在render裡面使用PortletRequestDispatcher
可透過PortletContext.getRequestDispatcher, getNamedDispatcher取得PortletRequestDispatcher

getRequestDispatcher要有path String當參數,path一定要以"/"開頭,並在PortletContext裡面

getNamedDispatcher以servlet String當參數

PLT.16.1.1 Query Strings in Request Dispatcher Paths
ex:
String path = "/raisons.jsp?orderno=5";
PortletRequestDispatcher rd = context.getRequestDispatcher(path);
rd.include(renderRequest, renderResponse);

PLT.16.2 Using a Request Dispatcher
PortletRequestDispatcher.include

PLT.16.3 The Include Method
在render中可能會被呼叫很多次
不應該使用RequestDispatcher.forward

PLT.16.3.1 Included Request Parameters
必須要設定這些request attributes
javax.servlet.include.request_uri
javax.servlet.include.context_path
javax.servlet.include.servlet_path
javax.servlet.include.path_info
javax.servlet.include.query_string

PLT.16.3.2 Included Request Attributes
Request Attribute Type
javax.portlet.config javax.portlet.PortletConfig
javax.portlet.request javax.portlet.RenderRequest
javax.portlet.response javax.portlet.RenderResponse

PLT.16.3.3 Request and Response objects for Included Servlets/JSPs
HttpServletRequest.getProtocol, getRemoteAddr, getRemoteHost, getRealPath, getRequestURL 必須return null
HttpServletRequest.getPathInfo, getPathTranslated, getQueryString, getRequestURI, getServletPath必須要return path and query string infos
HttpServletRequest.getScheme, getServerName,getServerPort, getAttribute, getAttributeNames, setAttribute,removeAttribute, getLocale, getLocales, isSecure, getAuthType,getContextPath, getRemoteUser, getUserPrincipal, getRequestedSessionId,isRequestedSessionIdValid 要跟PortletRequest一樣

HttpServletRequest的這些methods必須不能作用,並要return null,getCharacterEncoding, setCharacterEncoding, getContentType, getInputStream and getReader. The getContentLength method of the HttpServletRequest must return 0.

The following methods of the HttpServletRequest must be based on the properties
provided by the getProperties method of the PortletRequest interface: getHeader,getHeaders, getHeaderNames, getCookies, getDateHeader and getIntHeader

The following methods of the HttpServletRequest must provide the functionality
defined by the Servlet Specification 2.3: getRequestDispatcher, getMethod,isUserInRole, getSession, isRequestedSessionIdFromCookie, and isRequestedSessionIdFromUrl, isRequestedSessionIdFromURL


The getMethod method of the HttpServletRequest must always return "GET".

The following methods of the HttpServletResponse must return null: encodeRedirectURL
and encodeRedirectUrl. The following methods of the HttpServletResponse must be equivalent to the methods of the RenderResponse of similar name: getCharacterEncoding, setBufferSize, flushBuffer,resetBuffer, reset, getBufferSize, isCommitted, getOutputStream, getWriter, encodeURL
and encodeUrl.

The following methods of the HttpServletResponse must perform no operations: setContentType, setContentLength, setLocale, addCookie, sendError, sendRedirect, setDateHeader, addDateHeader, setHeader, addHeader, setIntHeader, addIntHeader and setStatus. The containsHeader method of the HttpServletResponse must return false.

The getLocale method of the HttpServletResponse must be based on the getLocale method of the RenderResponse.


PLT.16.3.4 Error Handling
除了IOException之外,所有Exception都要包裝PortletException

*************************
PLT.17 User Information
PLT.17.1 Defining User Attributes



User Given Name
user.name.given


User Last Name
user.name.family



User eMail
user.home-info.online.email


Company Organization
user.business-info.postal.organization




PLT.17.2 Accessing User Attributes
ex:
Map userInfo = (Map) request.getAttribute(PortletRequest.USER_INFO);
String givenName = (userInfo!=null)? (String) userInfo.get("user.name.given") : ""
String lastName = (userInfo!=null)? (String) userInfo.get("user.name.family") : "";

PLT.17.3 Important Node on User Information
目前沒有standard user information java api

********************
PLT.18 Caching
cache content可增加效能
PLT.18.1 Expiration Cache
ex: 300

If the expiration render invocation the cache property is set to -1, the cache does not expire.

**********************
PLT.19 Portlet Applications
PLT.19.1 Relationship with Web Applications


**********************
PLT.20 Security
PLT.20.1 Introduction
PLT.20.2 Roles
PLT.20.3 Programmatic Security
Request.getRemoteUser, isUserInRole, getUserPrincipal

getRemoteUser: return client用來認證的 user name
isUserInRole
getUserPrincipal: return java.security.Principal物件

security-role-ref

...

...

FOO
manager


...
...


PLT.20.4 Specifying Security Constaints

...

accountSummary
...

...

Secure Portlets

accountSummary


CONFIDENTIAL


...


PLT.20.5 Propagation of Security Identity in EJB

***********************
PLT.21 Packaging and Deploymenet Descriptor
/WEB-INF/portlet.xml
Portlet classes in the /WEB-INF/classes directory
Portlet Java ARchive files /WEB-INF/lib/*.jar

The following deployment descriptor values must be unique in the scope of the portlet application definition:
portlet
custom-portlet-mode
custom-window-state
user-attribute

The following deployment descriptor values must be unique in the scope of the portlet definition:
init-param
supports
preference
security-role-ref


***********************
PLT.22 Portlet Tag Library
讓JSP能include portlets,並直接使用RenderRequest, RenderResponse

container必須提供portlet tag library implementation

ex: <%@ taglib uri="http://java.sun.com/portlet" prefix="portlet" %>

PLT.22.1 defineObejcts Tag
要定義以下這些變數
RenderRequest renderRequest
RenderResponse renderResponse
PortletConfig portletConfig

defineObjects不能有任何attributes與body content
ex:
<%=renderResponse.setTitle("my portlet title"); %>

PLT.22.2 actionURL Tag
actionURL產生指到目前的portlet的URL
non-required attributes:
windowState(String: non-required)
portletMode(String: non-required)
var(String: non-required): name of the exported scoped variable for the action URL
secure(String: non-required): true/ false

ex:




PLT.22.3 renderURL Tag
windowState
portletMode
var
secure
ex:





PLT.22.4 namespace Tag
ex: Foo


PLT.22.5 param Tag
name
value
ex:

*****************************
PLT.A Custom Portlet Modes
PLT.A.1 About
PLT.A.2 Config
PLT.A.3 Edit_defaults
PLT.A.4 Preview
PLT.A.5 Print

ex:

...

...

config

...

...

config

...


**************************
PLT.B Markup Fragments
Portlet產生的HTML fragments不能使用 base, body, iframe, frame, frameset, head, html, title這些tags
Portlet產生的XHTML, XHTML-Basic fragments不能使用 base, body, iframe, head, html, title這些tags


********************
PLT.C CSS Style Definitions