這本書是壹壹捌天大地大台科大多益990沙暴大家的莘予大神推薦,看了幾頁覺得不錯,回家立馬上網買下來,分上下冊的超級巨頭書,就算不看買來當磚塊也不錯(X
淺白一點來說,背離親緣就是本超級故事書是作者跟許多不同家庭的訪談筆記,訪談家庭的子女落在以下十個面向:聽障、侏儒、唐氏症、自閉症、思覺失調(過去稱精神分裂症)、重度殘障、音樂神童、犯罪、因姦成孕、跨性別。
第一章,作者在書中用了淺顯的分類來展現這樣的關係:由父母而來的「垂直身分」,例如種族、國籍、性別……,另外還有子女由社會而來的「水平身分」,像是罕見疾病、價值觀等,兩者愈不相同,對雙方的衝擊和挑戰也愈強大,書中選出的十項都是這樣兩個身分強烈衝突的例子。
作者訪談的動機,便是想了解這些生下獨特子女的父母,要如何忍受子女的水平身分,與他們的最愛相處;子女又要如何在衝突中建立自己的身分認同。
作者 Andrew Solomon 的TED 演講,也算是本書不錯的導讀:
https://www.ted.com/talks/andrew_solomon_love_no_matter_what
本書中間每章除了每個家庭的故事之外,另外都會加上當代對那些罕病的歷史,現在最新的研究與理解,社會各界各類的看法。最後,都會歸結到,這個群體是否能產生自我身分認同,及相關進行中的運動。
透過作者的文筆和真實訪談的故事,交錯其中艱澀的部分如科技、醫學、心理學,都能輕鬆吸收;社會、文化、政治上的正反爭議也有完整的呈現,這本書不單單是一本訪談錄,而是針對這些罕見病症的完整記錄。其中包含大量正反意見的呈現,種種生命與道德的問題穿插在故事間,就像電車兩難一樣,這樣的問題絕對沒有正確答案,卻能讓我們體見生命和社會的複雜性,以及道德決定之困難。
以下僅節錄一句開始閱讀時,令我覺得讓人印象深刻的句子:某位聽障父親不時會指導他聽障小孩的手語,有人問他為何小孩已經會手語了,還要繼續教?他的回答是:「你的小孩會說英語,但他上學還是要學習英語,持續精進;我小孩的手語比得並不好。」
這句那時留下了深刻的印象,也許跟作者開始訪談時一樣,我們習於把聽障視為一種病症,而將手語視為一種幫助聽障用的<工具>,而工具是會用就好,何需精進?可是如果我們把聽障視為特殊族群,而手語是他們的<語言>和<文化>,說它是工具,不但過於輕視手語,多少有點歧視的意味了;本書就會這樣,不斷去挑戰你的價值觀和想法,從頭開始反思我們對特殊身分的刻板印象。
我無法評斷作者在選文之中是否刻意保留美好部分,儘管故事裡充滿了各種挑戰,各種血淚,在故事的最後,作者都不忘提起「這世界即使如此還是很美」,儘管孩子似乎永遠無法回應父母對他們的愛,父母還是能從中找到愛,從再怎麼不堪的的經歷中找到每天前進的原動力。
我知道有些人很不喜歡所謂「充滿著太多正向能量的作品」,我聽到這個形容詞時,第一個想到的是戴晨志的作品XD,充滿各種奇怪的小故事,從每個故事帶出一個理想的解,照著這個解去做,問題不是就不會發生了嘛?平安無事囉可喜可賀,滿滿正向能量。
當然不是說這樣不好,只是現在看就會覺得很假:世事怎可能如此一帆風順?好吧當這些問題都接踵而來了,這可不是說句「這樣這樣做」就算了呀。
背離親緣裡,每則故事都是事實,大多數它只是述事;書裡並沒有幻想中的「解」存在,就如同唐氏症的母親幻想著不存在的攝子,能夠挑盡60兆細胞中多出來的染色體,一夕之間治好子女的疾病,這就是做不到。
而書中的道德難題,父母何時應該肯定子女、何時該放手讓子女單飛?一個問題問十個人,可能會有二十個答案,我們無意求解,而是在了解的過程中,重塑自己對世界的觀點。
而那些家庭中身分的衝突、內心的煎熬、照護的無耐,解不開也放不下,只能和它共處;到這最後,這些問題將變成他們更美滿人生的一部分,也是從這樣的掙扎、奮鬥,才能看見真正的「正向能量」。
在最後一章,作者書寫自己的故事,透過捐精、代理孕母和種種高科技,他與他的同性伴侶、另外一對女性的同性伴侶和他的某位女性好友,五位家長用遠超過想像的複雜關係(至少我真的沒想過)生了四位子女,他用自身育兒美好的經驗提醒我們,社會的光譜如此寬廣,而接納和包容的力量又是如此偉大。
透過故事,我們能對世界上的差異和多樣更了解一些,並且接納了世界上各種可能性,平心靜氣的面對差異,讓世界更加多元。
前幾天剛到誠品,隨意翻閱了架上的「希特勒回來了」的導讀,他評論在一個走向瘋狂的社會,人類的良知能起多大的作用?很悲觀的,經歷無數的社會學實驗,像是服從權威的電擊實驗、假想監獄實驗,答案是很少、很少,人類天生就是社會裡的動物,個人的良知想反抗社會的前進宛如螳臂擋車一般無望。
但反過來看,這也表示當我們的社會愈堅強、愈能包容異己,瘋狂的個人能造成的影響力也很少、很少,如果我們相信民主、相信開放、相信多樣性,那就拿著他們打造一個更加柔韌的社會,令那些想方設法瓦解我們的邪惡無從見縫插針。
末尾,我想要引用一句,我身邊一位非常重要的人所說的話:「我也無法理解為什麼我會如此堅持?這種堅持毫無理由,但若說世界上有什麼是愛,我想這就是了」本書中的故事再再說明,父母親的愛如海之深,足以抹平世上一切障礙。
這些年看過最令人深思的書,推薦給大家。
2016年7月31日 星期日
2016年7月28日 星期四
(有電)星際爭霸戰-浩瀚無垠Star Trek XIII
上周四新世代Star Trek 的第三部,電影第13部浩瀚無垠終於上映,距離上部電影已經過了三年,這裡還有上集的心得
http://yodalee.blogspot.tw/2013/05/star-trek-xii.html
Beyond 利用船毀人散的方式把組員分成兩人一組,在組間有更多的對話空間,讓觀眾們能和角色互動,畢竟Enterprise 七人一組,全員登場固然必要,但人多嘴雜的情況下,角色的印象就不容易突顯,分成小組下去就能分別展現各人的特色
另外從原設定來看的話,這部也遠比Into Darkness 優秀,這集大致上沒亂改原設定,頂多為了致敬原系列演員,幫Sulu 加了個男友。
與其說這部不亂改,不如說上集實在太不在意原設定,隨意消費一個擁有豐富語言和文化的克林貢人,把航行時間的設定改得亂七八糟,亂玩Khan 梗卻又沒有Star Trek 2: The Wrath of Khan的表現來得好。
隔壁的The Force Awaken 亦同,電影裡沒有解釋這把光劍怎麼來的,但若照原設定,它是The Empire Strike Back 的時候跟著Luke 的手一起掉下去,那隻手後來好像被帝國撿去弄了個Luke 的複製人,還跟Luke 本人幹過架。這要到 Star Wars 8 或 Star Wars 9才會解釋,依 JJ Abrams 拍攝立場來看,他很有可能直接無視這樣的設定,其他像是賜死Han Solo等等,不及備載。
http://yodalee.blogspot.tw/2013/05/star-trek-xii.html
每次都要加防電頁,這一次先來講一些不會電人的東西
比如說:
企業號曲速航行變得更炫了,喔喔看看那個波紋。
企業號又壞了QQ,這個看預告片大概就知道了。
––––真好奇如果沒有重開機的話A到Z夠不夠企業號用 (誤
以下有電,包括本作Beyond,上作Into Darkness,和隔壁的Star Wars: The Force Awaken
不想被電請慎入
這集電影上映前,有人的評論是 Fast and Furious in Space,well,其實不算太糟的評論XD
和前兩部比起來,這部的主要劇情都在地面,星際的內容相對少一點,FF 風格的無槍打鬥、飆車、搖滾樂都沒缺,還有各種喔喔喔差一公分一秒鐘你就死惹的超高難度極限動作。
無疑是部爽片(蓋章,蜂群艦被打爆,配上激烈的搖滾樂,十足的快感。
當然星際的內容也沒有少,另外感謝血汗的特效公司,製作了精美的York Town 基地(Deep Space 9 表示:我輸了QQQQ)雖然基地再精美防禦力好像都沒有隨之提高,我覺得這才是看科幻電影最值的地方:打造一個想像的世界。
儘管現在這是大量的血汗特效堆出來的,但舊系列的模型搭配大腦想像力也能有同樣的效果,但單就科幻這點上我認為Beyond 的科幻值還是滿高的,看著York Town 動畫,連內心都不自覺的激動起來了。
內容的部分,有些負雷認為本片的文戲不足,我並不這麼認為。
企業號曲速航行變得更炫了,喔喔看看那個波紋。
企業號又壞了QQ,這個看預告片大概就知道了。
––––真好奇如果沒有重開機的話A到Z夠不夠企業號用 (誤
以下有電,包括本作Beyond,上作Into Darkness,和隔壁的Star Wars: The Force Awaken
不想被電請慎入
這集電影上映前,有人的評論是 Fast and Furious in Space,well,其實不算太糟的評論XD
和前兩部比起來,這部的主要劇情都在地面,星際的內容相對少一點,FF 風格的無槍打鬥、飆車、搖滾樂都沒缺,還有各種喔喔喔差一公分一秒鐘你就死惹的超高難度極限動作。
無疑是部爽片(蓋章,蜂群艦被打爆,配上激烈的搖滾樂,十足的快感。
當然星際的內容也沒有少,另外感謝血汗的特效公司,製作了精美的York Town 基地(Deep Space 9 表示:我輸了QQQQ)
儘管現在這是大量的血汗特效堆出來的,但舊系列的模型搭配大腦想像力也能有同樣的效果,但單就科幻這點上我認為Beyond 的科幻值還是滿高的,看著York Town 動畫,連內心都不自覺的激動起來了。
內容的部分,有些負雷認為本片的文戲不足,我並不這麼認為。
Beyond 利用船毀人散的方式把組員分成兩人一組,在組間有更多的對話空間,讓觀眾們能和角色互動,畢竟Enterprise 七人一組,全員登場固然必要,但人多嘴雜的情況下,角色的印象就不容易突顯,分成小組下去就能分別展現各人的特色
片中可以從Spock 和McCoy的對談看見Spock內心的掙扎;從Kirk 和Chekov 的冒險看到Chekov 的機靈;Scotty 引入路人Jaylah 跟星艦;被俘虜的Uhura 和Sulu 代入反派角色,看到反派對聯邦那種不尋常的深入了解,自然導入後面的劇情。
如果比較11, 12, 13三集,這部的角色對話反而是最多的,說文戲太少實在不能認同。
若真要說Beyond 是武戲夠了文戲不足,Into Darkness 就是武戲不到位文戲更加單薄,只看到Khan 大發神經鬼吼鬼叫,主要角色除了Kirk, Spock, Uhura 外,其餘幾乎沒有出場機會。
----
這集Kirk 的表現令人激賞,無論是企業號被打爆的處置、擬定反擊方針、奮力拯救基地,都比上兩集沉著穩定,五年任務過了三年,我們的Kirk總算成為優秀的艦長,不像隔壁棚的魯夫練了兩年還是一樣白痴。
Sulu 在片中也有代理艦長的機會,但不知是否導演刻意安排,其實Sulu 代理的時間內沒有做出重大命令,看得出Kirk 和Sulu 的指揮能力仍有差距。
----
如果比較11, 12, 13三集,這部的角色對話反而是最多的,說文戲太少實在不能認同。
若真要說Beyond 是武戲夠了文戲不足,Into Darkness 就是武戲不到位文戲更加單薄,只看到Khan 大發神經鬼吼鬼叫,主要角色除了Kirk, Spock, Uhura 外,其餘幾乎沒有出場機會。
----
這集Kirk 的表現令人激賞,無論是企業號被打爆的處置、擬定反擊方針、奮力拯救基地,都比上兩集沉著穩定,五年任務過了三年,我們的Kirk總算成為優秀的艦長,
Sulu 在片中也有代理艦長的機會,但不知是否導演刻意安排,其實Sulu 代理的時間內沒有做出重大命令,看得出Kirk 和Sulu 的指揮能力仍有差距。
----
另外從原設定來看的話,這部也遠比Into Darkness 優秀,這集大致上沒亂改原設定,頂多為了致敬原系列演員,幫Sulu 加了個男友。
與其說這部不亂改,不如說上集實在太不在意原設定,隨意消費一個擁有豐富語言和文化的克林貢人,把航行時間的設定改得亂七八糟,亂玩Khan 梗卻又沒有Star Trek 2: The Wrath of Khan的表現來得好。
隔壁的The Force Awaken 亦同,電影裡沒有解釋這把光劍怎麼來的,但若照原設定,它是The Empire Strike Back 的時候跟著Luke 的手一起掉下去,那隻手後來好像被帝國撿去弄了個Luke 的複製人,還跟Luke 本人幹過架。這要到 Star Wars 8 或 Star Wars 9才會解釋,依 JJ Abrams 拍攝立場來看,他很有可能直接無視這樣的設定,其他像是賜死Han Solo等等,不及備載。
有時覺得JJ Abrams 根本原作粉碎機。
----
----
若要列缺點的話,我不滿意的大致有下列幾項:
音樂表現不足:和Star Wars: The Force Awaken 一樣,並沒有特別令人印象深刻的配樂,除了預告片使用的片尾曲 Sledgehammer,大部分仍是沿用XI 留下來的Enterprising Yong Men,這裡表現不足。
連個MV 都要搞這麼多特效是有必要嗎……
過場和結尾太過快速,雖然把人分群可以增加角色互動,也會增加不斷切換場景對觀眾造成的負擔,中場我覺得場景切換太快了,上個對話群還沒完全結束,突然硬生生被切到下一組。
音樂表現不足:和Star Wars: The Force Awaken 一樣,並沒有特別令人印象深刻的配樂,除了預告片使用的片尾曲 Sledgehammer,大部分仍是沿用XI 留下來的Enterprising Yong Men,這裡表現不足。
連個MV 都要搞這麼多特效是有必要嗎……
過場和結尾太過快速,雖然把人分群可以增加角色互動,也會增加不斷切換場景對觀眾造成的負擔,中場我覺得場景切換太快了,上個對話群還沒完全結束,突然硬生生被切到下一組。
片中在York Town 基地時打開了兩個支線,分別是Kirk 跟Spock 都想要離開艦隊,卻都還在猶豫;經過了電影中段的冒險,在收尾應該能有更多的鋪陳回心轉意的過程,電影卻在Kirk 的生日派對上嘎然而止,也造成末段的對話有點破碎。
結尾瞬間帶到1701-A 的快轉下水過程和To boldly go where no one has gone before 的發言,對照原系列的Star Trek 4: The Voyage Home,加上眾人齊聚艦橋,一同迎接新企業號的下水:
新版只剩下動畫和旁白的下水過程,少了人物的元素,看來實在免洗,而To boldly go where no one has gone before 生怕觀眾不知道一樣,連續11, 12, 13 都用同一個結尾,第一次用覺得感動,第二次覺得重複,到了第三次就覺得老套了,連Star Trek 6: The Undiscovered Country 一代的結尾都還處理得比較好。
最後還有,我覺得Star Trek 裡面,除了人類之外,遇到較人類不進步種族的機會也太多了,這集的開頭仍然是Kirk 在向其他種族接觸,照Prime Directive這個種族應該已經發明曲速才對,可是接觸的地點仍然是星球上古老的石造建築物中,並試圖以肉身攻擊的方式對待來客。
試想要是人類發明了曲速,接待外星人會是用這樣的方式?
個人覺得上集消費克林貢人以降,電影中就沒有好好描述過其他的外星文明,連瓦肯的地位都大不如前,好似只有地球充滿了城市和優哉的人群,這和Star Trek 本來的設定似乎頗有出入。
----
有人問我心目中理想的Star Trek 電影……
只能選一部的話,我應該會選Star Trek 9: Insurrection 吧,沒有過多激烈的衝突場面,毫不誇大的述說企業號的冒險故事和道德的衝突;如果能選其他的,Star Trek 6: The Undiscovered Country 我也覺得不錯。
論Star Trek 系列橫跨50 年,到目前13 部電影各有特色,由老至新題材多變,不像隔壁棚的Star Wars 總是同個調調,影迷們各有所好,也是不錯。
這部Star Trek: Beyond爽則爽,片中藉由Prime Spock 的隨身物品,代出第一代的Star Trek,照片中演員多已作古,但新的一代也已蓄勢待發,傳承新一代的Star Trek,作為重開機三部曲的最後一部,在三部曲中也能坐二望一,推薦喜歡爽片的大家一同觀賞。
結尾瞬間帶到1701-A 的快轉下水過程和To boldly go where no one has gone before 的發言,對照原系列的Star Trek 4: The Voyage Home,加上眾人齊聚艦橋,一同迎接新企業號的下水:
新版只剩下動畫和旁白的下水過程,少了人物的元素,看來實在免洗,而To boldly go where no one has gone before 生怕觀眾不知道一樣,連續11, 12, 13 都用同一個結尾,第一次用覺得感動,第二次覺得重複,到了第三次就覺得老套了,連Star Trek 6: The Undiscovered Country 一代的結尾都還處理得比較好。
最後還有,我覺得Star Trek 裡面,除了人類之外,遇到較人類不進步種族的機會也太多了,這集的開頭仍然是Kirk 在向其他種族接觸,照Prime Directive這個種族應該已經發明曲速才對,可是接觸的地點仍然是星球上古老的石造建築物中,並試圖以肉身攻擊的方式對待來客。
試想要是人類發明了曲速,接待外星人會是用這樣的方式?
個人覺得上集消費克林貢人以降,電影中就沒有好好描述過其他的外星文明,連瓦肯的地位都大不如前,好似只有地球充滿了城市和優哉的人群,這和Star Trek 本來的設定似乎頗有出入。
----
有人問我心目中理想的Star Trek 電影……
只能選一部的話,我應該會選Star Trek 9: Insurrection 吧,沒有過多激烈的衝突場面,毫不誇大的述說企業號的冒險故事和道德的衝突;如果能選其他的,Star Trek 6: The Undiscovered Country 我也覺得不錯。
論Star Trek 系列橫跨50 年,到目前13 部電影各有特色,由老至新題材多變,不像隔壁棚的Star Wars 總是同個調調,影迷們各有所好,也是不錯。
這部Star Trek: Beyond爽則爽,片中藉由Prime Spock 的隨身物品,代出第一代的Star Trek,照片中演員多已作古,但新的一代也已蓄勢待發,傳承新一代的Star Trek,作為重開機三部曲的最後一部,在三部曲中也能坐二望一,推薦喜歡爽片的大家一同觀賞。
2016年7月24日 星期日
使用clap-rs 建構程式介面
最近小弟在改 rust completion tool: racer 的code ,發現它用的程式介面crates: clap-rs還不錯,值得專文介紹一下:
其實這不是第一個類似的套件,事實上已知有以下這幾個選項:
https://github.com/rust-lang-nursery/getopts
https://github.com/docopt/docopt.rs
https://github.com/kbknapp/clap-rs
程式介面的構造,最重要的就是:剖析使用者輸入的參數
getopts 是在研究 rust coreutils 的時候遇到的,它的chmod 使用getopts 來剖析參數,問題是getopts 只能功能有限的參數剖析程式,它的參數選項有限,由 - 開頭的設定也是很大的限制,這在chmod 遇到問題,因為chmod 允許大量的選項變化:
chmod -x file, chmod -0700 file, chmod -rwx file 都是可接受的
而getopts 遇到 '-',就把後面的內容視為參數,若不曾設定任一字母的 optflag 就會丟出UnrecognizedOption error
但我們也不能把 01234567rwx 都加到getopts 的flags 裡面,它們會出現在opts.usage 裡面,下面這段程式碼就是要排除這個問題,在opts 處理剖析args 之前先手動剖析它,並把符合 -rwxXstugo01234567 的選項先移除掉:
https://github.com/uutils/coreutils/blob/master/src/chmod/chmod.rs#L43-L60
曾經把這個問題回應到getopts 那邊,作者的建議是修改getopts 讓它在遇到 unrecognized option時,可以接到使用者定義的函式;或者讓unrecognized argument 轉為free argument。
https://github.com/rust-lang-nursery/getopts/issues/43
不過後來這些都沒有解XD,getopts 好像也有段時間沒有維護了。
我們還是說回clap-rs好了
clap-rs 作者自己有說了,getopts 不是不好,在簡單的小程式上getopts 足以應付大多數需求,不太需要配置記憶體也讓getopts 做到極簡,但缺點是很多東西要自幹,像是檢查參數、自訂help 訊息等,實作額外功能時,不配置記憶體的優勢隨即消失。
另外跟docopt 相比的話,docopt 讓你「寫help 訊息,parse 後幫你產生程式介面」,缺點是比較難客製化,parser 也比直接設定還要肥一點(雖然處理argument這通常不是什麼問題)
來看看clap-rs 怎麼用:
首先引入clap的App, Arg,clap 的設計是一層層加上去,宣告App::new之後,要加什麼功能就呼叫對應函式,最後於末尾放上 get_matches把選項爬一遍,程式介面就建完了。
先來看看最簡單的例子,建一個空殼子claptest:
當然這樣太乾了,介面通常要加上Argument參數,大體跟app 一樣,串接一個
.arg(Arg::with_name('name')),Arg 要哪些功能一樣一一往後串接,以下介紹幾種Argument 的設定方式:
1. 是讓程式判斷相關參數是否出現:
2. 取得參數後的值:
設定參數takes_value(true)
3. 非參數的值,這是針對「不是hyphen」開頭的參數,不用設定long, short,可以直接抓:
其他還有:
作者似乎從docopt搬來一些指令,像是在Arg 可以用from_usage 打入argument 的使用方式來產生Arg(from_usage),個人還是不喜歡這種方式啦,感覺怪詭異的,也就不介紹了,文件可見:
http://kbknapp.github.io/clap-rs/clap/struct.Arg.html
在App 中使用subcommand設定子命令,就像git add 這樣:
App也有各種選項能設定subcommand 的參數跟主程式參數要如何互動,像是subcommand的alias(alias),在help 裡出現的順序(display_order)
http://kbknapp.github.io/clap-rs/clap/struct.App.html
App 內設定AppSetting 也有許多相關設定可選,可見文件:
http://kbknapp.github.io/clap-rs/clap/enum.AppSettings.html
另外clap-rs 還有一些可用的特性:
支援YAML 方式來設定程式介面(from_yaml, unstable),這可以支援多語系,在編譯時期決定要選擇哪個YAML 來編譯,這部分小弟就無心鑽進去了,畢竟程式都沒有寫到這麼複雜過。
http://kbknapp.github.io/clap-rs/clap/struct.App.html#method.from_yaml
另外是支援產生bash-completion,這部分可參閱相關文件,步驟大致如下:
首先把一般寫在main 裡面的
build = "build.rs"
在build.rs 中,就可以使用build_cli()產生App,然後呼叫gen_completions 來產生completions。
http://kbknapp.github.io/clap-rs/clap/struct.App.html#method.gen_completions
雖然自己都沒有用,不過還是大致把clap-rs 的功能介紹了一遍,大概就是比getopts 還要強大的介面產生工具,功能繁多,不過能讓打造介面輕鬆許多
當然一開始提到的,chmod 的介面在getopts 上面有問題,clap-rs 也不例外,目前這個問題無解,雖然在AppSetting 上面有選項為AllowLeadingHyphen,但開了這個選項似乎會打破一些parse 規則,變成parse 錯誤,我已經file bug 了,還待修正
ps說實話其實clap-rs 維護頻率也下降了,有沒有人要fork 一下(X
其實這不是第一個類似的套件,事實上已知有以下這幾個選項:
https://github.com/rust-lang-nursery/getopts
https://github.com/docopt/docopt.rs
https://github.com/kbknapp/clap-rs
程式介面的構造,最重要的就是:剖析使用者輸入的參數
getopts 是在研究 rust coreutils 的時候遇到的,它的chmod 使用getopts 來剖析參數,問題是getopts 只能功能有限的參數剖析程式,它的參數選項有限,由 - 開頭的設定也是很大的限制,這在chmod 遇到問題,因為chmod 允許大量的選項變化:
chmod -x file, chmod -0700 file, chmod -rwx file 都是可接受的
而getopts 遇到 '-',就把後面的內容視為參數,若不曾設定任一字母的 optflag 就會丟出UnrecognizedOption error
但我們也不能把 01234567rwx 都加到getopts 的flags 裡面,它們會出現在opts.usage 裡面,下面這段程式碼就是要排除這個問題,在opts 處理剖析args 之前先手動剖析它,並把符合 -rwxXstugo01234567 的選項先移除掉:
https://github.com/uutils/coreutils/blob/master/src/chmod/chmod.rs#L43-L60
曾經把這個問題回應到getopts 那邊,作者的建議是修改getopts 讓它在遇到 unrecognized option時,可以接到使用者定義的函式;或者讓unrecognized argument 轉為free argument。
https://github.com/rust-lang-nursery/getopts/issues/43
不過後來這些都沒有解XD,getopts 好像也有段時間沒有維護了。
我們還是說回clap-rs好了
clap-rs 作者自己有說了,getopts 不是不好,在簡單的小程式上getopts 足以應付大多數需求,不太需要配置記憶體也讓getopts 做到極簡,但缺點是很多東西要自幹,像是檢查參數、自訂help 訊息等,實作額外功能時,不配置記憶體的優勢隨即消失。
另外跟docopt 相比的話,docopt 讓你「寫help 訊息,parse 後幫你產生程式介面」,缺點是比較難客製化,parser 也比直接設定還要肥一點(雖然處理argument這通常不是什麼問題)
來看看clap-rs 怎麼用:
首先引入clap的App, Arg,clap 的設計是一層層加上去,宣告App::new之後,要加什麼功能就呼叫對應函式,最後於末尾放上 get_matches把選項爬一遍,程式介面就建完了。
先來看看最簡單的例子,建一個空殼子claptest:
extern crate clap; use clap::{App, AppSettings}; fn main() { let matches = App::new("Test program") .version("1.0") .author("yodalee") .about("My suck program").get_matches(); }它會自動產生 help, version, usage:
claptest --help:
Test program 1.0
yodalee
My suck program
USAGE:
claptest
FLAGS:
-h, --help Prints help information
-V, --version Prints version information
這裡可選的內容,可見:http://kbknapp.github.io/clap-rs/clap/struct.App.htmlTest program 1.0
yodalee
My suck program
USAGE:
claptest
FLAGS:
-h, --help Prints help information
-V, --version Prints version information
當然這樣太乾了,介面通常要加上Argument參數,大體跟app 一樣,串接一個
.arg(Arg::with_name('name')),Arg 要哪些功能一樣一一往後串接,以下介紹幾種Argument 的設定方式:
1. 是讓程式判斷相關參數是否出現:
.arg(Arg::with_name(“debug”).short(“d”).help(“execute in debug mode”))使用matches.is_present()可叫出是否有這個參數。
2. 取得參數後的值:
設定參數takes_value(true)
.arg(Arg::with_name(“debug”).long(“debug”).short(“d”).takes_value(true))參數值可接受下列方式設定:
-d value, --debug value
-d=value, --debug=value
-dvalue
利用matches.value_of(“debug”) 取得其值-d=value, --debug=value
-dvalue
3. 非參數的值,這是針對「不是hyphen」開頭的參數,不用設定long, short,可以直接抓:
.arg(Arg::with_name(“arg”)) matches.value_of(“arg”)如果設定multiple ,可以一次抓一排:
.arg(Arg::with_name(“arg”).multiple(true)) let trail: Vec<&str> = matches.values_of(“arg”).unwrap().collect()
其他還有:
- 設定某個參數是否一定要出現(required)
- 要不要在如有debug 參數時才出現(required_unless)
- 是否跟其他參數有衝突(conflicts_with)
- 參數是否要蓋掉其他參數(overrides_with)
- 是否需要其他參數(requires)
- 從help 訊息中將參數說明隱藏(hidden)
- 設定參數後可能的值(possible_values)
- 取得參數重複的次數(number_of_values)
- 設定help 中參數更多的資訊(next_line_help)
作者似乎從docopt搬來一些指令,像是在Arg 可以用from_usage 打入argument 的使用方式來產生Arg(from_usage),個人還是不喜歡這種方式啦,感覺怪詭異的,也就不介紹了,文件可見:
http://kbknapp.github.io/clap-rs/clap/struct.Arg.html
在App 中使用subcommand設定子命令,就像git add 這樣:
.subcommand(SubCommand::with_name(“add”))subcommand 下就跟App 設定一樣,可以用.arg 設定給subcommand 的argument
App也有各種選項能設定subcommand 的參數跟主程式參數要如何互動,像是subcommand的alias(alias),在help 裡出現的順序(display_order)
http://kbknapp.github.io/clap-rs/clap/struct.App.html
App 內設定AppSetting 也有許多相關設定可選,可見文件:
http://kbknapp.github.io/clap-rs/clap/enum.AppSettings.html
另外clap-rs 還有一些可用的特性:
支援YAML 方式來設定程式介面(from_yaml, unstable),這可以支援多語系,在編譯時期決定要選擇哪個YAML 來編譯,這部分小弟就無心鑽進去了,畢竟程式都沒有寫到這麼複雜過。
http://kbknapp.github.io/clap-rs/clap/struct.App.html#method.from_yaml
另外是支援產生bash-completion,這部分可參閱相關文件,步驟大致如下:
首先把一般寫在main 裡面的
let matches = App::new()獨立為一個function
pub fn build_cli() -> App<'static, 'static> {…} let m = build_cli().get_matches();在Cargo.toml 裡面加上
build = "build.rs"
在build.rs 中,就可以使用build_cli()產生App,然後呼叫gen_completions 來產生completions。
http://kbknapp.github.io/clap-rs/clap/struct.App.html#method.gen_completions
雖然自己都沒有用,不過還是大致把clap-rs 的功能介紹了一遍,大概就是比getopts 還要強大的介面產生工具,功能繁多,不過能讓打造介面輕鬆許多
當然一開始提到的,chmod 的介面在getopts 上面有問題,clap-rs 也不例外,目前這個問題無解,雖然在AppSetting 上面有選項為AllowLeadingHyphen,但開了這個選項似乎會打破一些parse 規則,變成parse 錯誤,我已經file bug 了,還待修正
ps說實話其實clap-rs 維護頻率也下降了,有沒有人要fork 一下(X
2016年7月21日 星期四
NAND2Tetris Part1
五月的時候看到coursera 上了傳說中鼎鼎大名的課程:Nand2Teris,就給它選修下去了。結果後來遇到七月考N1,課程大停擺(yay,最近才慢慢一週週的把課程聽完。
課程網址:
https://www.coursera.org/learn/build-a-computer
剛發現 7/18-9/4 有再開一次課程,有興趣的大夥進攻囉~~
Week 1: 邏輯閘
介紹Nand是什麼,如何用Nand做出其他邏輯閘,以及課程在Hardware 模擬用的工具和HDL。
作業要用課程提供的Hardware Simulator,從Nand堆出其他的邏輯閘。
這裡說難真的不難,線畫一畫,填個電路就完成了;大部分都是麻煩而已,像是16 路的Or gate,又沒有像verilog 的for loop 或bus 可以用,填接線的數字就飽了(雖然用vim 的block select 可以省一點工夫)
對應課程:交換電路與邏輯設計。
Week 2: ALU
概念講解:用位元表示數字、負數,如何做二進位加法
這個作業要用上星期作業完成的邏輯閘寫一顆ALU出來,ALU的功能規格是固定的。
比較煩人的是,它裡面的使用的HDL 跟平常習慣的Verilog 有點差異,導致在寫作業的時候,它一直報錯
像是它對Bus signal 取值不能在input ,而是在output;同個output 訊號也不能多次使用,這兩個跟verilog 不同。
例如某個mux output 的MSB (15)為sign bit,我們需要輸出sign bit;同時要產生zr 訊號,表示output 是否全為零,在verilog 裡會是類似這樣:
答案是不行,因為out這個訊號已經當成輸出,不能再接給Or16Way,同時不能在input 的時候對out 訊號這個bus 取它15 的值
正確的寫法會是這樣:
對應課程:交換電路與邏輯設計。
Week 3: Sequential logic
介紹Latch 和Flip-flop 兩個sequential 電路,如此一來我們可以用記錄下來的狀態做什麼?最後的perspective 中有介紹如何用Nand 來實作Latch,D Flip-flop 課程中假定為黑盒子。
作業的電路模擬器中內建DFF 和DRegister ,要實作Program Counter, Memory 等電路元件。
RAM 的架構基本上都一樣,寫好最底層的RAM8之後,一路上去的RAM 64, 512, 4K, 16K 都只是複製貼上而已,只是它的Hardward Simulator 怪怪的,有時候會摸擬到 \Explosion/,建議在跑script 的時候可以用慢一點跑.;把veiw/animation選為No Animation也或多或少能防止它爆掉。
Sub bus 用double dot .. 而非Verilog 裡的 comma,同時接線時是接在被assign 那端,例如要把15 pins的wire 接到元件16 pins 的input上。
對應課程:交換電路與邏輯設計。
Week 4: 組合語言
上周已經把該有的硬體:ALU,PC,RAM都寫完了,這周離開硬體,開始介紹Machine Language 及組合語言(Hack Assemble),組合語言要如何對應到機器碼,記憶體如何取存用,利用最基本的memory map 對應到screen, keyboard 的操作方式。
這周作業可能比較讓人崩潰,畢竟
這周跳脫出來先寫組合語言,下周才會把所有的硬體組起來,寫組合語言等於是知道,機器如何去實習這些功能。
對應課程:計算機結構。
Week 5: 建構一台電腦
介紹電腦整體架構,有這上一週的基礎,我們大致知道電腦會有哪些功能,這周就是要把能夠執行這樣功能的電腦給作出來。
一些基礎元件:Memory, PC, ALU 第三周都已經實現了,這周只是要把它們放起來,寫出自己的CPU跟電腦。
要注意的,電路中包含以下的元件:Memory 的Screen 跟Keyboard取用螢幕跟鍵盤、存程式碼的ROM32K 、以及CPU 裡的DRegister 和ARegister,這些可以在builtInChips裡面找到;要用這些不然硬體模擬器無法抓到這些元件的值。
如果思考一下,就會發現課程都設計好了,控制訊號就是instruction 逐一填入即可,非常輕鬆;想比較多的反而是何是要讓PC jump,但基本上線接一接,Mux 輸入的訊號調整一下就會動了。
對應課程:計算機結構。
Week 6: 組譯器
Part 1 最後一周,介紹組譯器
作業就是寫自幹CPU 的組譯器,什麼語言都可以;為了non-programmer ,課程也設計了手寫作業:人工assembler 給…呃…有毅力的挑戰者。
這部分我使用Rust 來開發,不然我Rust 都快忘光了,被在台灣謀智隻手撐起servo project 半邊天的Rust 台柱呂行大神(又是個好長的稱號XD)屌打,都快無地自容了。
最後當然是寫出來了,可惜只是作業程度,格式錯掉一點點加個空白就會直接噴射,離工業強度大概還差30 dB,超級容易壞掉,叫它草莓組譯器或者玻璃心組譯器(X,這裡也就不拿出來獻醜了。
對應課程:計算機結構,編譯器。
TL;DR
整體來說的話,因為我本身就是電機背景,硬體跟程式都略懂皮毛,寫作業輕鬆愉快,聽課也像在複習忘掉的東西XD
如果沒有相關背景的話也許會困難一點,但修完的那刻,真能領略電腦這複雜又簡明的發明。
能這樣從Nand 往上一路打造出電腦也是很有趣。整體作業非常精巧,沒有多餘的浪費,week 1打造的邏輯閘,在week 2 ALU 、week 3 PC、week 5 CPU 都會用到,不需要特別打造自訂的邏輯閘,一步步照著說明也能自幹一台電腦出來,可以想見規劃這門課程的時候,是真的經過千錘百鍊的設計。
修完這門課,以後看到電腦,儘管它做了那麼多事,接了除了課程沒提到的各種周邊,我們還是可以說:「假的!不過只是相關概念延伸罷了,嚇不倒我滴」
啊不過寫到這就覺得我只不過在小打小鬧,真強者我同學都是跳下去改變世界,哪像我還在這裡聽課程QQQQ
課程網址:
https://www.coursera.org/learn/build-a-computer
剛發現 7/18-9/4 有再開一次課程,有興趣的大夥進攻囉~~
Week 1: 邏輯閘
介紹Nand是什麼,如何用Nand做出其他邏輯閘,以及課程在Hardware 模擬用的工具和HDL。
作業要用課程提供的Hardware Simulator,從Nand堆出其他的邏輯閘。
這裡說難真的不難,線畫一畫,填個電路就完成了;大部分都是麻煩而已,像是16 路的Or gate,又沒有像verilog 的for loop 或bus 可以用,填接線的數字就飽了(雖然用vim 的block select 可以省一點工夫)
對應課程:交換電路與邏輯設計。
Week 2: ALU
概念講解:用位元表示數字、負數,如何做二進位加法
這個作業要用上星期作業完成的邏輯閘寫一顆ALU出來,ALU的功能規格是固定的。
比較煩人的是,它裡面的使用的HDL 跟平常習慣的Verilog 有點差異,導致在寫作業的時候,它一直報錯
像是它對Bus signal 取值不能在input ,而是在output;同個output 訊號也不能多次使用,這兩個跟verilog 不同。
例如某個mux output 的MSB (15)為sign bit,我們需要輸出sign bit;同時要產生zr 訊號,表示output 是否全為零,在verilog 裡會是類似這樣:
Mux16(out=out, a=result, b=notResult, sel=no);
Or16Way(out=nez, in=out);
Not(out=zr, in=nez);
And(out=ng, a=out[15], b=true);
Or16Way(out=nez, in=out);
Not(out=zr, in=nez);
And(out=ng, a=out[15], b=true);
答案是不行,因為out這個訊號已經當成輸出,不能再接給Or16Way,同時不能在input 的時候對out 訊號這個bus 取它15 的值
正確的寫法會是這樣:
Mux16(out=out, out=out2, out[15]=sign, a=result, b=notResult, sel=no);
Or16Way(out=nez, in=out2);
Not(out=zr, in=nez);
And(out=ng, a=sign, b=true);
知道這個差別,作業同樣不算太難。Or16Way(out=nez, in=out2);
Not(out=zr, in=nez);
And(out=ng, a=sign, b=true);
對應課程:交換電路與邏輯設計。
Week 3: Sequential logic
介紹Latch 和Flip-flop 兩個sequential 電路,如此一來我們可以用記錄下來的狀態做什麼?最後的perspective 中有介紹如何用Nand 來實作Latch,D Flip-flop 課程中假定為黑盒子。
作業的電路模擬器中內建DFF 和DRegister ,要實作Program Counter, Memory 等電路元件。
RAM 的架構基本上都一樣,寫好最底層的RAM8之後,一路上去的RAM 64, 512, 4K, 16K 都只是複製貼上而已,只是它的Hardward Simulator 怪怪的,有時候會摸擬到 \Explosion/,建議在跑script 的時候可以用慢一點跑.;把veiw/animation選為No Animation也或多或少能防止它爆掉。
Sub bus 用double dot .. 而非Verilog 裡的 comma,同時接線時是接在被assign 那端,例如要把15 pins的wire 接到元件16 pins 的input上。
Element(input[0..14] = wire, input[15] = xxx);
對應課程:交換電路與邏輯設計。
Week 4: 組合語言
上周已經把該有的硬體:ALU,PC,RAM都寫完了,這周離開硬體,開始介紹Machine Language 及組合語言(Hack Assemble),組合語言要如何對應到機器碼,記憶體如何取存用,利用最基本的memory map 對應到screen, keyboard 的操作方式。
這周作業可能比較讓人崩潰,畢竟
Unlike other language like Java, machine language is not designed to make people happy.
不過我還是覺得滿輕鬆的啦XDDD這周跳脫出來先寫組合語言,下周才會把所有的硬體組起來,寫組合語言等於是知道,機器如何去實習這些功能。
對應課程:計算機結構。
Week 5: 建構一台電腦
介紹電腦整體架構,有這上一週的基礎,我們大致知道電腦會有哪些功能,這周就是要把能夠執行這樣功能的電腦給作出來。
一些基礎元件:Memory, PC, ALU 第三周都已經實現了,這周只是要把它們放起來,寫出自己的CPU跟電腦。
要注意的,電路中包含以下的元件:Memory 的Screen 跟Keyboard取用螢幕跟鍵盤、存程式碼的ROM32K 、以及CPU 裡的DRegister 和ARegister,這些可以在builtInChips裡面找到;要用這些不然硬體模擬器無法抓到這些元件的值。
如果思考一下,就會發現課程都設計好了,控制訊號就是instruction 逐一填入即可,非常輕鬆;想比較多的反而是何是要讓PC jump,但基本上線接一接,Mux 輸入的訊號調整一下就會動了。
對應課程:計算機結構。
Week 6: 組譯器
Part 1 最後一周,介紹組譯器
作業就是寫自幹CPU 的組譯器,什麼語言都可以;為了non-programmer ,課程也設計了手寫作業:人工assembler 給…呃…有毅力的挑戰者。
這部分我使用Rust 來開發,不然我Rust 都快忘光了,被在台灣謀智隻手撐起servo project 半邊天的Rust 台柱呂行大神(又是個好長的稱號XD)屌打,都快無地自容了。
最後當然是寫出來了,可惜只是作業程度,格式錯掉一點點加個空白就會直接噴射,離工業強度大概還差30 dB,超級容易壞掉,叫它草莓組譯器或者玻璃心組譯器(X,這裡也就不拿出來獻醜了。
對應課程:計算機結構,編譯器。
TL;DR
整體來說的話,因為我本身就是電機背景,硬體跟程式都略懂皮毛,寫作業輕鬆愉快,聽課也像在複習忘掉的東西XD
如果沒有相關背景的話也許會困難一點,但修完的那刻,真能領略電腦這複雜又簡明的發明。
能這樣從Nand 往上一路打造出電腦也是很有趣。整體作業非常精巧,沒有多餘的浪費,week 1打造的邏輯閘,在week 2 ALU 、week 3 PC、week 5 CPU 都會用到,不需要特別打造自訂的邏輯閘,一步步照著說明也能自幹一台電腦出來,可以想見規劃這門課程的時候,是真的經過千錘百鍊的設計。
修完這門課,以後看到電腦,儘管它做了那麼多事,接了除了課程沒提到的各種周邊,我們還是可以說:「假的!不過只是相關概念延伸罷了,嚇不倒我滴」
啊不過寫到這就覺得我只不過在小打小鬧,真強者我同學都是跳下去改變世界,哪像我還在這裡聽課程QQQQ
2016年7月16日 星期六
Blog 累積瀏覽量突破十萬人次
小弟經營這個blog,最近累積的瀏覽量剛剛突破100,000 人次,用dB 來算的話就是50 dB,現在平均每日的瀏覽量大概是100 人吧。
老實說一開始寫網誌只是好玩,有個公開的平台讓自己記一些東西;這blog也的確有用,有時什麼東西忘了,翻自己的網誌就能找答案,所以說瀏覽量其實內含不少自己的瀏覽量,那數字也沒什麼意義。
寫著寫著有些文章就開始熱門起來,像是四年前寫了四篇verilog 相關的文章,現在覺得超級陽春(而且我已經不會寫verilog 了yayayayay),不過累積也有7,000 多次瀏覽,算是積少成多吧。
不過說回來,其實我是有刻意的宣傳這個網誌,例如每發一篇文章就轉到FB 上面,下場通常是沒人看QQ,不過還是有鳳毛麟角的幾篇獲得「分享」,一分享通常就會帶入大量流量,畢竟我FB 朋友們一個個都比我發,不像我只是個花盆;有機會也會把內文跟連結一起貼到BBS 裡面,宣稱「網誌好讀版」也能帶來一般帶不進的瀏覽量XD。
不是這樣做大概也無法在四年半累積到十萬次瀏覽,只能說,想出名還是得靠宣傳,主動出擊才能讓人看見。
去年覺得不用白不用,給blog 連結了Google Adsense 的帳號,大約是去年六月的時候開收益,到今天究竟累積了多少?
才1.3 USD 呀
照這個收益量來看,要靠廣告養活自己根本癡人說夢,真這麼做大概會吃土,而且Google Ads 要累積100 USD 才能轉換為現金匯入帳戶,在此之前也無法動支,相比之下連paypal 帳號內的錢還能付款,Google Ads 就只是個數字罷了。
今日瀏覽量截圖:
老實說一開始寫網誌只是好玩,有個公開的平台讓自己記一些東西;這blog也的確有用,有時什麼東西忘了,翻自己的網誌就能找答案,所以說瀏覽量其實內含不少自己的瀏覽量,那數字也沒什麼意義。
寫著寫著有些文章就開始熱門起來,像是四年前寫了四篇verilog 相關的文章,現在覺得超級陽春(而且我已經不會寫verilog 了yayayayay),不過累積也有7,000 多次瀏覽,算是積少成多吧。
不過說回來,其實我是有刻意的宣傳這個網誌,例如每發一篇文章就轉到FB 上面,下場通常是沒人看QQ,不過還是有鳳毛麟角的幾篇獲得「分享」,一分享通常就會帶入大量流量,畢竟我FB 朋友們一個個都比我發,不像我只是個花盆;有機會也會把內文跟連結一起貼到BBS 裡面,宣稱「網誌好讀版」也能帶來一般帶不進的瀏覽量XD。
不是這樣做大概也無法在四年半累積到十萬次瀏覽,只能說,想出名還是得靠宣傳,主動出擊才能讓人看見。
去年覺得不用白不用,給blog 連結了Google Adsense 的帳號,大約是去年六月的時候開收益,到今天究竟累積了多少?
才1.3 USD 呀
照這個收益量來看,要靠廣告養活自己根本癡人說夢,真這麼做大概會吃土,而且Google Ads 要累積100 USD 才能轉換為現金匯入帳戶,在此之前也無法動支,相比之下連paypal 帳號內的錢還能付款,Google Ads 就只是個數字罷了。
2016年7月5日 星期二
archlinux 上使用archlinux-java 切換不同java 版本
Java 2014 年就推出java 8 了,從java 6 到java 8 共有三個版本的 java,各版本間無法相容,例如要開發Android 的話就要使用java 6,而目前電腦上安裝的Eclipse Mars 2.0,看到java 6 就會作嘔回報:
在Ubuntu 上開發時,可以使用alternatives來切換不同的java 版本
http://lj4newbies.blogspot.tw/2007/04/2-jvm-on-one-linux-box.html
這個問題至少一年前在archlinux 還沒有解決,記得那時候為了修android 的課程裝了AUR的java 6,後來要寫minecraft plugin java 6 就被我刪了
幸好最近發現已經有解決方案了:archlinux-java
https://wiki.archlinux.org/index.php/java#Switching_between_JVM
使用上很直覺,透過status 檢視目前安裝哪些java 版本:
透過set 選擇要改用哪個版本:
因為這些動作都會改動 /usr 的內容,所以都需要super user 權限。
當然wiki 上也有教你如何把java 打包成archlinux-java 接受的格式,不過一般人應該用不到這個:
https://wiki.archlinux.org/index.php/java#Package_pre-requisites_to_support_archlinux-java
Version 1.6.0_45 of the JVM is not suitable for this product. Version: 1.7 or greater is required.
在Ubuntu 上開發時,可以使用alternatives來切換不同的java 版本
http://lj4newbies.blogspot.tw/2007/04/2-jvm-on-one-linux-box.html
這個問題至少一年前在archlinux 還沒有解決,記得那時候為了修android 的課程裝了AUR的java 6,後來要寫minecraft plugin java 6 就被我刪了
幸好最近發現已經有解決方案了:archlinux-java
https://wiki.archlinux.org/index.php/java#Switching_between_JVM
使用上很直覺,透過status 檢視目前安裝哪些java 版本:
Available Java environments:
java-6-jdk
java-6-jre/jre
java-7-openjdk (default)
java-6-jdk
java-6-jre/jre
java-7-openjdk (default)
透過set 選擇要改用哪個版本:
archlinux-java set java-6-jre/jre
因為這些動作都會改動 /usr 的內容,所以都需要super user 權限。
當然wiki 上也有教你如何把java 打包成archlinux-java 接受的格式,不過一般人應該用不到這個:
https://wiki.archlinux.org/index.php/java#Package_pre-requisites_to_support_archlinux-java
訂閱:
文章 (Atom)