2012/02/14

為什麼上廁所要躲起來,吃飯卻可以正大光明地吃?


梁文道在介紹「廁神.廁所的文明史」這本書中,提到十七世紀時的法國國王「太陽王」路易十四,會邀請群臣們觀賞他上廁所。能夠享有這項殊榮可不是人人有獎,不是親近路易十四的王公貴族,就是得花了上萬元的法朗金幣,才有這份榮幸觀賞陛下露出尊貴的屁股坐馬桶,而陛下會在坐馬桶時與圍繞在一旁的大臣們共商國是。

從路易十四的故事,我懷疑「上廁所必須躲起來」這觀念,是最近這二百多年才建立起來。在現在,就算是親如家人、夫妻,你也不太可能會想讓對方觀賞自己出恭。就算你興奮地邀請伴侶「要不要看我表演上廁所?」對方十之八九也可能會回「神經病」。

有人懷疑這可能只是路易十四獨自擁有的癖好,但從王公貴族們也踴躍報名,看來並不是國王一人沒有隱私觀念,國王身邊的人也一樣沒有隱私觀念。之前讀「孤獨的性.手淫文化史」中也曾提到,隱私的觀念是十八世紀啟蒙運動後才漸漸建立起來的。我們回想一下,一些前現代遺留下來的有兩百多年的建築,屋內的隔間就是沒隱私權的觀念:由於沒有走廊,當你要進爺爺房間時,你還得要穿過哥哥的房間、爸媽的房間、丈母娘的房間。他們不能將房門鎖起來,不然爺爺就出不了房門了。

若你對一個前現代的人說「我想要一點隱私空間」,他們會無法理解「你又不是幹什麼作奸犯科之事,為什麼要躲起來猥猥瑣瑣?」「是沒錯,撒尿、拉屎之事凡人皆會有,但我不想被別人看到」「我不懂,你的屎尿、你的身體跟其他人有何不同?為何要害羞怕被別人看?」

大陸鄉下某些地方,到現在仍然廁所沒有門。我媽媽說這是因為文革時怕有人躲在廁所幹壞事,所以要把門拆掉。但我懷疑並不是文革造成的,而是「上廁所要躲起來」這觀念在中國也是最近這幾十年才漸漸建立的。很多人常抱怨家中長輩上廁所不關門。想想看我們自己小時候,上小學校的時候,為什麼明明學校有廁所,仍然要憋著大便回到家再上?並不是學校的廁所太骯髒,而是當你一進廁所關起門來蹲馬桶,就有某位好管閒事的同學大喊「某某某在大便!」吆喝一群同伙去圍觀,甚至有人爬上牆壁偷看上廁所,這種現象一直到了上五六年級依然存在。上廁所必須躲起來,不只是一種文明規訓、社會建構,看來對文明社會的小孩子,也是長大後才形成的觀念。


「上廁所要躲起來」這觀念也不是一蹴可及,我認為還得先經過兩個階段:把屎尿看做污穢、把廁所從生活空間隔離出來,最後才能學到「上廁所要躲起來」。

把屎尿看做污穢,這件事並非人的天生本能,對小孩子來說是須要後天學習的。佛洛伊德說小孩子在二歲到四歲會經歷一段「肛慾期」,小孩子會將自己排泄出來的糞便「視為己出」,想像成是自己生產出來的「寶寶」。停留在肛欲期不成熟的小孩會過度忍住肛門,造成便秘;或是把玩糞便,將床褥弄髒。直到他學會拋棄糞便,視糞便為污穢,他就成熟了,並脫離這一時期。竇文濤曾經在「鏘鏘三人行」中聊到,他小時候愛玩的遊戲是,撒尿在沙土上,沙土被浸溼成尿泥,他就可以把尿泥當做黏土,塑造成動物形狀。而我跟媽媽提起此事,媽媽說她小時候的男生們,也會這樣玩。但女生們覺得很髒,都不會靠近。看來把玩尿泥並不是竇文濤所獨有,而是那一輩共同記憶。

我們常說「生活不外乎是『吃喝拉撒睡』」,既然拉屎撒尿都是生活的一部份,為何我們須要將廁所從生活空間隔離出來?為何要蓋另外一個獨立的房間做這件事?為何我們不能直接拉屎在書桌下的垃圾桶?垃圾與屎尿同樣都是髒的,那為何我們可以暫存垃圾在我們的臥室內,卻不能暫存屎尿?中國古代雖然在屋外建有茅廁,但在房內另會準備便桶、尿壺,那時代的人並不覺得在臥室上廁所有何髒。

在「廁神.廁所文明史」一書中有記載,法蘭西王儲因為厭惡了貴族在聖.日耳曼宮內隨處大小便造成宮內臭氣沖天,於1606年8月頒佈諭令,「嚴禁在宮內大小便,如果是在自攜的便桶內拉屎則不在此限」。但先破壞了這道禁令,不是別人,而是他自己,他在自己的臥室牆壁上撒尿。而這諭令也形同虛設,無人遵守。

下次看到小狗在自己的房間內亂便便,先別發怒。畢竟人類也是經過了幾百年的摸索才學到「上廁所要到房間外上」,更何況是才幾歲大的小狗呢?

最後講到「上廁所要躲起來」,這可能是為了避免暴露性器官等私密部位,所以必須要躲起來。但有沒有想過,為何女子更衣室並不是每人一個密閉的房間,而是同性別的人一同更衣。雖然說換衣服不太會暴露性器官,所以不須要給每個人私密空間,但上廁所若是著裙子、洋裝,也不太會露出性器官啊?

上廁所要躲起來,不只是要遮掩私密部位,更是為了視覺上的乾淨。我們覺得糞便骯髒,所以連帶得覺得蹲馬桶這動作也骯髒,我們為了顧及他人視覺上的感受,所以要躲起來上廁所。但最後,「上廁所」這件事被我們內化為一件羞恥的行為,我們會因為上廁所被人看到會而感到害羞。

但到最後,我們甚至連「蹲在地上」都視為骯髒的行為,就算我們並沒有真的脫下褲子。香港人看到大陸人因為站累了,所以蹲在地上休息,而恥笑大陸人不文明、像是隨地拉屎。這有沒有可能只是一種維多利亞式的虛偽?

2012/01/22

[python] 鳳凰網站自動抓視頻

檢視html 原始碼,是看不出任何mp4或flv的link。
經過Firefox CacheViewer以及 Firefox Video Download Helper調查,原理大致如下:
它是先餵給 flash player 一組 guid 號碼。 flash player 依此guid下載一份xml檔案,在xml 檔案中有mp4或flv 的 link。

[python]用eyeD3 + xml.dom.minidom 給mp3 自動標名,支援iTunes

毛豆工作室下載下來的「開卷八分鐘」的mp3們,沒有 idv3 的 title,沒有lyrics,把它們放入iTunes再下載到 iPhone的話,這樣不方便。

毛豆工作室有xml 可以下載,先用 xml.dom.minidom 分析取出 fileName + title + description ,之後用 eyeD3 (python 模組) 將mp3 加tag。

總共有一千多個mp3,很難確保第一次就寫程式就OK,保險點是第一步驟的結果先暫存在 txt 檔,之後再讀 txt檔用 eyeD3。或是先對一兩個mp3試驗,之後再擴展之。再者,從xml中抽取出的description裡面有時夾雜不想要的廣告文字或html控制碼,先暫存輸出到txt檔,各別修改之。這樣子做至少比在程式一開始寫時就全盤考慮來得簡單、有效率的多了。現在的text editor的 find/replace都很強大,有regular expression功能,做起來不比用python程式遜色。

這個xml 結構是有兩百多個item,每個item描述每個mp3,每個mp3有 title、description、link等 nodes。
dom1 = xml.dom.minidom.parse('8minsreading_2010.xml')
items = dom1.getElementsByTagName('item')
for item in items:
    title = item.getElementsByTagName('title')[0].\
            firstChild.nodeValue
    link = item.getElementsByTagName('link')[0].\
            firstChild.nodeValue
    fileName = link.split('/')[-1].split('.')[0]
    description = item.getElementsByTagName('description')\
            [0].firstChild.nodeValue


Unicode 簡体中文的問題:第一個問題是python在print到 stdio的時候,簡中會變成亂碼(文字化け),就算用了
sys.stdout = codecs.getwriter('UTF-8')(sys.stdout)
偶爾某些印出還是亂碼,所以不要太在意console output,還是先印出到暫存的 utf-8 text 檔。

第二個問題是 iTunes 用的IDv3 是 eyeD3.ID3_V2_3 ,是UCS-2 little endian,也就是前綴要加上
tag.encoding='\x01'
不保險的話,要對tag的每個frame.encoding都設好
for frame in tag.frames: frame.encoding='\x01'

為了要讓下載到iPhone的mp3,在聆聽時點一下螢幕會出現歌詞。這個mp3必須要加一個tag 叫「UNSYNCED LYRICS」。從foobar2000上看到tag名是 UNSYNCED LYRICS,但其實對eyeD3只要一個簡單的addLyrics即可:
tag.addLyrics(description)

以下python code全文,是邊做邊改邊試的,只是為了一次性工作而做的。你可以取出copy paste對你有幫助的code片段,比如 xml 的讀取,eyeD3 tag的寫入。
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os, sys, codecs, glob, re
import xml.dom.minidom
from xml.dom.minidom import parse
import eyeD3

sys.stdout = codecs.getwriter('UTF-8')(sys.stdout)

def read_xml():
    xmlFileName = '8minsreading_2010.xml'
    dom1 = parse(xmlFileName)

    txtFileName = xmlFileName.split('.')[0] + '.txt'
    fout = codecs.open(txtFileName, mode='w', \
            encoding='utf-8')

    items = dom1.getElementsByTagName('item')
    for item in items:
        title = item.getElementsByTagName('title')[0].\
                firstChild.nodeValue
        link = item.getElementsByTagName('link')[0].\
                firstChild.nodeValue
        fileName = link.split('/')[-1].split('.')[0]
        description = item.getElementsByTagName(\
                'description')[0].firstChild.nodeValue
        description = description.split(' ')[0]
        description = description.strip()
        fout.write(fileName + '\t' + title + '\t' + \
                description + '\n')

    fout.close()

def sum_all():
    pat = re.compile(r'\d\d\d\d\d\d\t')
    table = {}
    txtFiles = ['8minsreading_2011.txt',
            '8minsreading_2010.txt',
            '8minsreading_2009.txt',
            '8minsreading_2008.txt',
            '8minsreading_2007.txt']
    for txtFile in txtFiles:
        fin = codecs.open(txtFile, mode='r',
                encoding='utf-8')
        for line in fin:
            line = line.strip()
            if not line:
                continue
            if pat.match(line):
                comps = line.split('\t')
                fileTitle = comps[0]
                title = comps[1]
                description = ''.join(comps[2:])
                table[fileTitle] = (fileTitle, title,
                        description)
            else:
                (fileTitle, title, description) = \
                        table[fileTitle]
                description += line
                table[fileTitle] = (fileTitle, title,
                        description)
        fin.close()

    fout = codecs.open('all.txt', mode='w',
            encoding='utf-8')
    keys = table.keys()
    keys.sort()
    for k in keys:
        fileTitle, title, description = table[k]
        fout.write( fileTitle+'\t'+ title +'\t'+
                description +'\n' )
    fout.close()

table = {}
fin = codecs.open('all.txt', mode='r', encoding='utf-8')
for line in fin:
    comps = line.split('\t')
    fileTitle, title = comps[0], comps[1]
    description = ''.join(comps[2:])
    table[fileTitle] = (title, description)
fin.close()

mp3Files = glob.glob('*.mp3')
for mp3File in mp3Files:
    fileTitle = mp3File.split('.')[0]
    title, description = table[fileTitle]
    tag = eyeD3.Tag()
    tag.link(mp3File)
    tag.setVersion(eyeD3.ID3_V2_3)
    tag.encoding='\x01'
    tag.setTitle(fileTitle+title )
    tag.setAlbum(u'開卷八分鐘')
    tag.setArtist(u'梁文道')
    tag.addLyrics(description)
    for frame in tag.frames: frame.encoding='\x01'
    tag.update()

2011/10/09

在itunes商店上買非台灣的app

在itunes 上要下載免費的pptv,可是itunes會從你的信用卡號碼判斷出你的region是在台灣,而不是在香港,所以被禁止下載。單純從itunes上切換國別,還是會被信用卡號碼判別出而被禁止。

解決方法:
  1. 要先用gmail申請自己的香港版分身的email帳號,比如說 mikimotoh.HK@gmail.com。
  2. 登出itunes,找pptv,不要用舊帳戶登入,改做新的Apple ID
  3. 填入香港版的email之後,在匯款資訊選None。

2011/09/04

鄉下地方不見得食物便宜

我中午去秀山國小後面新開的「樂壽司」買鰻魚飯,250元的價格,在外頭等了十五分鐘後拿到,我大失所望「怎麼250元只有扁扁一盒,沒有附味噌湯?」

主菜是三片蒲燒鰻,新鮮的青菜很少,細細的幾根蘆筍,其他大部份是醃漬類的菜,比如甜甜的黑豆。還有一個很小份量的沙拉蝦。

250元在東區216巷的宮川,已經可以吃到很豪華的定食了 ,包括:小菜、主食、副主食、茶碗蒸、沙拉、鮭魚味噌湯、甜點。但為何在店面租金比東區更為低廉的台北縣,反倒賣得很窮酸?

我想合理的解釋為,在主婦、學生居多的秀山一帶,大部份人想出的午餐錢大多是在100元以內,所以說60元的便當會比東區的便當更有競爭力,但很少人會想為午餐出個250元。
在上班族、觀光客居多的東區,午餐出的錢從100到300多都有,250元這價位的競爭激烈,多樣化的結果是使得各個價位都能產出CP值的餐點。像樂壽司這般以高檔壽司為主的在延吉街一帶也有,而像宮川以「俗個大碗」這種利基來競爭的也有。

2011/08/14

dystopia of medical hegemony 醫療霸權的反烏托邦

前不久香煙中的健康捐調漲,我曾聽過一些癮君子忿忿不平地說「這個政府所有一切都是為健康,他最終變成一個以健康之名的家父長制」

其實不只是香煙要課徵健保捐。未來可能連不健康的飲食習慣也要課徵健康捐。炸雞薯條因為會讓心血管疾病機率增加,所以要加收健保捐。汽水等含糖飲料因為讓人變肥胖、糖尿病,所以要增收健保捐。可能連不健康的行為也要課徵健康捐,打手機會增加腦瘤風險,久坐辦公室不運動會心血管疾病,熬夜會中風,這些行為都要課徵健康捐。

我們為了要節省健保開支,就從十大死因中的前幾名榜首,癌症、心血管疾病、糖尿病等來下手。不斷尋找會使這幾樣疾病機率增加的所有可能行為、可能因子。 到最後我們會不會變得失去選擇飲食的自由、行為的自由?

健保本身的目的不只是讓人變健康,還延長人的平均壽命。而平均壽命增加,所需的醫療開支就變更多。醫療開支增加,不僅要尋找新的行為來課徵健康捐,還要調漲收入所得中的健保費。如果人類平均壽命沒有極限,可以無限制增長,現在的平均壽命是80歲,60年後變120歲,那麼,會不會超過一個臨界值,我們的社會體制根本無法支撐,最終崩潰?而在崩潰的前一刻,這個所有一切飲食與行為,都訴求健康的世界,會是長什麼樣?


sex worker issues 性交易該不該合法化?

當討論到性交易合法化時,最常見的幾大反對理由是:
  • 物化女性
  • 性病傳播
  • 雛妓
  • 使人為奴
  • 人口販運
  • 黑道從中牟利
「性」這個名詞,給了我們太多迷惑,當我們一看到這字眼時,很難不被我們文化中的道德觀、價值觀所影響。

當同一件行為,使用不同的名詞去稱呼時,會使我們拋棄隱晦的既有價值觀、刻板印象,來重新看事情。如果把性交易換成「前列腺保養」,重新設計這議題,改問「『前列腺保養』這服務產業,該不該合法化?」這時你至少會重新思考,不帶既有的有色眼光來看事情。

 把以上這六大反對理由,重新包裝,重新發問:

  • 『前列腺保養』這服務產業,任用女性護理師,是物化女性嗎?
  • 『前列腺保養』這服務產業,會傳播性病嗎?
  • 『前列腺保養』這服務產業,會傾向任用童工嗎?
  • 『前列腺保養』這服務產業,會刻苛護理師,抽取他們大部份薪水,並禁止他們離職嗎?
  • 『前列腺保養』這服務產業,會勾結人蛇集團從大陸、東南亞運外勞來工作嗎?
  • 『前列腺保養』這服務產業,會給黑道帶來暴利嗎?

從第一題來看的話,這無庸置疑的是否定。如果只要用到女性護理師就是物化女性。那在醫院中,我們找女性護理師幫癱瘓的爺爺包尿布、洗澡,也是物化女性了。

第二題,會不會傳播性病,端看護理師有沒有做好防護措施。有戴好保險套、戴好口交膜,傳播性病的可能性幾乎為零。如果連這也要擔憂,那護士應該拒絕照料AIDS的病人、B型肝炎的病人。

第三題,會否任用童工的爭議,是由勞基法、勞委會幫我們把關。在現實世界,有些血汗醫院以「實習生」、「建教合作」的名義,苛刻對待未成年的護士。他們的付出的勞力跟正職護士相當,但只因他們是「實習生」,拿到的待遇卻不如正職。如果我們連這種「假實習,真童工」的問題都視而不見,那為何只在意『前列腺保養』產業中童工的問題?

 第四題,禁止離職的問題,也是要由勞基法、勞委會來把關。現實世界中,有許多合法公司在員工受雇前,要求他們簽訂綁約條款。以公司的立場來看,員工太頻繁離職,會造成公司遞補人力不足的問題,造成公司的損失,所以要以綁約防止員工頻繁離職。以員工的立場來看,綁約限制了他跳槽的機會。站在仲裁者、勞委會的立場,只要這綁約條款合乎平等互惠,不會讓員工越做越窮,都是可以接受。比如說,綁約一年,員工提前離職,就失去了加薪、領獎金的機會,這種契約看來還合理。若契約是,綁約四年,提前離職要員工倒賠自己六個月的薪水給公司。這樣的合約就絕對不平等互惠。所以,並不是說有綁約,就一定是逼員工為奴,而是程度上的問題。


第五題,人口販運主要令人詬病的問題是,外勞在來台工作前,要先支付仲介公司一筆的仲介費,又簽訂一紙契約,說是要欠仲介商的巨額仲介費的債。當他們來台工作,又從他們每月月薪扣除一大部份,要是要還仲介費的債。抵押他們的證件,防止他們逃亡。利用他們人生地不熟的劣勢,把他們關在擁擠髒亂的宿舍,一天工作十六小時。人口販運的問題,不只是政府部門要嚴格查緝人力仲介公司,與黑心仲介商勾結的雇主,也要嚴格檢視。

第六題,黑道會從這行業牟利嗎? 許多非服務產業,如電子製造業公司,也有黑道在投資,但政府會因為只要這公司的股東中有黑道,就勒令這公司停業嗎?股東犯罪的行為,怎麼能夠跟公司牽扯在一起?公司沒有強制力阻止股東犯罪,也沒有能力阻止。