前言

這是 arashit100 所製作的短片『回家都會看到台灣「報導核爆」危機 中文悲劇版 』,若你不喜歡閱讀太長的文字,請先看完這部短片,可以理解文章訴求。
歡迎閱讀筆者其他關於大眾媒體的評論

本文開始
最近日本天災事件,由於網路轉播的便利,臺灣網友很輕易就可以透過網路即時觀看 NHK, TBS, 日本衛星電視, テレビ朝日 TV 等日本新聞媒體。相較於日本新聞媒體的平實報導,兩相比較之下,臺灣媒體的墮落與噬血就十分明顯 (下圖作者藍島正藍)

猜猜,當 TVBS 記者林上筠、謝賢熺第一時間趕往日本,下了飛機的問題是什麼

記者:「地震當時,你們正在做什麼?」旅客:「逃命。」

這是令國人感到慚愧與焦慮的片刻,第一時間衝到災區的不是提供援助、更不是採訪第一手重大消息,而是興奮的問「你受難多久了」。媒體記者不是前往災區帶回真相,而是將荒誕無比的新聞娛樂文化帶到日本出外景irrenhaeusler 如此描述這個現象

一流電子媒體播災變新聞會變成 Discovery 跟 National Geographic 頻道。台灣的新聞台不是變成不斷重播的二流電影台,就是三流的娛樂台,記者像是參加「來去日本住一晚」採訪「全員逃走中」,於是最後「觀眾冏很大」。

日本天災一時,臺灣新聞媒體人禍已延續十數年

這些八卦俗媚、嗜血的行為,固然造成相當亂象,但新聞娛樂化只是媒體問題的症狀,而不是媒體敗壞的病因。私認為市場因素造成是造成新聞產業結構迅速的歪斜,而這種完全拜伏市場的態度,讓眾多主流媒體放棄社會公器責任,改為營利機器的收入負責。

俗媚騷擾造假汙名未審先判、任何可以增加收視率的手段取代了職業倫理,追求業配比追求真相來的重要,選擇立場比中立報導更能滿足老闆的口味。所謂新聞自由「第四權」只不過是掩護新聞暴力的保護傘。社會公義的伸張,取決於該故事可以賺取淚水與憤慨的多寡。

新聞是否公正正確根本不重要,今日的錯誤新聞就是明日的新頭條,道歉啟事只佔些微角落篇幅,絲毫不影響營收,辛辣新聞總是每日、每小時連翻砲擊,讀者也早以麻木為健忘症患者。

這乃是系統式的崩壞現象,無法擺脫的惡性循環。你甚至分不清楚系統的起火點是因爲接受置入式行銷、還是對於事實真相的無所謂態度、還是放棄對於職業理想對養家餬口的妥協。

黃哲斌說新聞業者爲了「業配新聞」破壞了新聞結構的三角形,讓媒體開始服務廣告主,而非服務閱聽人。是銷售欺瞞,新聞不再是「由一媒體組織或個人,依其專業判斷,自發性採訪、編輯、傳播對讀者有益或有用的資訊」而是「操縱遊戲規則與從業人員,在欺瞞收視群眾的前提下,扭轉或改變最終結果」。

【FAQ】是的,自由時報曾找上我 by 黃哲斌

 

 

於是閱聽人對於媒體信賴感消失,媒體對讀者影響力減少,為了服務廣告主吸引注意力只好祭出更辛辣的手段,讓新聞變成綜藝節目跟行銷平臺!新聞的娛樂性遠比專業報導重要,輿論監督機制慘遭收買,記者甚至連耙糞的力氣都沒有,「第四權」是政府部會行銷預算的禁臠。內容生產落入壹週刊─PTT─YouTube─噗浪─部落客─業配廣告的循環,改用手指鍵入「上下左右複製貼上」來跑新聞,有時甚至連查證都省了。事實與大眾對於媒體的期待不符。

這顯然是一個結構性的問題,是資本主義的失敗,自由市場未能把自利動機帶往集體利益。

在被內化成利益系統的一部分前,記者是有的,也有人不停的力求改變,但缺乏資源的情況下也只能發出無力的呼喊

台灣新聞記者協會這一年來幫媒體人打官司,想組工會,調查置入性行銷……沒有錢辦任何活動,連討論辦記者會都迫於經費更瞭 解沒有記者會來。想要尊嚴,也覺得要不起。於是,我們製作了一個短片,他不是想要跟這個社會要求理解肯定或尊敬,反倒是一種對自己的自我提醒、自嘲和自責。

記者們過去十多年來在系統內的拉扯抗爭,卻拾不上力,連尊嚴都要不起。

社運人士、學者專家也沒閒著,嘗試各種不同的方式試圖改善這些問題,媒體素養教育拒絕惡質媒體鼓勵優質媒體推廣尊嚴報導監督政府置入行銷政策媒體觀察評論倡議創立社羣培養公民記者、維持公視政治獨立。但似乎只能微微減緩媒體墮落的速度,若是沒有一個外來的力量顛覆現有體制,這個已敗壞的封建產業似乎不可能產生質變。

到底身為閱聽眾的我們要採取如何的姿態去面對這個世代的媒體?

傅瑞德說對付爛新聞頻道閱聽眾可以

  1. 寫信去要求NHK或BBC開華語頻道,讓國內觀眾都流向優質新聞台;
  2. 要求選區立委讓公視經費充足,建立更專業的全天候新聞台;
  3. 在網路上發起「拒看x台」運動,募集百萬以上連署,讓x台拿不到廣告而倒閉;一次搞掉一台,多搞幾次之後就可以讓爛台全部消滅;
  4. 盯著任何一個你喜歡的商業新聞台看,而且不要轉台;
  5. 每一台都看,看到爛的地方就罵,看不下去就轉別台,依此類推。

但是我們都知道無論你是否拒看,你八成就不是該新聞媒體針對的閱聽者,拒看行為造成的壓力微乎其微。開設優質華語新頻道,也無法由目前地方系統臺龍頭把持,觀眾只付吃到飽費率的有線電視市場支持。公共電視的經費來源永遠比不上選前的牛肉政績來的重要。即便採取姑息主義,試圖完全忽視,卻也躲不了親朋好友的轉告。

即使你罵媒體,他們也常無所謂,反正將業配新聞具名為假名或新聞中心,不痛不養。記者個人已經內化成系統的一部分,責任全推給長官、編輯、老闆,但是長官早「已經改變了新聞和輿論的定義,他們只會傳染勢利、懶惰和媚俗的價值。

且記者也只是勞動工作者,他們似乎也只是巨大媒體機器中的小螺絲,PipperL 悲觀而無力的這樣敘述媒體勞工意識

我知道,記者也是「勞動工作者」,也是有那些「不願意」的「無奈」。但是整個勞動環境就是這樣,整個媒體生態就是這樣,他們能做的有限,大環境又不變,政、商、媒同流合污,當然找不回那所謂媒體人的尊嚴。

但就由於這種消極的無奈,記者自甘墮落成為結構共犯。他們「不願」抵抗編輯亂給的標題,他們妥協於市場壓力把新聞當綜藝,依照長官意識型態自我審查。

不,記者不值得同情。他們身陷迷失中,唯有把記者拖出團體外,打擊他們的個人聲譽,纔有機會將他們的尊嚴從集體意識中找回來。

我認為,你該罵,而且應該指名道姓的罵記者。

你要恥笑,你要對比,你要叫罵,你要指責,你要下標籤,你要像是雅虎奇摩新聞的新聞情緒投票一樣,分辨每則新聞是那一種媒體狂亂症候羣。你要為記者大人建立資料庫,就像狗仔隊追蹤名人一般,讓他們瞭解自己的名字與文字繫結在一起,留在歷史上。直到他們受不了將自己的名字與靈魂賣給長官賣給廣告主,進而羣而抵抗整個系統。

對,這無疑是一種暴力。但,這草根權力體現遠遠比不上大眾媒體的規模跟破壞力。

朱立熙在「什麼是社會公器?」一文中敘述在媒體老闆眼中,社會公器純屬課堂神話,記者更不是守門人,媒體是迎合市場口味的民主具象。他僅能期待公民記者能成為社會公器

「草根的資訊能力絕對不輸媒體菁英,看看部落格、BBS中的文章,往往容易看到精彩的分析,這是因為草根為了興趣可以從小鑽研一項議題,而媒體記者是為了 工作需要而鑽研議題,兩相對照下,有熱情的草根自然勝出。網路世界也可以用經濟學『自由市場』的機制來運作,我們要做的只是提供一個平台服務,讓網友來決 定新聞運作的機制,讓社會大眾決定頭條新聞是什麼。」他說的不錯,道理大家都懂,絕不是學究式的理論。

我期待中的這份「全民記者網路報」,除了前述「讓草根出頭」之外,還要完全落實民有、民治、民享的「媒體民主化」。除了民主化的投資入股、民主化的採訪報 導與選稿機制之外,還要民主化的人事管理,透過選舉方式,選出賢能的人來經營管理這個媒體,給他一定的任期,做不好就換人做,做得好的人也只能連任一次。 如此的「全民媒體」才是真正的社會公器,經營這個媒體的人,絕不是為了賺錢、或想成為「大報閥」,他必須有熱情與無私的奉獻精神來做這樣的「服務眾人的 事」。

既然網路 PTT 鄉民已被大眾媒體命為內容產生者、業餘專家,鄉民應當擁有人格權、內容的著作權、言論自由權,但草根鄉民若不自我賦權與大眾媒體對話,仍無法形成民主化力量。

鄉民應當與記者一樣有權揭露媒體的弊病,監督新聞記者的行為。但是你必須把持基本的規範,你該閱讀,大量閱讀,學習分析、批判媒體訊息,該罵,但不是煽罵,該憤怒,但不該作情緒化控訴。鄉民更不該把媒體作為稻草人,抓交替的把心中的憤怒、壓力與不滿宣洩到抽象箭靶上,社會集體的心理療癒不是媒體該權充的角色

專業的五樓鄉民大可以站出來取回話語權,在人格權受到迫害時,從虛擬的 ID 後站出來。在內容被抄襲挪用時,堅持自己的著作權。在意見被扭曲時,以相同的言論自由權反擊。

我理解,要求鄉民作為認真魔人以事實線索摒除謠言、解構邏輯謬誤、以細節破解二元化約語言,這些都是知識份子的高調。甚至,這種鼓吹可能引起集體憤怒,而造成失控的後果

要求鄉民在一群人同仇敵慨時,說句不中聽的話,在當下的臺灣社會是做不到的。但唯有鼓吹鄉民深入媒體識讀,纔有可能造就理智社會。在《批判的媒體識讀》 (Google Books 預覽)一書,余陽洲在《「媒體識讀」的素描與想像》中引用 Walter Cronkite 一段話

接觸各種傳播媒體。看電視,並且運用閱讀來加以支撐強化。這是我們能夠擁有,真正懂得行使公民權的理智人民的唯一辦法。我們應該教導懷疑精神 (skepticism)。對所有傳媒都須如此:質疑你閱讀的報紙,質疑你聆聽的廣播,質疑你觀看的電視。

你會說即便我們保持著懷疑精神去批判新聞,記者真的就會天真的發起革命抵抗這個敗壞的系統嗎 ?

八成不會。

但反正大眾媒體一直都不是鄉民唯一的資訊來源,不能改變他們,至少爽快的出一口惡氣嘛。

出氣,從建立媒體羞恥牆開始。

2011-03-16 02:00 更新
答覆讀者疑問
Q:『關於這個 記者羞恥牆,我是認為當「記者」已經是很糟糕的標籤時,再抓出個人名字來意義好像不大?

A: 對記者個人貼標籤的意義,在於治療心理 deindividuation 症狀,因群體影響會使人感到責任分攤,收到指摘時,會感覺在大組織中匿名或帶著面具,進而失去自覺或自我約束能力。

補充參考資料
台灣醒報張亞萱、王思安以「被批不如NHK 台媒:經營模式是關鍵」為題,訪問幾家媒體主管與學者。華視林淑卿自我感覺良好,自認堅守媒體素養。八大程禹杰認為媒體呈現方式反應市場現況。中視曾喜松卻認為大多數觀眾喜歡客觀理性報導。台大教授張錦華居然認為可以透過媒體機構考核、訓練來把關記者素質。

這就是我所謂的集體迷思,從學界到媒體各家各說各話,缺乏自覺。

另不更改內文邏輯前提下,增加連結爛四格__興趣荒謬大觀如果可以當克林伊斯威特,誰願意當麥可貝?嚇西嚇景

2011-03-26 17:30 更新
新增 arashit100 所製作的短片『回家都會看到台灣「報導核爆」危機 中文悲劇版 』於文章開頭。

「利益揭露: 本文英文書籍連接使用 Amazon Associates Program.」

空有專業但文化素養不足的新社會,彷彿高解析度黑白相機,辨識不出專業外的彩色多元文化。許多意見所操語言常是過度化約的符號,慣常用公眾媒體舞臺發洩其憤怒與暴力。

傳統質報的功能式微,越來越多的言論與引述來自網路,你可以看到不止廉價網路媒體如此,聯合報、自由時報、蘋果日報無一不將 PTT 發言視為羣眾輿論。

雖然傳統媒體大量採用網路資訊,卻無法依據傳統網路禮儀「發文引用出處」。往日,即便是最無恥的網路小白,打口水戰時也會逐行引用來駁斥反方論點,無論是非對錯,至少有脈絡可尋。

此外現今傳統媒體已經早已失去其風骨,與網路內容相對缺乏競爭能力,爲了生存,置入行銷非不得已,爲了銷量,採取政治立場理所當然。娛樂讀者是唯一爭奪注意力的辦法,編輯引言盡可能譁眾取寵,記者老以斷章取義切除脈絡的隻字片語搧風點火,最好是拿到兩造爭鋒相對的爭論。

高流量低密度的資訊流,遠遠超過人們可以消化處理的份量,只剩下感官刺激與對立衝突的亢奮。鮮少讀者對枯燥的第一手深入報導感到興趣。

鄉民取笑「國外研究」結果,但卻無人要求新聞該具名書寫研究來源,沒有人對於缺少 Youtube 連結的有趣影片介紹感到惱怒。即便李家同教授老被媒體加油添醋的,遭見獵心喜的「社會運動者」藉機人格抹滅,也不表抗議。

這全然是Neil Postman 所說的娛樂至死:追求表象、歡笑和激情的電視時代 (Amusing Ourselves to Death: Public Discourse in the Age of Show Business) 吧。許多的傳統媒體讀者缺乏基本媒體素養,更別說深度思考與查證的能力。

見國內廢死、反廢死之爭,令人恐懼的不是反廢死假定廢除死刑後的治安敗壞,更不是受害者的權益消失,也不是正義不在。而是輿論操作者,將不同價值觀念的雙方陣營畫為敵我,用情緒化表述風格激化討論,將論點差異無限擴大成人格否定。

他們所謂的「改變社會」,更像是鼓動情緒、操弄民心的眾愚政治,他們甚至告訴你,追求正義就是動用你的滑鼠點「讚」。

這種便宜形式的懶人行動主義 (Slacktivism)不該是你參與社會改變的方法,至少在你花時間理解雙方論述之前。

最近,由於法務部一日處決五名死刑犯,隨即受到德國政府與歐盟的外交壓力。據此,黃瑞明教授於 2011/03/08 發表社論「痛恨死刑? 德國推廢死的底細」引述了《華盛頓郵報》記者 Charles Lane 於 2005 發表的 The Paradoxes of a Death Penalty Stance,說德國基本法102 條 「死刑業經廢止。」是為納粹脫罪的立法案。黃教授甚至說

我們如果問德國人這個規定的由來,答案一定是:當年的制憲者因為納粹的殺人罪孽深重,所以決心要廢除死刑,從此維護人權尊嚴。

當你看到爭論中出現「一定」這種絕對詞,這絕對是假論述。;-)

黃教授身為德國杜賓根大學法學博士,引用的卻是華盛頓郵報的二手報導,而不是報導中的原始來源 Richard J. EvansRituals of Retribution: Capital Punishment in Germany, 1600-1987 一書,更不是德國的法律歷史權威,從其學術地位來看這份發言,總覺粗糙草率。

隔日就有居台德國人 Günter Whittome 投稿回應德廢死民意 非天上掉下來的,指稱黃瑞明教授「選擇歷史片段的方式來摧毀廢除死刑的正當性」。Günter 在文中為黃教授補充了其刻意忽略的德國百年廢死歷史。

黃教授除了整個抹去德國左派在廢死上得努力,也忽視 Konrad Adenauer 是受納粹迫害的受害者,說「總理艾德諾立刻就要求美國占領軍指揮官釋放死刑定讞的納粹分子」,彷彿 Konrad Adenauer 也是納粹份子一般。

其實 The Paradoxes of a Death Penalty Stance 一文,早以另有評論,現任教於德國 Düsseldorf Heinrich-Heine University 的助理教授 Andrew Hammel 在 2007 年即發表一文 Why Did Germany Abolish the Death Penalty? 這則論述試著剖析 Charles Lane 的立場,並指出德國基本法對於聯軍軍事法庭的判決影響微乎其微,其下的回應也指出,德國通過廢死更多是去納粹的結果。

這與另外一位同名律師 (黃瑞明, 民間司改會董事)所言 (一位留德律師看德國廢死經驗) 接近

德國廢止死刑始自1949年通過之《基本法》,102條簡要宣示「死刑廢除」,當時德國戰後百廢待舉,廢止死刑並非本於全國民意之共識,而是《基本法》之立法者鑑於納粹時代在全民狂熱氣氛之下,死刑被過度濫用之反省,並以「廢死」作為德國走出法西斯政權,重建民主的重要宣示。一方面對國家權力加以限制,否認國家有剝奪人民生命之權利,再方面徹底防範「民氣」之濫用導致無可挽回之錯誤。
徵諸今日社會對死刑犯者深惡痛絕之情感,令人回想起在戒嚴時代對搶劫犯,以速審速決方式執行死刑之作法,在當時亦獲得輿論廣泛支持,而今思之誠屬過度,但已無法挽回。

先進國家廢死的原因常是自覺人心、民氣的無法掌握,這種民氣狂熱與臺灣當下的廢死討論氣氛頗為雷同,但人類未經過當代災難,實難以從歷史中學習。Andrew Hammel 於去年出版一書 Ending the Death Penalty: The European Experience in Global Perspective,或可帶給國內民眾更完整的脈絡與觀念。

個人認為真正的公義與正義,來自公民對於良知、道德、知識、智慧的理解與追求,而不光只是捐獻你的熱血成為別人的政治資本。根據國立臺灣師範大學黃惠萍教授的沉默螺旋理論研究 (A cross-cultural test of the spiral of silence. International Journal of Public Opinion Research),臺灣人比美國人更屬於集體主義社會,人們更擔心保持不同意見會遭到孤立,而不敢公開保持不同立場,少數派因此被消音。

在你停止輕易認同別人的正義,以自己的方式全面理解所謂正義前,你是否有勇氣不靠邊站 ?

此文八成招風惹草,關閉留言只開 Trackback

經過幾年發展,DBus 已經取代早年 Linux 桌面環境所用的 GNOME Bonobo, KDE DCOP,用於許多應用程式,成為主流 IPC 系統。隨著軟體原件逐漸成熟,眾多程式語言都已經支援 DBus APIs,DBus daemon 的 footprint 也逐漸能夠被嵌入式所接受,而被行動裝置作業系統如 MeeGo, WebOS 所採用。

Linux 開發者難免因爲介接需求,需要測試或使用 DBus 除錯。這裡分享幾個常用的小技巧。DBus 使用物件導向的 API 界面,所有 ServicesObject 函式都是以 Method, Signals, Properties 的概念揭露給外界存取,配合 Introspectable API,很容易讓第三方介接。

最常用到的工具之一是 dbus-send,它可以用來從指令列測試接傳 DBus messages,像是列出系統上所有註冊在 Session BusServices

$ dbus-send --session --print-reply --reply-timeout=2000 \
--type=method_call --dest=org.freedesktop.DBus /org/freedesktop/DBus  \
org.freedesktop.DBus.ListActivatableNames

有了 Services 名稱,接下來你就可以用 Service 為名以 Introspection 界面去查詢其所開放之 API,如

$ dbus-send --session --print-reply --reply-timeout=2000 --type=method_call \
--dest=org.gnome.ScreenSaver / org.freedesktop.DBus.Introspectable.Introspect
method return sender=:1.7256 -> dest=:1.7286 reply_serial=2
 string "<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node>
 <interface name="org.freedesktop.DBus.Introspectable">
 <method name="Introspect">
 <arg name="data" direction="out" type="s"/>
 </method>
 </interface>
 <interface name="org.gnome.ScreenSaver">
 <method name="Lock">
 </method>
 <method name="Cycle">
 </method>
 <method name="SimulateUserActivity">
 </method>
 <method name="Inhibit">
 <arg name="application_name" direction="in" type="s"/>
 <arg name="reason" direction="in" type="s"/>
 <arg name="cookie" direction="out" type="u"/>
 </method>
 <method name="UnInhibit">
 <arg name="cookie" direction="in" type="u"/>
 </method>
 <method name="GetInhibitors">
 <arg name="list" direction="out" type="as"/>
 </method>
 <method name="Throttle">
 <arg name="application_name" direction="in" type="s"/>
 <arg name="reason" direction="in" type="s"/>
 <arg name="cookie" direction="out" type="u"/>
 </method>
 <method name="UnThrottle">
 <arg name="cookie" direction="in" type="u"/>
 </method>
 <method name="GetActive">
 <arg name="value" direction="out" type="b"/>
 </method>
 <method name="GetActiveTime">
 <arg name="seconds" direction="out" type="u"/>
 </method>
 <method name="SetActive">
 <arg name="value" direction="in" type="b"/>
 </method>
 <method name="ShowMessage">
 <arg name="summary" direction="in" type="s"/>
 <arg name="body" direction="in" type="s"/>
 <arg name="icon" direction="in" type="s"/>
 </method>
 <signal name="ActiveChanged">
 <arg name="new_value" type="b"/>
 </signal>
 </interface>
</node>
"
$ dbus-send --session --print-reply --reply-timeout=2000 \
--type=method_call --dest=org.gnome.Tomboy \
/org/gnome/Tomboy/RemoteControl org.freedesktop.DBus.Introspectable.Introspect

 string "<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<!-- NDesk.DBus 0.6.0 -->
<node>
 <interface name="org.freedesktop.DBus.Introspectable">
 <method name="Introspect">
 <arg name="data" direction="out" type="s" />
 </method>
 </interface>
 <interface name="org.gnome.Tomboy.RemoteControl">
 <method name="Version">
 <arg name="ret" direction="out" type="s" />
 </method>
 <method name="DisplayNote">
 <arg name="uri" direction="in" type="s" />
 <arg name="ret" direction="out" type="b" />
 </method>
 <method name="HideNote">
 <arg name="uri" direction="in" type="s" />
 <arg name="ret" direction="out" type="b" />
 </method>
 <method name="DisplayNoteWithSearch">
 <arg name="uri" direction="in" type="s" />
 <arg name="search" direction="in" type="s" />
 <arg name="ret" direction="out" type="b" />
 </method>
 <method name="FindNote">
 <arg name="linked_title" direction="in" type="s" />
 <arg name="ret" direction="out" type="s" />
 </method>
 <method name="FindStartHereNote">
 <arg name="ret" direction="out" type="s" />
 </method>
 <method name="CreateNote">
 <arg name="ret" direction="out" type="s" />
 </method>
 <method name="CreateNamedNote">
 <arg name="linked_title" direction="in" type="s" />
 <arg name="ret" direction="out" type="s" />
 </method>
 <method name="CreateNamedNoteWithUri">
 <arg name="linked_title" direction="in" type="s" />
 <arg name="uri" direction="in" type="s" />
 <arg name="ret" direction="out" type="s" />
 </method>
 <method name="DeleteNote">
 <arg name="uri" direction="in" type="s" />
 <arg name="ret" direction="out" type="b" />
 </method>
 <method name="DisplaySearch" />
 <method name="DisplaySearchWithText">
 <arg name="search_text" direction="in" type="s" />
 </method>
 <method name="NoteExists">
 <arg name="uri" direction="in" type="s" />
 <arg name="ret" direction="out" type="b" />
 </method>
 <method name="ListAllNotes">
 <arg name="ret" direction="out" type="as" />
 </method>
 <method name="GetNoteContents">
 <arg name="uri" direction="in" type="s" />
 <arg name="ret" direction="out" type="s" />
 </method>
 <method name="GetNoteTitle">
 <arg name="uri" direction="in" type="s" />
 <arg name="ret" direction="out" type="s" />
 </method>
 <method name="GetNoteCreateDate">
 <arg name="uri" direction="in" type="s" />
 <arg name="ret" direction="out" type="x" />
 </method>
 <method name="GetNoteChangeDate">
 <arg name="uri" direction="in" type="s" />
 <arg name="ret" direction="out" type="x" />
 </method>
 <method name="GetNoteContentsXml">
 <arg name="uri" direction="in" type="s" />
 <arg name="ret" direction="out" type="s" />
 </method>
 <method name="GetNoteCompleteXml">
 <arg name="uri" direction="in" type="s" />
 <arg name="ret" direction="out" type="s" />
 </method>
 <method name="SetNoteContents">
 <arg name="uri" direction="in" type="s" />
 <arg name="text_contents" direction="in" type="s" />
 <arg name="ret" direction="out" type="b" />
 </method>
 <method name="SetNoteContentsXml">
 <arg name="uri" direction="in" type="s" />
 <arg name="xml_contents" direction="in" type="s" />
 <arg name="ret" direction="out" type="b" />
 </method>
 <method name="SetNoteCompleteXml">
 <arg name="uri" direction="in" type="s" />
 <arg name="xml_contents" direction="in" type="s" />
 <arg name="ret" direction="out" type="b" />
 </method>
 <method name="GetTagsForNote">
 <arg name="uri" direction="in" type="s" />
 <arg name="ret" direction="out" type="as" />
 </method>
 <method name="AddTagToNote">
 <arg name="uri" direction="in" type="s" />
 <arg name="tag_name" direction="in" type="s" />
 <arg name="ret" direction="out" type="b" />
 </method>
 <method name="RemoveTagFromNote">
 <arg name="uri" direction="in" type="s" />
 <arg name="tag_name" direction="in" type="s" />
 <arg name="ret" direction="out" type="b" />
 </method>
 <method name="GetAllNotesWithTag">
 <arg name="tag_name" direction="in" type="s" />
 <arg name="ret" direction="out" type="as" />
 </method>
 <method name="GetNotebookForNote">
 <arg name="uri" direction="in" type="s" />
 <arg name="ret" direction="out" type="s" />
 </method>
 <method name="AddNoteToNotebook">
 <arg name="uri" direction="in" type="s" />
 <arg name="notebook_name" direction="in" type="s" />
 <arg name="ret" direction="out" type="b" />
 </method>
 <method name="GetAllNotesInNotebook">
 <arg name="notebook_name" direction="in" type="s" />
 <arg name="ret" direction="out" type="as" />
 </method>
 <method name="AddNotebook">
 <arg name="notebook_name" direction="in" type="s" />
 <arg name="ret" direction="out" type="b" />
 </method>
 <method name="SearchNotes">
 <arg name="query" direction="in" type="s" />
 <arg name="case_sensitive" direction="in" type="b" />
 <arg name="ret" direction="out" type="as" />
 </method>
 <signal name="NoteDeleted">
 <arg name="uri" direction="out" type="s" />
 <arg name="title" direction="out" type="s" />
 </signal>
 <signal name="NoteAdded">
 <arg name="uri" direction="out" type="s" />
 </signal>
 <signal name="NoteSaved">
 <arg name="uri" direction="out" type="s" />
 </signal>
 </interface>
</node>"

注意其中 object name 因各 Service 定義不同,首次查詢可從 / 開始查,Dbus 會答覆其子路徑。

有了 API 界面之後,就可以直接用 dbus-send 送些指令給這些 Services 啦。如下啟動螢幕保護程式。

dbus-send --session --dest=org.gnome.ScreenSaver \
--type=method_call --print-reply --reply-timeout=20000 \
/ org.gnome.ScreenSaver.SetActive boolean:true

參數的格式可參考 DBus 規格中的 Type Signatures

如果你是在 Desktop 環境想查詢測試 DBus APIs, 比較容易的工具是使用 d-feet,這是 Python/GTK 所寫的工具,只消滑鼠點點就可以查詢各種 API 與送出指令訊息。(以下圖片出自 d-feet)

知道了基本的測試工具後,測試期間通常需要觀測訊息的傳送與反應是否正確,此時可以利用 dbus-monitor。它可以用來監測系統中所有的 Dbus messages,方便查詢軟體是否運作正常。

由於安全性的考量,dbus-monitor 預設只能監錄 Session Bus 中的訊息,意即在每個 Login session 中使用者所開啟的軟體。至於 System Bus,像是 Network Manager 等預設是無法存取的,這是避免惡意軟體竊取隱私,如密碼等資訊。

必須手動開啟權限,設定方法是更改以下設定檔,開啟 eavesdrop policy,並重啟 Dbus daemon. 這樣才能竊聽相關通訊。

cat > /etc/dbus-1/system-local.conf
<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
 "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>

  <policy context="default">
    <!-- All messages may be received by default -->
    <allow receive_requested_reply="false" receive_type="method_call" eavesdrop="true"/>
    <allow receive_requested_reply="false" receive_type="method_return" eavesdrop="true"/>
    <allow receive_requested_reply="false" receive_type="error" eavesdrop="true"/>
    <allow receive_requested_reply="false" receive_type="signal" eavesdrop="true"/>
    <allow eavesdrop="true"/>
  </policy>
  <policy user="root">
      <allow send_destination="*" eavesdrop="true"/>
      <allow receive_sender="*" eavesdrop="true"/>
  </policy>
</busconfig>

詳盡資訊請參考

你以為「星巴克救了我一命」是一本勵志書籍,告訴你一位國際廣告公司高階主管的人生從頭再來過的生命體認。這不失為相當有娛樂性的故事,文字可以很舒暢的一口氣讀完,適合坐在美式連鎖速食店,一邊「享受」美國文化,一邊打發時間。

文中相當戲劇化的重現作者從布爾喬亞 (Bourgeoisie) 到波希米亞 (Bohemianism)的身份轉換,強調失去這些階級關係,失去特權,仍掩蓋不了舉手投足的微微貴族習慣,失業時,仍要享受一杯數美元的拿鐵與親切的招呼,即使只是一位服務員,依然有工作狂情節,願意「全面配合」Starbucks 排班需求。

但是其試圖製造的反差情節,不免令人感到突兀。文中不時穿插夢幻般的作者個人歷史經驗,像是英國女皇、拳王阿里、足踏數千美元皮鞋同學等等角色的交往故事,對比其從備受保護的上層階級變成與有色人種一起成為「夥伴」,最擅長的工作是清潔洗手間。從出門搭小黃、公司專車接送,變成長達 1.5 小時的大眾運輸通勤時間,失去住所,住在鐵路邊廉價套房。

彷彿如此,人們就會忘記 Starbucks 的偽波希米亞歷史。

文中多次強調對於員工的健保福利制度,絲毫忽略 Starbucks 打壓美國當地公會,似乎也沒有人記得連鎖速食業對於低階勞工的壓榨,公司在經營順利時稱呼你「夥伴」,號稱夥伴間人人平等,「夥伴們與客人們似乎都心照不宣的同意,每個人都應該獲得尊重與尊嚴的對待。」但在 2008 年過度擴張時,就一次讓數千人回家吃自己 (Why Starbucks is hitting the wall – Postcards – Fortune on CNNMoney.com, Starbucks to close 600 stores)。

這即是星巴克實踐其高調公司聲明的方式。對於員工如此,更別說位在咖啡產業更底層的農工。在華麗的行銷包裝之下,你應該多瞭解一些

勞力剝削未解決 咖啡工業須正視公平貿易
本周星巴克又要發表新的咖啡產品了,然而老議題也再度引起質疑,因為這個新產品並非實行公平貿易。當前經濟正在恢復,而咖啡的銷售也在成長,星巴克是否可 以聽到消費者的需求提供公平貿易咖啡呢?即便是僅次於石油,全球第二有價值的商品,眾所皆知的是這個光鮮亮麗的符號背後充滿人力販賣以及勞力剝削等問題。 在中南美洲及非洲的種植園中,勞工們時常被強迫採收咖啡豆並將其烘乾,不但得長時間工作且無任何報酬,這也是為何一般小農無法跟這種小成本大收成的企業競 爭。然而,這些事情並非僅在這幾個地方發生。若要打擊這個巨大的咖啡工業,除了拒買之外,還得正視奴役、人口販賣、勞力剝削等問題,進而提倡公平貿易認證 制度,讓從事生產的勞工能夠取得應有的薪資,保護小型農業,剔除以剝削、童工等不公平手段的大型企業。

Source: 破報 蔡雨辰 (Starbucks Ignores Customer Demands for More Fair Trade Coffee)

文中不時提到「社區參與」,意即融入當地社會,認識每一位上門的顧客。作為一個成功的全球化企業,2009 年重啟爐竈後,星巴克非常成功的融入各地社會

星巴克統治世界的最新邪惡計畫
星巴克咖啡帝國目前正偷偷進行最新的企業政策,將「星巴克」咖啡店重新命名或去名,將不同地區不同店家冠上更為在地化的店名。以倫敦市中心為例,當 地161間咖啡館以價格打落星巴克,且當地逐漸關注當地化咖啡館的收益,星巴克原本在此已然退居劣勢。他們目前已採取可口可樂及麥當勞等在地化運作模式, 在金融海嘯中試圖扭轉頹勢,如華盛頓的「十五大道咖啡館」便是星巴克模仿當地咖啡館的身影。就在「十五大道咖啡館」一旁的西雅圖餐館即控訴星巴克幾乎完全 模仿他的裝潢,連掛在店內的黑板都幾乎一模一樣。(如果跨國企業可以這樣搞,那台灣的咖啡店也來模仿星巴克,看是否會被告侵權吧。

Source: 破報 陳佩甄 (When is a Starbucks not a Starbucks?, Starbucks’ Latest Evil Plan to Take Over (More) of the World)

讀了幾篇中文讀書心得,居然一面倒的讚揚 Starbucks 文化。卻沒有人讀出實際更可能是晚年遭開除、外遇、離婚、破產的前廣告寫手,成功再次以故事型塑 Starbucks 的企業形象,挽回自己瀕臨可危的事業。這將是一場完美的置入行銷。統一集團高階主管在書面上的聯名推薦,已經預測了一切,相信這部由 Tom Hanks 監製主演的改編電影上市時,Starbucks 必定再次門庭若市,Michael Gates Gill 也將再次坐回高級白種人的貴族階級。

住處臺師大一帶,光羅斯福路三段、二段上每個捷運站各有一家 Starbucks,今年 Starbucks 甚至進入師大路取代了政大書城。由衷的希望,師大路一帶各有特色的小咖啡店能夠繼續順利營業。

很久一段時間沒有寫 blog,Wordpress 也跟著年久失修。順手升級到 WordPress 3.0.5 後,發現網頁載入時間長達五、六秒。緩慢的 wordpress 除了翻資料很慢,也很可能被搜尋引擎降級

於是乎,翻出 Firebug, YSlow, Page Speed 出來診斷一番。主要有幾個問題

  • WordPress PHP 網頁產生很慢
  • WordPress 用了太多 js/css file, 瀏覽器要抓超過十個檔案
  • 靜態檔案沒有作 cache control

首先是 WordPress 生頁面超過一秒,這顯然是因爲資料庫太慢的緣故。目前 Blog 跑在某臺稍微有點負載的機器,MySQL 的速度頗慢,調查了一下 WordPress 的快取模組如 Super Cache 等,最後選裝了 Hyper Cache

至於 WordPress 用了一堆 js/css ,偷懶的方法則是裝 WP Minify,它整合了 Minify。簡單講就是把 js/css 程式碼合併在一起,移掉註解並壓縮起來,所以原本超過十個 Http Request 會被簡化成 2 個 (CSS, Javascript)。如果你像我一樣在 UserDir 中裝 wordpress,要關掉設定中的 Automatically set your Minify base per siteurl setting,並手動在 wp-minify/min/config.php 中設定 $min_documentRoot 參數。

若網站除了 WordPress 外,還有其他網站,Google 也出了一套 mod_pagespeed,可以在 Apache2 模組中動態修改輸出的 CSS/Script 檔案。

至於最後一項靜態檔案的 Cache control,則把 mod_expires 開起來,時間設一設就搞定了。

其他還可以做的除了把機器搬到快一點的網路或檔案丟到 CDN 上外。還可以用 HeadJS Loader (HeadJS) 讓舊款不會卡在逐一載入 Javascript 的程序上。也可以裝 jQuery Image Lazy Load 讓網頁先顯示,再慢慢下載圖片。

參考資料

遠端測試工具

閱聞 tsung 分享的Debian / Ubuntu Linux 空間釋放 – 清除沒用的檔案一文,也來分享一下自己清理作業系統環境的方法。

自己是 Debian GNU/Linux 的長年使用者。Debian 使用者有個習慣,由於系統實在太穩定,裝好之後終年難得重灌,久而久之系統就會留下徒然佔用空間的廢棄檔案。這些檔案除了使用者個人資料外,不外乎快取、歷史記錄、設定等等,此外就是曾經安裝、編譯軟體時所裝的開發函式庫。這裡分享幾個常用的清理檔案方法。

Personal data

最後是個人檔案,你有許多目錄,需要先找出最佔用磁碟空間的目錄,你可以透過指令列用 du 來看 disk usage. 常用的參數會像如下

du --max-depth=1 -x | sort -n

這個指令的意思是查詢當下目錄所佔用的大小,並依照小到大排列,-x 的意思是只查詢一個檔案系統,方便你找出單一檔案系統中最大的目錄。你也可以用 -h 讓 du 列出易讀格式

如果你不是 geek, 我推薦使用 baobao,圖形化操作界面,加上磁碟佔用派圖,很容易抓出佔用最多空間的檔案。KDE 使用者可以用 Filelight

Image source: Disk Usage Analyzer by Fabio Marzocca

依照我個人而言,佔用最多空間的往往是電子郵件,信件中常常夾了簡報檔、文件等等。如果已經歸檔結案,我常常會把夾檔刪掉,只留下郵件本文存檔。若你用 Evolution,我推薦自己寫得 evolution-remove-attachments

apt-tools cache

從最簡單的系統安裝設定開始,系統就已經裝了許多你用不著得檔案。第一個常見的就是各國語系的說明文件與翻譯,決大多數使用者從來不會去看其他語言的文件,像是我從來沒讀過法文、甚至日文、韓文的 man pages,也不會使用這些語系的使用界面。而大部分軟體因為國際化的關係,往往裝了數國翻譯,如果是 OpenOffice 或 GNOME, KDE 這些大型軟體計劃,佔用的空間還不少呢。你可以安裝 localepurge 來移除不需要的語系。第一次安裝時,系統會問你要保留哪些語系,回答過一次,未來每次透過 apt/aptitude 安裝套件時,它都會自動清理一次。

下載後的 deb 安裝檔常常也佔用很大空間,特別是 OpenOffice, Xorg, kernel 等等,如果你常常升級系統,不知不覺系統就會存下很多暫存的 deb 安裝檔。你可以用 apt-get 來清除它們。

# apt-get autoclean
# apt-get clean

其中 autoclean 是清掉舊版的 deb,系統會保留一份最新版本安裝檔。我個人都使用 autoclean,以免發生意外的時候,沒有最新版本的 deb 檔可以重新裝。一般使用者可以直接以 clean 清除快取。

apt-tools dependency

使用 Linux 時,或多或少會自己編譯一些軟體,需要編譯軟體時,就會需要相關的函式庫。但常常裝完砍掉後,這些相關的開發函式庫還留在系統中變成軟體孤兒。

你除了應該儘量用 apt-get autoremove 或 aptitude 外,也可以用 deborphan 來找軟體孤兒。最常見 (也很危險) 的用法是

# aptitude remove $(deborphan --nice-mode --guess-all)

這樣deborphan 會推估所有系統中不需要的程式,並全部移除。你也可以用以下指令找出最佔用空間的套件。

$ deborphan -a -n|sort -n

懶惰的話,你也可裝 gtkorphan,以圖形化界面管理。

bleachbit (ccleaner for Linux)

雖然新的 Linux 軟體,已經逐漸使用 .local .cache, .config 等目錄設定方式,但是還是有許多軟體會把快取存在 .config 或自己的目錄中,像是 .gnome2, .firefox 等。結果是使用者很難找到快取檔案,若使用 UbuntuOne, Dropbox 等等雲端備份工具,常常連不重要的快取都一起備份了,費時費錢。

上述或指令或工具,看似十分繁複,而且只能管理系統檔案。從 Windows 跳船過來的使用者一定想,是否有類似 CCleaner 的工具,點一點就可以把垃圾檔案清乾淨?

你可以使用 BleachBit (跨平臺),BleachBit 設計了一套相當有彈性的設定描述語言 – CleanerML,支援了許多常見軟體的清除功能,非常類似 CCleaner,軟體會自動偵測可清楚的軟體列表,只消點選要清除的檔案類型,BleachBit 就會自動刪除並計算所騰出空間。沒有 X 圖形界面時,也可以用 bleachbit_cli 指令列。

References

如果你很 Geek, 可以參考 Ubuntu Wiki 上的 Reducing Disk Footprint,上面分享了許多縮減系統大小的奇技淫巧。

另外 Ubuntu 正有計劃要削減安裝光碟大小,未來也會影響系統安裝後的大小。