莫名其妙寫到超過兩萬字。20230206
心理狀態很糟糕,寫點東西似乎有改善,好久沒在部落格寫這些東西了。我一直都是個情緒很容易起伏的…嗯雖然是支那用語但找不到更適合的詞,憤青。然而現在也快 30,已經稱不上青了,就像 Alkan 的 Grande Sonate 那四個樂章分別描述 20, 30, 40, 50 歲的奏鳴曲,30 那樂章已經開始有不知該如何述說的鬱悶與意外與糾結。本篇紀錄一下這幾年心境的改變跟一些雜七雜八的。每隔幾年紀錄一下當下的想法,事後有時看都會嚇一跳「我當初怎麼會有這種想法啊」。
回去翻了一下 2013 年寫的文章…竟然也快十年了。當時是大二,還幾乎不會寫程式、但我發現當時的很多想法跟現在已經沒有什麼差別了,大概想法也到了定型的年紀了吧。
然而變化多少還是有的,就是「跟以前的自己相較之下」沒有那麼容易飆罵或情緒起伏,雖然都是因為看的東西變多感到無奈無能為力、知道生氣也沒什麼屁用所以變得比較懶得生氣而已。雖然寫在 blog 的東西本來就跟 Twitter 相較之下會冷靜很多,畢竟因為每篇文章都要花上好幾天慢慢磨才寫得出來可以慢慢修掉不宜發言,不像 Twitter 一有情緒就會立刻反應在文字且立刻發出去逞口舌之快。
我很不喜歡回想起自己愚蠢的學生時代根本情緒障礙死屁孩,但最近整理電話簿順便打給以前國中同學看看電話還通不通順便聊聊(自己認為的自身黑歷史,問了當時同學他們都覺得沒什麼,有些還早就忘了… orz),也突然意識到,以前脾氣很差不知道是不是因為情緒太多不知如何控制、表現出來的就是一個整天發飆鬧脾氣罵髒話的屁孩;現在雖然已經相對知道如何控制(或者說壓抑)情緒、但一堆事情依舊都能讓我把房門關上大哭幾場。情緒過多這點大概是天生的,我也沒辦法改變它的本質,只是外在表現方法變了而已,至少沒那麼激動到難以讓他人接受。不過我講那麼多藉口真是難看,脾氣壞就是脾氣壞,沒啥好屁話的,誰會在意他人是怎麼想的,只會在意你怎麼表現出來的。
回想起來,18 歲前喜歡看那種好像很帥很成熟的作品,鋼之鍊金術師之類的;25 歲前喜歡看(相對的)社會寫實作品,志村貴子系列或交響情人夢之類;現在 30 歲了,每天只想看無腦精神鴉片異世界轉生小說逃避現實。難道遮 94 成長ㄇ…
世界本來就是不公平的,幾種我認為特別不合理的不公平: 出生、房價、發言權。第一個還好說畢竟人類能為此改變的不多,但第二三個我覺得根本是狗屎。比如說,為什麼不管發生什麼大小屁事,台灣的垃圾媒體都要一直詢問朱學恆那種咖的意見?何德何能。
忘記哪本書介紹過一個研究,說未社會化的幼兒見到「不公平的事情」–即使他根本還沒學過公平的觀念–也會感到錯愕與不解。
以前國文課都要求要言簡意賅、寫出本文大意等等,結果現在各家新聞標題(除了中央社這種國營媒體外)以外,每一家都在比賽誰下的標題最不完整、誰下的標題最無法完整描述內文又能吊人胃口。
長腿正妹精闢指出「這一點」,網友大讚「太中肯」
以前高中覺得考起來最像在通靈的科目就是國文,因為除了背誦以外,其餘基本上都靠直覺,然後又極度刁鑽深奧,讀起來超痛苦,結果讀這麼難的東西,出了社會發現理應語言能力要求應該很高的媒體都在用最沒有水準的方法敘事。好啦這當然不代表編劇作家翻譯家等等也能像這些垃圾媒體這樣亂搞還不會餓死,我只是想罵新聞這個現象而已,氣到都曾經想寫個瀏覽器外掛來自動偵測這些空洞標題自動隱藏起來,後來想想我才不想浪費生命在垃圾上面,直接訂閱中央社、NHK、BBC 這種相對之下比較有分寸的國家媒體就好。
有時候會遇到那種,不管發生什麼大小事、都要急著說出自己看法、幾乎什麼事情都要語帶批判情緒的酸一下的人,我的感覺是,世界真的不缺你一個人的看法或意見。雖然我也許沒資格這樣說,因為我國高中時曾經就是這種人,看到什麼都要批判,明明自己什麼也做不出來,就是個想要不斷靠著批判別人得到自信的愚蠢心理(大概就是因為當時我什麼能力都沒有、沒有作品、沒有學歷光環…雖然拿學歷說嘴也只是另一種可笑行為就是)。還好當時發言權不在我這種庸才的手上(雖然現在也沒有啦)不然我保證會創造比現在還多的黑歷史。現在從第三者角度看別人這樣「見到什麼都能罵兩句」的行為只覺得莫名其妙到有點為他感到尷尬。
除非偶爾心血來潮,不然現在看到網路上有一些很鬼扯的、讓人生氣的言論我幾乎都能順利無視了,連滑鼠多點幾下封鎖都懶。
雖然人類會感到生氣基本上都是因為「事情不像自己心中預期的那樣發展」,不過現在看到那種混蛋言論,我與其說是不生氣,倒不如說是已經累了。
2021 年底到 2022 年初,摸了剛好三個月的交友軟體,這種東西如果沒摸過的話一開始是蠻有趣的,對我這種社交邊緣人來說可以遇到一些平時生活圈幾乎不可能遇到的人。不過過了剛好三個月(因為我訂閱了其中幾個服務的月費所以記得很清楚)我就立刻把所有交友軟體砍掉了,這種玩意體驗過就好。體驗過、知道它是怎樣的東西以後,只覺得在浪費生命,讓人感到在浪費生命的除了上面遇到的人、還有交友軟體服務本身的狗屁設計,爛到我都想自己寫一套了,我都在想這些交友軟體好像都沒把使用者的時間成本考量進去(也許是故意的…增加你黏著度),就像放任少數貨物跟其餘一堆垃圾在海上漂浮讓你自己閉著眼睛去撈。
以上不是重點。在交友軟體上面遇到一些我個人覺得庸碌又愛堅持己見的傢伙,堅持「不不不、台灣現在的媒體早就多半偏綠了」。我那時心裡的念頭只有「綠你個雞巴毛炒懶蛋」。這種脫離事實到超出一定限度的話是無法用道理去說服的,所以我選擇閉嘴,一天後他就自己刪配對了。
然而如果我平常沒有自己親自見識過台灣各家媒體的報導,或者極端一點,假設我是不熟悉台灣社會的外國人,我很可能就相信他的話「台灣媒體多半偏綠」了,我還能轉述「我有認識的台灣人說台灣媒體偏綠」這樣。所以有時看一些蘇聯受訪者描述的蘇聯生活的美好之類的很可能也是不可信的,畢竟之前都有人能睜眼說出愛河水甘甘這種鬼話。
我一向是個 Twitter 邊緣人,我就常常在 Twitter 見到一些我 follow 的發言有一定可信度的人、截圖評論嘲諷某某公眾人物(多半是籃白紅那幾個政党的垃圾)的發言,其實那些籃白紅的發言我「『不一定』一看就知道是在鬼扯」,有很多議題是我真的不知道是怎麼回事的,可信任的 following 雖然口氣明顯是在嘲諷,但說真的我看不出問題…(所以我也認為反串諷刺是非常愚蠢的行為,連原本站在你這方的人都不一定看得出來你在諷刺)我時間有限,不可能每件事情都去了解。所以我發現造謠是成本極低但造成的傷害極高的一種支那統戰手段,因為你不可能一件一件事情去查證,除非你的人生沒有其他事情可做。LINE 新聞下方的留言區更是滯台人渣的培養皿、ptt 八卦版也是支那人聚集處。
我是很喜歡因人廢言的,畢竟我沒有義務無視發言者過去的劣跡紀錄、每次都重新查證事實、根據事實判斷他說的是否值得採納。
說難聽點,我認為「辯論」這個詞是最沒有意義的詞彙之一,因為估計 90% 的「辯論」只是雙方在複述自己的偏見。也許很偶爾真的有人被反方說服吧,但我沒那種美國時間,我也不覺得我有那種能力。包含我自己,我自覺我的能耐只能跟人吵架而已,一樣也只是複述自己的偏見。
你看到有好像可以辯論的機會時,醒醒,那只是會固定說固定台詞的 NPC 而已,也許有點經驗值(主要是 EQ 方面會提高),但不是主線劇情,如果你很清楚這點了就千萬不要浪費時間在上面。
「打臉」這個詞目前看來都是拿來嘲諷別人「你說錯(or 做錯)了好丟臉喔,正確的明明是這樣」,然而這只是表面;其所隱含的實質意義應該是「你所說的(or 做的),跟『我所提出的事實』互相矛盾」,但任一方提出的都並不一定是「真正的事實」。所以你可以很容易的見到台灣不同立場的垃圾媒體,針對同一件事件,同時下出「XXX 打臉 YYY」這樣的標題,就是雙方都試圖拿出一個「很有力的事證」想來證明並嘲諷對方做的事情在邏輯或道德上是錯誤或有瑕疵的。
如果是其他國家的媒體環境我不確定,但如果你是台灣人一定很清楚,道德跟邏輯有重大瑕疵的估計 80% 以上是国民党或民众党或时代力量這些舔中政黨,但是新聞看久的人應該也很清楚人類睜眼說瞎話的功力與臉皮的厚度是沒有極限的,畢竟习主席的屎都能吃了還有什麼鳥事不敢做的什麼謊不敢說的什麼謠不敢造的。所以你就會看到雙方都自認在「打臉」對方,我只覺得「{0}打臉{1}
」這個聳動的字串基本上可以完全替換成「{0}認為{1}做錯了
」,只是一個受過新聞媒體專業訓練的人只能用「打臉」這個字眼,我覺得跟「哈哈~~你做錯了羞羞臉~~」差不多水準。
所以我覺得「社論」可謂世上最沒營養也最不該存在的文體之一,因為跟打臉一樣,這些社論都是建立在作者提出(或編造)的異世界事實基礎上開始講,但常常事實基礎就是錯的,所以你花時間讀完的很可能只是作者想讓你相信的虛構奇幻世界,挑起你的情緒,達成他想要的目的。要寫社論還不如去寫寫霸道總裁愛上你之類的小說對人類文明史的貢獻還大一點,同樣都是無法證明的虛構故事,至少後者讀起來可能快樂一點還能讓人逃避一下現實。
我常常覺得大家對「友」這個詞似乎都用得很隨便,我在跟 A 談論第三者 B 時要講稱呼,準備用「我朋友 B 某某」這個詞之前都會想一下,因為大部分我都會講成「一個我認識的人 B 某某」。我很不爽台灣媒體常常拿來用的「ptt 網友」,誰跟他們那些 troller 是「友」了?那些傢伙只是人品與價值觀都扭曲的心理黑暗又病態的人渣而已。
我更不爽的是滯台支那統媒最愛用的「大陆网友」,哪個大陸?我的大陸預設值是南極大陸,我想去南極大陸旅行。
以下是建立在「1.靈魂是存在的,且 2. 靈魂是會投胎轉世的」這兩個假設成立的前提下的提問。
我以為宗教基本上就是三個構成要素:
- 解釋你從哪裡來、死後又會去往何方。
- 緩解人生的痛苦。
- 道德觀的建立。
雖然我也有問過牧師好幾次,然而基督教對於第一個問題目前還沒有辦法給我滿意的答案,他的「來世」、「復活」與「永生」幾個概念我覺得講得非常模糊,讀了聖經還是不知道到底是什麼,也沒辦法解釋「前世記憶」之類的現象。
只能說從小所處的文化範圍學習到的生死宗教概念很難抹除,依舊是台灣佛道教文化下從小聽到大的「六道輪迴」。生死這種難以證偽的事情我已經沒辦法像一個小孩子一樣聽到什麼概念都能全盤相信,不知道是不是這樣耶穌基督才會說天國是屬於像(小孩)這樣的人。
但這樣扯下去又牽涉到更多問題,會偏離這裡想討論的主題,所以就先假定這兩個條件成立。
今年看到的事故、離別與生死跟以前相較有點多,有點吃不消…也冒出了一堆也許頗幼稚的想法。歷史人物一個接著一個真的成了歷史、同時絕大多數的人類去世後,大概只能成了大略的統計數據。
我很喜歡讀歷史(雖然空間與時間範圍都有點挑食,比如特別愛讀蘇聯之類的近現代史),我可以保持一段距離觀察人類的行為,以及欣賞人類曾經創造過的痛苦悲傷快樂過的痕跡。
應該常常看到「人生的意義是什麼」這句話吧?我也想過,但我現在覺得比較精確的問法應該是「人該怎麼活著才能讓自己感到不寂寞且盡量不後悔」。先不要管這也許是個奢侈的問題(畢竟如果會問這種話代表至少溫飽應該已經不成問題)…
今年讀過一些關於蘇聯時代人民生活的書,據說會懷念蘇聯的老人常提到一點是「當時社會主義大家庭和樂容容的氣氛,人跟人之間不冷漠,當你工作做不好時,同事不會責怪你、同事反而會問你大家要怎樣才能幫助你達成工作與有工作的滿足與成就感」,(聽起來是很美好說人跟人之間不冷漠,奇怪同時又會讀到說蘇聯的服務業臉都很臭因為愛買不買隨便你,啊不過這兩者可能是兩回事啦。)讀到這種敘述還蠻驚訝的,雖然這敘述顯然不是在慈父時代。
覺得人類這種生物有了意識,就是怕寂寞,想要受人理解關注或尊敬。但人類本是孤單的出生來到這世界,並且也只能孤單一個人自己離開。
金瓜石黃金博物館即使還有著「三毛菊次郎宅」這種被保留的歷史遺跡、我卻連三毛菊次郎何年死去都查不到,覺得有種寂寞的人類的悲哀。他也許還是幸運的,至少在後世的台灣他還有相當的名氣。
還蠻多文學或漫畫等作品,作者會藉著角色的口提到「人活著就是為了不想讓人忘記、當然會想留下什麼作為紀念」這種想法,不知道創作者的「創作欲」由來是不是這。也許「傳宗接代」的概念也是類似的情感下的產物?雖然我認為為了滿足自己這種感情而生小孩是很沒道德的就是了…。
就算是被神話的日本昭和天皇也是會離世、就算是英國女王也跟一般人類一樣會離世,離開時靈魂也是只能一人自行離開,且打拼累積一生的一切財富聲望與權力通通歸零,只想盡辦法在這之前讓自己感到「雖然還有遺憾但已經盡力了,一生還算幸福沒有白費」。
雖然基督教並沒有投胎轉世的觀念,但我還是常常忍不住用投胎的觀念去想生死的事:比如一個人努力一輩子累積的東西,如果死去後,投胎成另一個人,如果有可靠的辦法證明是同個靈魂,那麼他有沒有權利直接繼承前世的遺產?
這樣說起來,在現代社會,除了名人以外,如果戶口與銀行戶頭這兩個東西無條件拿掉,好像幾乎等同死亡…沒有其他手段證明你是誰、你的一切累積。
…已經變成建立在假設上的胡思亂想,就此打住。
只是突然覺得人一輩子在累積的東西簡直虛無飄渺…而且還只有活著的那一世用得到…所以才會有「人死前最多人後悔的事情之一是『工作得太超過了』」這說法吧
我不太確定「百年孤寂」這作品為什麼要叫「孤寂」,但我只知道我讀到最後面幾句話的結局後震驚到說不出話來,心情低落了整整一個禮拜。我文學底子很差,看不太出來這部跟殖民有什麼關係,但倒是有感到人的一生原來有多空虛。
我很喜歡「Pale Blue Dot」這張探險者一號拍的照片,智人這個物種畢生追求的事物、所經歷過的一切人生、所愛的人事物、全部都在那個藍色小點中。
From this distant vantage point, the Earth might not seem of any particular interest. But for us, it’s different. Consider again that dot. That’s here. That’s home. That’s us. On it everyone you love, everyone you know, everyone you ever heard of, every human being who ever was, lived out their lives. The aggregate of our joy and suffering, thousands of confident religions, ideologies, and economic doctrines, every hunter and forager, every hero and coward, every creator and destroyer of civilization, every king and peasant, every young couple in love, every mother and father, hopeful child, inventor and explorer, every teacher of morals, every corrupt politician, every “superstar”, every “supreme leader”, every saint and sinner in the history of our species lived there on a mote of dust suspended in a sunbeam.
—— Carl Sagan
我不知道天文迷所著迷迷的是不是這種廣大的孤寂感。我雖然一直都很喜歡看各種天文照片,但並沒有到大學會想參加天文社、或者肉身去觀星這種程度。
我撞牆了幾十年才意識到的(所以我提出這些的本意並不是要嘲笑,有部份也是在反省自己曾經的行為):尋找並滿足於自己的特別之處–包含但不限於種族、個性、頭銜、職業、任職的公司、智商 157、或任何能夠讓自己滿足的屬性標籤等等 ―――― 這種屬性標籤就是一種自慰用的東西,它不是不好但要適量,他能夠在你沒有自信、還沒有累積出什麼實績的情況下建立自己的人設、給自己一些自信與勇氣去面對這個充滿競爭與險惡的狗屁世界,然而不會給他人或這個世界帶來任何益處(而且別人沒事不會在乎你這些感動不了他人的屬性標籤,那是你自己的事),常常自己講這些屬性標籤反而只會讓你顯得很蠢因為代表只剩這種東西能夠說嘴而沒有其他實績,雖然看 Twitter 上的熱門帳號發現這招還是蠻吃得開的,前提是你喜歡用這種方式獲得最終的滿足感。
很多心理測驗也是幫助你建立這種屬性標籤,也許可以用來幫助他人或自己了解自己,但一方面我發現這種測驗也很容易造成一種讓當事人沈迷的屬性標籤。有時看個心理測驗也會說「哇你是 16 型人格中最少見的那種」好像可以讓自己覺得自己很稀有,實際上 100% 切成 16 等分也就 6.25% 聽起來就已經蠻稀有了。
最近幾年有本書叫「高敏感是種天賦」,我還沒有看過這本書,因為在看這本書之前我就聽到超多人在講,還有遇過很喜歡一直強調「我是高敏感人」的人,每隔幾天就要講一次,一開始還好但聽到後來只是有點臉上三條線,情緒真的是高敏感的話怎麼會這麼不怕尷尬一直說自己高敏感,我旁邊聽得都覺得有點丟臉了。前幾天看到書店這本書竟然還出續集出到第三冊了…但反正我自己是不會想看這本書了,只會讓我聯想到尷尬。
據說憂鬱症在 17, 18 世紀的歐洲上流社會中還曾經是個潮到出水的屬性標籤,因為很多當時的文藝大師都有憂鬱症,導致當時就很多人沒事就喜歡說自己有憂鬱症,大概也是類似的行為,想要讓自己看起來特別:
During the later 16th and early 17th centuries, a curious cultural and literary cult of melancholia arose in England. In an influential 1964 essay in Apollo, art historian Roy Strong traced the origins of this fashionable melancholy to the thought of the popular Neoplatonist and humanist Marsilio Ficino (1433–1499), who replaced the medieval notion of melancholia with something new:
Ficino transformed what had hitherto been regarded as the most calamitous of all the humours into the mark of genius. Small wonder that eventually the attitudes of melancholy soon became an indispensable adjunct to all those with artistic or intellectual pretentions.
我以為人類終身都在追求被人尊敬與重視吧,只是程度不同。在人類的文化中,創造出好的文學藝術音樂等作品讓人尊敬、發明發現了什麼讓人尊敬…但不幸地並不是每個人都有這種能力,比如一般來說清潔工即使非常努力工作大概也不會受到人景仰,或者說…大部分人做的工作可能都不容易讓人自尊受到滿足。
即使你已經找到讓你自尊感到稍微滿足的事情,但腦中的多巴胺滿足一陣子後很可能就會告訴你這還不夠,所以要追求更多讓人尊敬的屬性與人設。比如 SNS 上就很多軟體工程師就會拿職業作為自己的人設,這人之常情,雖然有些人沉迷在自己的人設裡、自戀到了讓旁人看只覺得尷尬的程度就是了…不過這種東西本來就是自己爽就好,看不順眼就 block 掉,沒必要刻意跑去對方面前酸對方就是了,畢竟…他們就是想獲得關注嘛,如果對方表現出了顯然已經超過他應得的關注的孔雀展翅行為,那幹麻浪費自己的時間去酸他等於告訴他「欸欸欸我有在關注你耶」,根本一個願打一個願挨,笑死。
人的注意力是希缺資源,然而世上只有極為少數的幸運兒能被許多人關注(當然也可能有人不想被關注啦),王室也是個人類文化才會搞出來的特殊例子,出生就讓人尊敬,而且還是世襲。
我猜猴王沒有世襲制度吧?其實扯到這只是想講,我一直都相當討厭猴子這種動物,智商足夠到有著人類的狡詐與殘忍的文化,卻沒有辦法發展出智慧、文明或藝術,只能看到人類最骯髒的那面的倒影。
除了出身以外,我認為發言權也是世上最不公平的事物之一,我都不知道每次台灣發生什麼雞毛蒜皮的鳥事時為什麼那些低級記者老是喜歡去問某成衣業者的意見,到底何德何能、也不是說思維有什麼特殊見解、到底問他幹麻,為什麼要給他這麼大的話語權。發言權常常落在一些不恰當的人身上,就常常看到一些 Twitter 上的發言權很大的知名軟體工程師帳號宣揚一些很莫名其妙的觀念,有些發言可能會讓人嚇到懷疑他是不是連演算法基本觀念都沒有?
有很多老人會罵年輕人不懂得敬老尊賢,那可能是該人除了老以外沒有其他能夠讓他獲得自尊的東西。(至少在台灣這種被腐儒文化殘害過的文化圈中)不用努力就能獲得的自尊與滿足感除了「老」以外,最有代表性且涵蓋範圍最大的我認為可能是民族主義。
有些人很喜歡嘲笑別人窮、炫耀自己薪水,我認為這種行為從人品根本上就已經有問題。因為以大部分的受薪階級、甚至所有人來說,你能賺多少幾乎都是取決於運氣,包含你很努力進了 FAANG 當工程師那也是你的運氣夠好、生在這個時代、生在有足夠的教育資源的國家、而且剛好選對專業領域。不然你如果是個畫家,你就算作到台灣最最最頂尖,根據景氣好壞也很可能比不上外商工程師薪水;或者更極端的,如果你生在赤道幾內亞,或者印度首陀羅家庭的女性,我倒要看看你能怎麼努力(所以所有主流宗教中我最反感的就是印度教,我不相信這種宗教能夠給人生什麼狗屁解答或指引)。當然不可能否定努力,但把一切全部歸因於自己的努力是不應該的,會這樣做的大概就是那種受過別人很多幫助卻從不懂得感謝他人的自戀型人格。
我不知道別人怎麼想,但我可以說說我自己的感覺:
屬性 | 對外人的我來說,我感覺 |
---|---|
身為 FAANG 工程師 | 覺得好厲害(畢竟我進不去) |
身為醫師 | 覺得好厲害(畢竟我考不上) |
身為馬來人/中國人/(古)羅馬人/法國人/英國人/俄羅斯人/台灣人…等等以人種國族劃分的屬性 | 毫無感覺 |
國族劃分的屬性,我唯一會羨慕的只有日本人,不過原因也不在於國族本身。去日本旅遊時,最深刻的感受其實是深深的挫折,但不是由於震懾於經濟或物質建設(哥布林才會只看這個,笑別人窮、吃不起便當之類的),而是感嘆他們真的是文化大國,為什麼二戰後他們的社會環境、也才一點二億多人口的島國卻能夠培養出這麼強的文化實力,完全就是個文化輸出大國,不管是各種保存良好的古蹟建築、至今仍會經常見到的傳統服飾與儀式慶典、極富創造力的飲食文化(他們到底怎麼這麼有辦法想出一堆神奇的搭配的啊?)、還是動畫漫畫遊戲輕小說,全部都讓我折服(其他文化輸出大國很少有這麼全方面且大量輸出的,輸出能量最接近的應該是美國跟法國,至於其他像德國英國我個人覺得在文化輸出這方面都差了一大截,注意這只是在台灣的個人感想啦,畢竟住在不同地方受到的影響本來就不同,台灣的話因為歷史關係像飲食比較容易受到日本與美國大量影響之類的,就會比較有感,反而一年可能都吃不到一次法國菜),而像是台灣光醜到爆的街景就輸了、日本時代少數留傳至今的建築物現在卻依舊是美麗的古蹟,這裡也不得不佩服支那人的品味之差勁,醜到永遠能超乎想像。當然了解的越多就會發現不全然都是好事,日本他們當然也有自己遇到的一些社會問題…不過這也不是我作為觀光客時需要考量的事情,只是要隨時提醒自己不要把他人過度美化。
去馬來西亞旅遊時,當地導遊介紹「馬來人至上」,想說這什麼鬼,查了一下…原來就是一種種族歧視制度…只覺得非常奇怪到底為什麼導遊要跟外國人的我們介紹這種東西…先不管這個,馬來西亞不管是歷史、軍事、經濟、政治、文化好像也都沒有讓人眼睛一亮的地方(傻眼的地方倒是有)…不知道在自爽什麼。還帶到馬哈迪故居…到底為什麼要帶外國人來看一個政治人物的故居(而且該人明明還活著)?紅色高棉政權也是一直宣揚「高棉人是高貴的民族」…我大膽猜測大部分外國人大概只會覺得有點可笑。
前陣子看到說羅馬尼亞的民族認同感是靠(自稱)羅馬帝國後裔所凝聚的,由於羅馬帝國與古羅馬文化對於台灣人的我來說太遙遠、自己對於古羅馬文明也毫無興趣沒有特別去讀過什麼資料,所以更是毫無感覺也很難理解。不過在歐洲文化中,「古羅馬帝國正統繼承人」似乎是個非常令人嚮往的金字招牌各政權都搶著要(保加利亞第二帝國、拜占庭帝國、神聖羅馬帝國、甚至…俄羅斯帝國…?)
雖然我個人也一直很不爽烏克蘭因為烏克蘭對台灣一直都不太友好,甚至我覺得戰爭如果結束後烏克蘭還是會繼續舔中反台的,原因是克里米亞,「如果承認台灣的話就等同承認克里米亞獨立了」所以就冷落台灣(雖然克里米亞是 1954 年赫魯雪夫自己找個奇怪名目「紀念烏克蘭加入俄羅斯三百年」從蘇維埃俄羅斯割給蘇維埃烏克蘭的,只想說貴圈真亂);加上他們經濟一直都很慘,大概還是會覺得跟中国做生意才是活路ㄅ。要不是瑞莎的陰德值積得非常高、還有一堆混蛋台灣人找她麻煩讓我很愧疚,不然除此之外我對烏克蘭實在毫無好感。
順帶一題蘇聯前加盟共和國裡面我最不爽的當然還是喬治亞了,這玩意是全世界少有的完全拒絕台灣護照入境的國家,原因也類似:他們自己國內有領土想要獨立(南奧賽梯、阿布哈茲)所以就禁止「同樣是獨立分子的台灣人」入境,去你的。你們自己就可以反俄、自己就可以從蘇聯獨立、卻反對別人獨立?雙標狗屎爛國家。不知道為啥前陣子常常在 Twitter 看到喬治亞駐日本大使在那裡裝可愛,看得就煩直接封鎖。
這裡要懺悔一下,有些人聲稱「美國在 1980 年代雷根跟戈巴契夫承諾 NATO 不會東擴、結果現在 NATO 東擴了、是美國自己食言導致現在的烏俄戰爭」,我迷迷糊糊也一直記成這樣,但後來再查一下手邊有的書,原來是我也記錯,美國並沒有承諾過這點…
「阿克希茲並沒有談到新德國的東邊鄰國。在年初的時候,戈巴契夫以為貝克已經承諾北約不會東擴。貝克確實說過美國會「考慮」,但沒有簽下任何東西。戈巴契夫在阿克希茲沒有逼柯爾答應此事,事後也沒有逼美國保證在德國統一條約中寫進這一點。幾個前華沙公約國家在一九九○年代加入北約時,戈巴契夫的支持者都後悔當初遺漏了這一點。」
[意外的和平/羅伯.塞維斯/八旗文化]
See above, p. 432; and excerpt from Soviet record of conversation between M. S. Gorbachëv and J. A. Baker, 9 February 1990: Otvechaya na vyzov vremeni, a. 379. A. E. Stent gives an excellent account of the Gorbachëv-Baker conver-sation, albeit one that is more defi nite about the implications of the contents than I have adopted, in Russia and Germany Reborn: Unifi cation, the Soviet Collapse, and the New Europe, pp. 113-14 and 225.為了找這個參考資料多花了半小時…澄清事情真的很難很麻煩很花時間,造謠卻很容易啊…
真的不想再找史料了,現在已經不是學生時代,沒那麼多時間可以揮霍。
以上這張是「傷亡人數」統計。至少在台灣的歷史教育,有時課堂會放二戰電影的關係一直有印象美國死了很多人而且還是二戰最大功臣、但對蘇聯除了 227 號命令以外真的沒什麼特別深刻的印象。當然戰爭死亡這種東西不該拿來比較,尤其沙俄/蘇聯/俄羅斯則是一直以來那崇尚壯烈的英雄主義犧牲的基調悲苦到有點病態。只是多多少少會想,現在二戰的影視作品有多少焦點是放在蘇聯或者(當時的)中國,畢竟對沒有經歷過那個年代的現代人來說,對歷史的很多認識就是來自於影視遊戲等作品。
雖然以上好像一直在同情二戰時的蘇聯,但…大概是對事物的了解越多、越不會再抱有什麼幻想(藍白黃最推崇的蔣經國當初去蘇聯留學時就是這樣,去之前充滿理想,實際待過後回國氣到寫了回憶錄出版,真想知道他老人家如果地下有知他的藍白黃徒子徒孫現在所有人通通都在舔共不知作何感想)。比如紅軍,名稱說的多好聽「為共產主義奮鬥」的紅軍(紅色為共產主義象徵色),在二戰中的軍紀是糟糕到連盟國與盟友都在抗議(比如南斯拉夫共產黨游擊隊的抗議)、在盟國內都照樣姦淫擄掠的,波蘭人被紅軍「解放」後因為軍紀過糟反而懷念被納粹佔領的時期,但這些歷史好像相對比較少被關注…然後俄羅斯直到今天的軍紀還是爛得一攤屎、一樣人海戰術、一樣草菅人命,看他們的歷史跟支那史一樣都在想這什麼鬼民族性到底怎麼養成的?俄羅斯是因為農奴文化、支那是因為腐儒文化?
蘇聯與俄羅斯現在動不動就把「法西斯」這個辭意完全混淆、在上下文語意完全牛頭不對馬嘴的詞套在反對者頭上,跟支那人與滯台支那人與藍白粉整天「塔利班/塔綠班」這個詞意與他們原本想比喻污衊的對象根本無法類比的不倫不類的帽子套在別人頭上一樣意味不明,啊明明平常最喜歡罵政府教育政策「小朋友不念文言文國文能力會不足啦」的一群人,自己語意用得支離破碎時卻毫不在意還很開心,哥布林水準。
先看美國:
On May 8, 1945, America and Great Britain had victory over the Nazis!
— The White House 45 Archived (@WhiteHouse45) May 8, 2020
"America's spirit will always win. In the end, that's what happens." pic.twitter.com/umCOwRXWlB
然後看烏克蘭,節錄有點長:
我下山後搭便車到拉克赫夫(Rakhiv),再轉搭巴士去烏日霍羅德(Uzhorod)。途中,一位名叫露德米拉(Ljudmila)的女大學生在胡斯特(Khust)上車,坐在我旁邊。她說自己經常夢想住在美國,對二次大戰歷史很著迷,於是我就測試她:「你知道蘇聯和美國在二次大戰期間是盟友嗎?」
她錯愕地看著我,「真的?」
「你聽過雅爾達會議嗎?」
「什麼意思?雅爾達發生過什麼事?」
我解釋:「邱吉爾、羅斯福和史達林曾在那邊討論戰後要如何分割歐洲,他們最後同意將西歐歸由英國和美國管理,讓俄羅斯管理東歐。」
她看起來很疑惑。「你有沒有聽過D日?」我發覺烏克蘭人可能會用另一個詞稱呼它,所以我又補充:「那是一九四四年六月六日,有沒有印象?」
「沒有。」
「那天有三萬艘戰艦和十七萬名盟軍橫越英吉利海峽,進入歐陸。後續的幾個月內,數百萬名美軍將戰線推進到德國。」
「我從來都不知道大戰期間有那麼多美國人在歐洲。」她承認。她以為蘇聯是納粹敗戰的唯一原因,其他同盟國都沒扮演任何角色。
我告訴她:「我猜你們的學校也沒教過北非和日本附近的戰事。」
她開始惱怒了,「我不了解學校為何沒有教更多,我們的教授看起來滿客觀的,也很有知識,他是反共產主義的。我們的歷史書籍也是新的,不是共產時代的舊教材。」
雖然重寫歷史只需要一天時間,新觀念卻可能要等一個世代才能滲透整個社會。
– 《野生的東歐(下)》 Francis Tapon
雖然我很喜歡歷史,但不幸的這似乎才是歷史這幾千年來唯一的「使用方法」。每一方政權都各自用自己的話語權在各自的影響區域內使用歷史。
講到國家的話語權…應該就是比誰的拳頭大,然後也連帶包含語言。幾年前有次突然想到,為啥 19 世紀的歐洲音樂家文學家好像都能互相順利溝通,那時是講英文嗎?結果問了一下語言專家,原來當時歐洲通用語言是法語,大概因為法軍是當時歐陸上的最強存在,後來一戰不太行了,美國強大起來、通用語就慢慢變成英文了…俄語在蘇聯時代好像也曾經是相當的通用語言,蘇聯解體後的今天就不行了,現在除非有特別興趣或原因不然學了也沒什麼實際用途。
其實我一直都不太喜歡看戰史這種類別的歷史,看得只覺得心情痛苦以及人生好可怕…然而我自身感興趣的近現代史 20 世紀一堆大事件都是戰爭…而且我也知道理論上、祖父母講台語與日語的我,立場好像應該要是當時的日本帝國?然而這些都是我出生之前四十幾年前的事情了。生在台灣的歷史處境就是如此尷尬;而且即使你不吃這套,別人也會拿這招套在你身上。
雖然我自己沒有實際讀過馬克思的那些社會學著作,語言能力太差了根本看不懂那堆社會學概念在講三小只會很想睡覺。
馬克思主義是認為人類的歷史都是建立在階級而不是民族上,列寧就是搞國際主義、非常反對民族主義,但列寧在蘇聯剛建立沒多久就中風無法工作很快就掛掉了(健康很重要啊…),所以蘇聯的民族政策很快就被史達林搞得面目全非,史達林一直都是搞民族主義的,而且搞的還是大俄羅斯民族主義(據說俄語的西里爾字母沒有被拉丁化就是因為史達林的堅持),詭異的是:
現實就是如此複雜詭奇難以解釋…
蘇聯政策基本上是種族平等,但由於各個加盟共和國是以人數比例來派出蘇維埃代表,所以蘇維埃代表大會實際上最有話語權的還是總人數最多的俄羅斯聯邦,這點就有被其他蘇聯加盟共和國靠北過。不過一方面蘇聯的民族政策也有壓制了像是亞美尼亞和亞塞拜然雙方的民族矛盾…至少表面上
是處於一種「没事儿没事儿大家都是苏联人不要分那么细」的狀態…,但蘇聯一解體雙方立刻就打起來了…
看到蠻多對蘇聯人的訪談紀錄都有提到「懷念蘇聯時代時,蘇聯各加盟共和國之間大家都是一家人的溫馨感覺,去立陶宛旅遊都感覺有受到當地人歡迎」之類的,我不知道這感覺對雙方是否都是出自真心、還是不得已(人家立陶宛可是被蘇聯併吞的那方),畢竟以我的立場我就會想到如果有中国人跑來跟我扯什麼一家人我只會想揍他,噁心的沙文主義侵略者還講的這麼好聽。
一些比較不相干,關於蘇聯與以色列的事情…
- 由於列寧推的種族平等政策讓不少猶太人非常興奮,俄羅斯紅白
歌唱大賽時不少猶太人加入紅軍,1920 初期蘇共中央委員有 1/5 是猶太人…直到搞民族主義的史達林上台(這家伙掛掉之前還搞了臭名昭彰的醫生事件)。(出自《精通蘇聯料理藝術:包裹在布林餅中的悲歡離合》)- 在二戰時蘇聯是歐洲少數對猶太人比較友善的國家,很多猶太人從納粹德國逃到蘇聯…或者說二戰時期歐陸猶太人除了蘇聯大概也沒其他地方可以逃。
- 蘇聯跟以色列至少在以色列建國初期一開始關係還不錯,蘇聯甚至還幫忙訓練以色列軍隊提供軍火,好像期望以色列會成為社會主義國家(無神論的政權期待世界上最頑固的一神教民族會建立反民族主義的共產主義政權?我每次讀到相關議題都覺得蘇聯決策層到底在想什麼…),不過二戰後大概是覺得蘇聯境內猶太人凝聚力強到會對政權造成威脅所以後來官方政策又被史達林搞成反猶 (《血色大地:夾在希特勒與史達林之間的東歐》),後來以色列跟埃及在六日戰爭後蘇以直接斷交。
- 在 1970 年年初,為了對付國外的人權抗議,蘇聯開放蘇聯的猶太人可以移民到以色列。
- 到了蘇聯末期這個反猶政策依舊存在,蘇聯的高等學府表面上不會講明、但猶太人想入學的話,都會故意多考一些刁鑽考題,答錯了就直接再見不聯絡。所以還衍生出了一些專門針對猶太考題的私人家教事業。(出自《偉大的俄羅斯回來了:國族、極權、歷史記憶,人民為何再次臣屬於普丁的國家?》)蘇聯解體後,一百多萬猶太人從蘇聯境內移民到以色列,所以俄語成為以色列使用人數僅次英文的非官方語言。
- 即使蘇聯時期如此對待猶太人,直到今天普丁時代的俄羅斯與以色列的關係一直都不錯…(???)而且互相都有很多僑民。
為什麼會寫這些只是因為覺得蠻出乎意料的有趣…這種離台灣太遠的地緣政治,如果不是因為喜歡蘇聯歷史順便讀到,我之前真的完全沒概念。
講到這,其實我高中大學時是非常反對民族主義的,但看的東西越來越多、看中共怎麼滲透台灣以後,我現在反而開始支持民族主義了。大概這就是傳說中的「30 歲前不信社會主義/左派是沒有良心,30 歲以後還信社會主義/左派是沒有腦子」。
這是一種對現實的妥協。每個人出生都一定會有個民族屬性,而民族認同感是能夠激發最大基數的人的共鳴的一種屬性,也許這是人類為了搶有限資源的分出你我的排他天性使然。美國這種靠諸如文化經濟武力等實力取勝的國家除外(國安不用擔心,所以他們的左膠才有餘力在那裡腦袋種花田耍白痴),不然像台灣或立陶宛這種拳頭沒別人大的國家,你沒有民族主義,只會有更糟糕的東西取而代之;比如…來自其他敵對極權國家的民族主義。民族主義是當前世界幾乎所有國家的標準配備,你沒有就等於是少一道城牆讓人可以直接把火砲塔蓋在你家門口。
我無意幫任何一個政權擦脂抹粉,一是因為我自己的知識也不足,二是隨著歷史資料看得越多,我越來越清楚知道原來幾乎每個有一定實力的國家(比如聯合國五常),不論是對自己國民還是對外,缺德損事都沒少做過。
至於我為什麼對於馬克思主義、社會主義與蘇聯的歷史特別感興趣,也許是因為我從高中開始心中總是夢想有一塊理想的烏托邦,所以一個靠著社會制度理想而不是民族地緣建立起的國家對我來說非常有吸引力…當然最終結果現在大家都知道了。這是將理論付諸實行的列寧用的手段的錯、還是馬克思理論本身就是錯誤的,我不知道。我並不是什麼革命家、哲學家、經濟學家或歷史學家,只是把蘇聯歷史當作異世界轉生小說那種程度的嗜好在讀而已(某種程度上也算是種異世界了吧…XD),而且我想就算我把馬克思著作讀懂讀熟意義也不大,對我或對現實外界都沒有什麼用。
定居在台灣的外國人 YouTuber 拍的主題 95% 以上說難聽點都是在拍台灣文化的馬屁,就是給台灣人的一種精神鴉片。台灣的街景明明就被整天只想反攻大陸現在又舔共舔得的中国国民党殖民過後醜到不行,在台灣的外國 YouTuber 還整天稱讚台灣有多漂亮。漂亮的地方雖然有,但幾乎都是在沒什麼被開發過的地方,不然其他地方幾乎都是華國美學。
我原本很反感這種東西,但現在倒是覺得這是一種雙贏,外國人賺到流量爽爽、台灣人建立自我滿足認同感也爽爽。如果硬要否定這種東西,那就有點像蠢左膠或蠢右膠了,比如那些整天靠北「李登輝不是台派因為他進過國民黨,蔡英文不是台派因為她在悼念伊莉莎白女王的推文中用了『中華民國』一詞」的蠢才,我認為這種處女情節可謂無能者的特徵,他們自己根本不懂得現實世界的複雜、也沒有可行的更好的解決方案、一廂情願活在自己的烏托邦裡、以為不妥協就是有原則但實際上跟鄉愿沒啥兩樣,他們來做肯定會把事情搞得一團亂,然後死不會認為是自己錯了都是世界錯了。
福音書裡面說「不要判斷人,免得你們被判斷」,實在是難以反駁的好習慣,我還是常常不小心對人亂做出判斷。
我覺得我這幾年每年的心智變化幅度都頗大,主要集中在沒那麼容易憤怒或慌張了 50% 左右(当社比),應該說比較常忍住了。但就跟我前面提到的一樣:別人沒有那麼多美國時間去理解或在乎你現在是怎樣的人、以及曾經是怎樣的人。有些別人放在自己身上的偏見是不該被責怪的,畢竟確實有些時候是自找的,包含我自己。
我 Twitter 用了超過十年,從國中就開始用,也就是說…很多人看過心智與情緒發展障礙時期的我的垃圾發言。我曾經的發言有多麼讓人反感其實我自己一直都有自覺,就是一堆情緒垃圾和動不動就開罵的批評和髒話,但忍不住就想講,我鎖推的其中一個原因就是至少可以避免垃圾被太多人看到。我自認跟以往相較下,這幾年越來越收斂了,但可惜的是,那些看不慣我講話所以幾年前就一個個 unfo 的人大概也不會回來了。
人的時間與注意力都是有限的,所以像是「偏見」這種東西很可能也是人類為了生存所發生的一種現象:可以在最短的時間內直覺做出反應、讓你不用動腦就能判斷這個東西對自己有沒有害。
「漢奸」這個詞有多麼大支那沙文主義,對本文這種無趣話題都能看到這裡的你應該不需要我解釋「漢奸」這個詞有多麼自以為是、多麼以漢族民族本位給人扣上不倫不的叛國罪名。這個詞現在每次出現都是跟叛國的觀念混在一起亂用,根本沒考慮到對方是不是漢人。
很多人寫文章、拍影片動不動就來一句「逃不過歷史的審判」、「要被釘在歷史的恥辱柱上」當作收尾,雖然明顯是想表達(根據他自身立場的)道德譴責,但這箇中含義我怎麼聽都跟小學時同學之間最愛講的「哼!我不跟你好了!切八段!」差不多的透露出一種很自我感覺良好的笑果。
愛用這種句子的目前觀察通常是支那人或者華腦。這種人很喜歡拿「歷史」當作支撐自己觀點的靠山,然而 1. 又不是每人都在意歷史,真的會讀歷史的也不多,而且 2. 就算你真的對歷史頗有研究,你讀到的歷史也不見得是正確的。多的是為了維護自己的利益對歷史擅自提出自己解讀方式的垃圾,而且你很可能也是那種垃圾,或者說也許「維護自身利益」這本來就是歷史一直以來最大的用途。(反正這個世界大家其實就是只看錢跟利益嘛!絕望啦!我對這個只看錢的世界絕望啦!)
然後這種審判可以幹麻,撇開宗教的死後的天國地獄輪迴觀念的話,這對當事人根本不痛不癢。而且愛讀歷史的話不是應該知道歷史都是拳頭在說話嗎。
最重要的是,你私人的價值觀做出的審判根本沒有價值,少往自己臉上貼金了,你才沒那麼偉大。
尤其「恥辱柱」一詞好像是支語,我第一次看到應該是 2019 年,為什麼我會記得這麼清楚呢呢,因為我被支那人點名砲轟過啊 XD
離題一下,講到價值觀,大概價值觀隨著年紀也逐漸明確,每次不管是讀別人的文章、讀訪談、看影片、與人互動、都會明確感受到「啊,這個人的價值觀跟我完全不同啊」,比如感受到對方對於「成功的定義」或「生活的目標」就是當老闆賺大錢開跑車飲食男女之類,真的感到很厭煩很膩。那種價值觀也不是不好,只是跟我合不來而已,不過要我說我完全沒在心中瞧不起這種觀念也是騙人的就是。
以上為啥會講這麼多蘇聯真是莫名其妙,反正這篇本來就是雜談然後我一直以來寫東西都是想到什麼覺得值得紀錄的就寫、到處亂發揮發散沒有主旨。
講講蘇聯吧。這裡無意講蘇聯本身,而是講講「我自身對蘇聯的觀感」。歷史我只是拿來當小說讀而已連業餘愛好都稱不上,所以請不要拿這裡的資料當作什麼佐證,我寫到這也已經懶得再回去查書了好煩。
跟中国国民党與中国共产党兩個我看到就想吐的垃圾比起來,我必須承認我對蘇聯是有相當程度的贊否兩極到有失公允程度的情感在裡面,蘇聯歷史以及整個 1910 ~ 1970 年代是整個人類歷史上我最感興趣的一段時間。
我一直都有意識到,我的心態常常過於浪漫主義,至少高中就這樣了,雖然知道共產主義在人類的惰性下大概永遠不可能實現,卻同時也覺得共產主義的理想非常美好,因而非常喜歡讀蘇聯、馬克思主義、共產主義、社會主義國家相關歷史(中共除外,国共兩個垃圾在歷史課本看到都煩)。
不過對於支那共产党與支那国民党與支那倒是一點興趣也沒有。順帶一提我高中歷史課最討厭的是支那史,最最最最最討厭念的則是二戰後的支那現代史,兩沱垃圾在那裡吵來吵去超煩超無聊。
前面也有提到,民族主義是目前世界上最容易激起人情緒的認同感(在中世紀則可能是神權與王權),而我可能天生對這剛好比較不敏感、反而對烏托邦的理想主義浪漫主義更容易激起我的認同,就跟我也無法跟他人解釋為什麼我國小四年級第一次在基隆誠品書店讀到 Linux, GNU 與自由軟體的介紹時我會整個人熱血澎湃激動異常的原因,大概天性真的太過理想主義(這個性也導致我大學那段時間整個人可說是個蠢左腦殘),自由軟體與開放原始碼也是讓我第一眼看到就墜入情網的美好理念。所以為什麼同樣都是讀歷史,中国歷史那套高中時就已經讓我極度反感了的君君臣臣父父子子的奴隸文化、蛇的传人之類的的大中华屎觀就沒能激起我的最大認同。
不過我承認,直到高中考完學測為止,我看到晚清歷史慈禧太后那樣亂攝政,竟然會激起我的憤怒與可惜的情緒。當時我對「中國」以及「中華」一詞的認同如何我已經想不太起來了,應該是沒有仔細想過所以沒啥印象吧,不過顯然當時我也是被那些該死的中国史課本洗到腦子有點錯亂,畢竟人家女真人的大清帝國滅亡我到底在氣什麼,笑死。
順帶一題,有件事我倒是很有印象,就是國中英文作業有一題中翻英有「華人」一詞,我查遍了字典都不知道「華人」到底該怎麼翻譯,只有找到 “Chinese” ,但 “Chinese” 指的明明是中國人。後來老師正確答案揭曉,華人就是 “Chinese”。這就是種偷渡概念,你說「我不是中国人我是華人」,但實際上你只是被大中華沙文主義吃豆腐了,因為在外國人耳中你只是說了”I’m not Chinese but Chinese.”。台灣人從小到大的國族認同就是在如此混亂而且極度容易誤入歧途的環境下培養起來的。
這種浪漫心態也許是因為:
「朦朧產生美」也許也適用於蘇聯人自己身上,記得今年讀到的其中一本書就有提到赫魯雪夫開始去史達林化後、蘇共就開始把列寧塑造成「慈祥的老爺爺」…反正他都掛掉 30 幾年了、還記得他當時幹過啥事的人沒那麼多,變成有點精神領袖高道德標準的存在。不過十月革命後沒活幾年就掛掉實際掌權日子不多可能也是原因啦…
不然我換位思考了一下,如果沙俄直接變成俄羅斯、且歷史上沒有出現過蘇聯,那俄羅斯文化本身對我來說是幾乎沒有吸引力的,就只是個跟中国一樣暴力殘忍把人命當免洗筷的的帝國霸權+極端民族主義國家而已。唯一的不同大概只剩下…俄羅斯的藝術比中国強多了(比如 Tchaikovsky, Rachmaninoff, Prokofiev 重量級作曲大師)。
我某種程度上是把蘇聯的歷史當成逃避現實的異世界小說在看的。我完全沒有編劇能力、從小到大從來沒有創作過任何故事,一是我完全缺乏劇情的想像力、二是我完全缺乏足夠的文筆(即使還算愛看書,奇怪的是我的記敘文到現在讀起來依舊跟國中生的尷尬作文差不多。)我完全寫不出故事的程度之離譜,就是直到上國中、我都還以為哈利波特跟神鵰俠侶這些故事都是真實的、頂多稍微誇飾而已,因為我不相信有人有辦法憑空想像出這些故事,講給幾個人聽他們都難以置信、除了伊索寓言這種結構簡單的小故事我知道一定是虛構的,不然我很難想像別人是有辦法虛構故事的。蘇聯這個小說卻是真實發生過的有如異世界一般的地球平行時空,這麼扯的憑著烏托邦理想(暫且不討論最後實行效果…),而不是靠著種族、王權、神權所建立的純粹的人造國家竟然真實存在過、還影響了整個 20 世紀,個人是覺得這種歷史跟異世界轉生小說一樣吸引人。
我看人的時候,除非對方真的特別糟糕(比如說會在辦公室搞心眼整人的同事、或者希特勒史達林蔣介石這類等級的世界知名殺人魔),不然聽到有第三人講他的壞話時、我常常會想要幫對方緩頰。我也不知道這行為的原因從何而來。由於大家從小都知道史達林名聲臭不可聞,所以我就會幻想一堆有的沒的,擅自在心中美化「歷史的如果」…雖然歷史沒有如果:
維基百科這段就是我看完這本後加上的 XD:
參與過八一九政變的戈巴契夫秘書瓦列里·伊萬諾維奇·博爾金在其回憶錄中敘述戈巴契夫虛榮心強且奢侈浮誇,每天都會仔細搭挑選時髦的領帶皮鞋與服裝;很愛視察地方,即使明知視察時地方官員給他看的都是作秀卻不點出,與以往的蘇聯領導人並無不同。他在西方民主國家之間聲望非常好,每次都能受到熱烈歡迎,因此他很喜歡出國訪問,後來同僚開始質疑他整天往國外跑不管國內事務,被點出這點就會發脾氣;心眼很小,清楚記住每個曾經有意無意得罪過他的人絕不讓他們升遷,或者貶官。1985 年,他依靠當時蘇聯最有名望且受民眾尊重的黨內人士、時任外交部長安德烈·葛羅米柯的表態支持成為總書記,剛上任時由於年輕、談吐流利且演講經常不須看稿,各官員與民眾對他的第一印象都非常好,對他的改革寄予厚望,一時百花齊放對他提出許多意見,但逐漸發現他剛愎自用、經常侮辱下屬、開會專斷獨裁逐漸流於形式,最後幾乎沒人再提出建言。一開始還會支持附和的葛羅米科逐漸變得沉默,戈巴契夫也不讓他參與他最擅長的外交政策。1986 年,有認識的中央官員由於被檢舉其父親在二戰時與德國有來往而從中央被貶到地方,在調查後發現原來他父親是戰時情報人員,秘書提醒戈巴契夫應該還他清白,戈巴契夫卻只冷冷地回說「他現在在擔任新的職務,我看他沒有必要回來做以前的工作」。雖然到處演講提倡要改革,但一直沒有具體方案與目標,於是社會上逐漸出現許多關於改革的蘇聯政治笑話,改革一詞也逐漸變成「盲目變化」的代名詞。1986 年四月車諾比核電廠發生事故,當下收到消息時他不覺得事情很嚴重,只派專家到現場瞭解,不願意到熱點區域視察。1980 年代下半,國內外輿論對德蘇祕密協議越來越感興趣,戈巴契夫知道這些文件的存在後卻要求秘書不要公開並暗示銷毀,甚至還在人民代表大會上說謊宣稱沒有找到這些文件的原件。波蘭與與蘇聯成立的聯合委員會委員與沃伊切赫·賈魯塞斯基(波蘭共產黨總書記,我對這位人物…相對有好感,但他的事蹟也是羅生門一般各說各話…)曾經多次向蘇共中央以及戈巴契夫要求公開卡廷大屠殺的所有文件,戈巴契夫私下看過這些文件後,卻要求封存並公開宣稱沒有找到除了戰爭期間找到的資料,即使世界各國早就知道這些事情。
整本讀完的感覺就是「蘇聯柯文哲」:
- 沒有包袱的政治明星。
- 給人的初次印象大多都非常好,人們對他充滿期待。
- 執政初期幾個月各種演講採訪,各種新觀點讓人耳目一新,大家也都很樂意聽,非常興奮。
- 執政三年後大家逐漸對他感到失望。
- 執政五年後在人民之間已經幾乎沒有威望與可信度。
- 對待下屬苛刻,專斷獨裁,一開始支持他的同僚一個個閉嘴,或者選擇黯然離去(還有一個蘇聯元帥謝爾蓋·阿赫羅梅耶夫 (Сергей Фёдорович Ахромеев) 在蘇聯解體前自殺抗議,雖然算是間接原因…)。
- 心眼超級小,不允許有人的聲望可能超過他,有可能的一律鬥走調職。
- 正事實際都做不好,無能,只會動嘴說空話。
- 毫無同理心,有認識的同鄉地方官員被冤枉被刑求打到腎臟壞掉殘廢,他卻漠不關心只說這種事情幹嘛報告我。
- 每天忙著監聽政敵對他的批評倒是很勤快親自而為。
- 極為享受鎂光燈。
這本書真的蠻危險的,聖經說不要論斷別人,免得你們自己也被論斷,但看這本書實在很難心理不冒出這些想法…因為這本書太多個人情緒,只憑一個人的片面之言就判斷一個人我覺得也很危險(畢竟這作者從書一開頭就激烈地表達了對戈巴契夫的強烈不爽 XD)比如說…他鬥走的人也許是保守派?不要忘記畢竟他上台時保守派的力量還是很大的,不然當初安德洛波夫病重時原本接班人打算直接交給戈巴契夫,保守派從中作梗才硬推一個老到快掛掉的契爾年科出來幾個月就掛掉。
我不知道為什麼,我一直對一些歷史上毀譽參半的人物有抱持著同情,想要幫他們緩頰、想相信他們是出自好意只是運氣不好才失敗才遭受攻訐,尤其像是戈巴契夫,除了他在民主國家之間的形象一向很好,看他的面相覺得好像人畜無害不像有什麼野心甚至有點蠢蠢的,應該是個好人吧(不知道為什麼看他的臉我一直想到監獄兔裡面綠色那隻…),還會想說這個人到底怎麼在蘇共這個處處是危險個狗屁組織裡爬到最高權力核心的,一直覺得很不可思議,是跟李登輝一樣腦袋清晰把自己想瓦解這個政權的真實想法藏在心底靠著謀略一步步往上爬嗎,還是能力真的很強被前人賞識提拔,抱持這這些不切實際又粗糙的浪漫幻想。
《意外的和平》裡面敘述的戈巴契夫倒是沒有這麼負面,不過也不是什麼人畜無害的綠色監獄兔就是了(這本書的考據之詳細真的大開眼界…難怪這麼貴,篇幅也比我預期的長)。一直砲轟戈巴契夫的那本《戈巴契夫傳》作者 Valery Boldin 在這本書中出現幾次的形象反而比較像是個「對國際事務不感興趣、會依照自己喜好故意不傳達訊息」的人,雖然根據當時情勢他國內事務應該就夠忙慘了。
「柯爾很擔心,他警告說蘇聯正急需援助來開放經濟。他批評說這場高峰會把戈巴契夫的要求當成是來自剛果。柯爾強調戈巴契夫在人權問題上做了很多,而中國的人權紀錄奇差無比,卻正在接受西方援助。他請布希解釋為什麼會有這種差別,布希回答說:『中國和蘇聯並不是一回事。』」 – 《意外的和平》
不是一回事…所以到底是什麼個「不是一回事」嘛。就只是想扶植第二敵人中共、一心想搞垮蘇聯而已,人權什麼的,在布希的心中似乎倒也不是那麼重要。
看這本書讓我對美國的好印象下降(精確的說是對布希沒好感,雷根相較下討喜太多了…)、反而有點同情當時的蘇聯改革派的尷尬處境了…(柴契爾夫人比較講義氣,書裡面是把她描述成「一旦做出決定(相信戈巴契夫並把他當作朋友)後就堅定不移(和戈巴契夫站在同一邊)」,當時她也有叫美國不要太過為難戈巴契夫。畢竟如果太過分,戈巴契夫很可能被保守派趕下台,可以看看當初赫魯雪夫是如何被趕下去的…)
蘇聯經濟在布里茲涅夫時代尾聲(1980)就已經爛到快不行了,油價跌了、同時農業與民生工業的生產力都拉不起來,軍工業比例又太高(除了 1941 巴巴羅薩行動讓蘇聯心有餘悸所以當時保守領導層沒人敢裁軍),加上入侵阿富汗一直燒錢,連東德經濟也是要死不活到安德洛波夫都半承認,到戈巴契夫時代就算想要開放市場經濟,美國說好的援助也說一套做一套。人權與言論自由的改善,卻跟蘇聯這個政權建立起來並維持了六十幾年的高壓極權方式互相牴觸(雖然這也證明了這個政權確實還是別存在比較好)。裁軍、減少對盟國金援與放棄布里茲涅夫主義,也讓一直維持華沙公約組織的力道消失。這情況還真的怎麼做都會失敗。即使當時武力鎮壓東歐,蘇聯大概還是沒辦法撐太久,經濟也不可能像受到外國資金注入的中共那樣好起來。
對一件人事物發表觀點、看的東西不夠多、或者看到的資料根本是錯的時,寫出的東西很可能就只是個笑話;然而即使看的東西多一點、而且資料也正確,如果自己沒整理過,很可能依舊被自己的情感以及偏見牽著鼻子走、寫出的東西依舊還是笑話。有時候心理也許不是那樣想,寫出來的東西自己當下也沒注意,後來再反芻才發現自己想法有問題、破綻一堆。我自己的經驗是覺得,人很難承認當下的自己的想法有問題,所以我現在盡可能不要堅信自己當下的直覺反應,尤其是有牽動到自身情緒的,這種情況下很可能都有出錯。
比如現在中国似乎因為冒出一些被稱作「新左派」的群體在宣揚蘇聯的美好,老實說看過一些他們寫的文章或影片還真的蠻令人嚮往想說那時代就有這麼先進的理念,也看過一些用來佐證用的「當事人訪談」,但那種當事人訪談多少都有生存者偏差或者採樣偏差。實際去讀過一些普通蘇聯人的訪談資料或親身經歷就會發現:
中国新左派這些避重就輕的行為我多少可以理解啦,畢竟人的情緒多少會想把一些對現實的不滿以及對未來的希望投射在已經消逝的理想國度。好像有個俄國文學家(抱歉沒記住是誰,我毫無文學素養)講過「俄國人懷念過去、痛恨現在、害怕未來」,雖然我覺得不只俄國,大多數人天性多少都是這樣啦。很容易讓人不小心把這些故意避重就輕寫出的的引人入勝的故事當成歷史,雖然就算你搞懂「相對比較精確的」歷史意義也不大,也改變不了什麼、大眾也不會想要知道比較正確的事實,而是偏好比較有趣的故事。畢竟讀歷史還有一點很討厭:除了你的情緒可能影響你的判斷,寫的人的情緒影響你的判斷,或者根本就非常有可能是惡意偽造的。畢竟像中夭或 TVBullShit 這種現代的新聞媒體都能生產一堆假新聞,何況已經過去三十年以上的紀錄。想到這點我就覺得研究歷史可能是世上最沒有意義的事情之一,你讀的東西真實性可能只比異世界小說好一點,但異世界小說又好看得多。但歷史他被歸類成「人文科學」我覺得實在非常尷尬,他不像數學物理化學可以重複推導實驗得到相同結果,也不像語言學文學可以分析並得到不會分歧過大的結果,歷史完全就是個垃圾滿天飛的 Garbage In, Garbage Out 的學科,你只能在這些人為的垃圾堆上面考據,你也無法確定哪些是垃圾哪些是真的無偏見的事件記述。
所以看這些東西就會再次想起「不要判斷人、免得你們被判斷」,要造謠太容易、要造神太容易(比如湯瑪斯愛迪生)、要污衊太容易(比如林智堅)。讀歷史只會覺得人類就是充滿缺陷的垃圾生物,人類還不如不要有智慧會比較好。
我一直以來都覺得我不是一個聰明人,我寫東西都會一再修正一再修正,一個作品修個七八年都有。我知道沒啥人會在意我,更不會在意我怎麼想,網路年代要發言根本不需要成本,只是差在你有沒有掌握到聲量而已。所以我寫這堆東西只是為了自己,整理一下自己的腦中垃圾。在寫這篇文章時我也一直覺得自己的想法好蠢,寫下來後重讀幾次更是發現怎麼漏洞這麼多,也許寫下來同時也才能釐清自己的想法。比如我發現我明明看過了那麼多蘇聯幹過的鳥事(《耳語者:史達林時代蘇聯的私人生活》、《二手時代》之類的)、也知道自己對蘇聯有著不切實際的幻想、但實際寫下來重讀幾次後才發現我到寫出來之前依舊時不時地對於蘇聯過度偏袒。自從 1956 匈牙利革命就已經造成當時各國一堆共產主義者對蘇聯失望、1968 布拉格之春又失望了一批(比如間諜傳記《叛國英雄・雙面諜 O.A.G.》的主角 Oleg Gordievsky (Олег Гордиевский) 就是因為布拉格之春對蘇聯徹底失望才倒戈到英國),理論上知道這些事後我不該還有偏袒蘇聯的心態才對。雖然我覺得蘇聯本身的意識形態(共產主義)確實可能是人類史上最容易被美化的觀念之一了,因為他的名號太正義凜然了。
20221229 寫完這段,在 20230124 又看到一本書的摘錄《蘇聯的恐怖統治:古拉格集中營的歷史》,也提出了類似看法:
選購蘇聯紀念品的多半都是歐美人士。這些人想到要把納粹黨徽別在身上一定很反感,卻覺得把鐵鎚鐮刀徽章(蘇聯國徽)別在 T 恤或帽子上沒什麼大不了。
(…)
對很多人來說,史達林的罪行不像希特勒的罪行令人打從心裡不齒。英國前國會議員、現任倫敦市長李文斯頓有次試圖向我解釋其中的差異。沒錯,納粹是很「邪惡」,他說,而蘇聯只能說是「偏差」。這個論點跟很多人不謀而合,這些人認為蘇聯只是走偏了,不像納粹德國那樣錯得離譜,而且抱持這種想法的人不只有老左派。
(…)
直到一九八○年代仍有學者稱許東德的醫療保健或波蘭的和平倡議,也仍有社運人士為東歐戰俘營裡的反抗活動引發的混亂而感到難堪。或許這是因為西方左派的創始人馬克斯和恩格斯,同樣也是蘇聯左派的鼻祖。雙方連用語都有重疊之處,例如群眾、鬥爭、無產階級、剝削者、被剝削者、生產資料所有制。因此太過用力譴責蘇聯,就等於譴責了部分西方左派擁護的價值。
打死都不替希特勒說話卻會為史達林辯解的人,不僅限於極左派和西方共產主義者。共產主義的理想(社會正義、人人平等)對多數西方人來說,就是比納粹鼓吹的種族主義和優越主義更具吸引力。即使共產主義一落實就變了個樣,但美國革命和法國大革命的傳人還是很難譴責一個起碼聽起來跟自己的制度很像的制度。
或許這多少可以解釋,為什麼從沒想過要質疑普里莫‧萊維或埃利‧維瑟爾的納粹集中營回憶錄的人,卻往往一開始就否定或貶低了古拉格的見證紀錄。
(…)
戰後,盟軍把成千上萬俄軍強制遣返,等於叫他們去送死,把數百萬雅爾達人交由蘇聯統治,不啻於助人為虐。一旦承認這些事實,就會破壞那個時代在我們心中留下的正義形象。誰都不希望我們是靠著一個劊子手打敗了另一個劊子手,更不想記得這個劊子手曾跟西方政治家相處融洽。「我真心喜歡史達林。」英國外相安東尼‧艾登曾經告訴友人,「他從不食言。」歷史上也留下許多史達林、邱吉爾和羅斯福開心合影的相片。
《古拉格的歷史(上):源起(一九一七至一九三九年)》 - Anne Applebaum - 左岸文化
(2015 出版,現已絕版,且無出版電子書。常常覺得台灣的出版社是不是並不算夕陽產業而是他們都自願在節食啊?常常想買來看卻找不到電子版、要不就是沒有 EPUB 格式無法用 TTS 聽完所以買不下去,笑死。)
網路上翻牆出來罵人的支那人很常拿來罵臺灣人的句子就是「有没有读书?多去读点书」,我倒是很好奇這些支那韭菜是都讀了什麼书。
前面讀了一堆歷史,但其實我這五六年來都這樣覺得:讀書從功利角度來看,甚至不用從功利角度來看,都是沒什麼用的。除非你是某些特殊領域的人(比如學術、政治等),否則閱讀對實務是沒什麼幫助的。我自己一向是為了興趣在讀的。
就跟讀歷史一樣,學生時代學生最常問老師的問題就是「我們幹麻讀歷史」,國中時代(含)以前我也非常討厭讀歷史,現在我倒是蠻喜歡的,然而我依舊覺得讀歷史沒什麼用,但是有趣。然而我無法說服也懶得說服不覺得歷史有趣的人去讀一點歷史,尤其我讀的歷史也很不均衡非常偏食,比如幾乎只著重在 1910 ~ 1990,你也不可能說服我去讀其他年代的,我就真的對一堆落後野蠻的文明沒什麼興趣。
常常聽到「文明沒有高下之分」,這種說法我個人是覺得有夠左啦。會拿活人祭祀的文明、或者搞女巫狩獵的文明、或者把女性用鐵鍊鎖著、或者關在全黑罩袍下一輩子待在家裡侍奉男性的文明等等,你硬要說他們也有可取之處的話,那我只能祝你下輩子投胎到那種地方去好好享受你的價值觀。
之前升大學考過某知名國立歷史系,口試分數很高,但筆試全部都是我最厭惡反胃的中国史幾乎全錯,理所當然就考不上(我念的社會組中國史已經囉唆又細、課本跟補充資料厚到讓人髮指了,這歷史系考題則根本是整人程度,一堆聽都沒聽過的狗屁支那歷代政權搞出的制度等等,考這到底是想篩出怎樣的考生?),這種考試我覺得根本不公平啊,不過他們訂的遊戲規則就這樣,我就算用我現在的歷史知識去考只會更低分,因為我的支那史早就(故意)全部吐回給老師了,髒東西沒必要浪費腦容量記住。而我現在二十世紀世界史再熟也沒用,因為該歷史系考題幾乎沒有二十世紀世界史。
文化素養這種東西,學了幾乎不可能讓你溫飽,可以當興趣培養看看,覺得有趣就當休閒嗜好,但你不該指望這會是什麼萬靈丹,或者期待「知識就是力量」這種騙肖ㄟ雞湯爛梗。「花很多時間鑽研」不代表它真的有用,比如大清國就一堆考據學的可悲學者,他們一輩子窮畢生精力都在考據一堆無關緊要的鳥事上,因為政權不允娶他們發展自己的思想,只好研究一些對現有政權沒有危害的字音字形字義四書五經禮儀有的沒的屁事上,就這樣渾渾噩噩過一生,難怪會亡,笑死。
台灣這幾年網路上似乎有種「重理科輕文科」的風氣,每次不管發生什麼鳥事動不動「又是文組」,好像讀理科已經變成一種尊絕不凡的身份地位與認同。對這種把一個人大學考到什麼科系當作一生用來自我滿足的白痴無話可說呢,人生只剩學歷,同時對於自己沒有什麼文化素養沾沾自喜。最近有一個以某知名日本傳說中的妖怪來命名的 YouTube 頻道,頻道主會用非常馬基維利主義的史觀去解釋歷史上與世界上的一切,在他的史觀裡面沒有獲得權力的被統治者都是奴隸,是蠻有趣的觀點,雖然就我所理解,我猜在他眼中像藝術家作曲家作家漫畫家這些創作出娛樂作品的人應該會被歸類成「幫統治階級創造出鴉片、讓奴隸有低級低成本的娛樂、使奴隸不會反抗統治者」而已,但我個人就算是統治者也會比較想生活在藝術文化活動興盛的社會啦。
戈巴契夫的「改革(перестройка)」當時被笑話的其中一點就是「大家都不知道到底要改革什麼、要如何改革才能解決當時蘇聯遇到的經濟困難」,而這個「改革」所做出的具體政策是大幅開放言論自由,但這顯然不會改善當時的經濟狀況。這「改革」好像就有點像「文化素養」這種東西,言論自由確實該開放,但他並不是問題的解方,只開放言論自由而沒有其他動作、蘇聯當時最嚴重的問題(經濟)不可能自己好起來。文化素養也是,你讀書學音樂學繪畫學外語學歷史在絕大多數時候應該改變不了你的生活或經濟狀況,但不代表你不能從中獲得無形的好處,比如樂趣。
歷史這種東西為什麼覺得有趣,我覺得幾點是因為歷史可以讓人知道人類幹過多少蠢事,知道這些蠢事以後,並沒有辦法避免以後不再發生這些事,而是知道人類以後還是會繼續幹這些蠢事,不斷的循環下去…然後如果本來是很容易激動的人,可能就會變得比較…懶得生氣。然後也可以避免動不動在批評時政時隨便根據「自己擅自想像出的理想中的美好歷史或地理」講出一些乍聽很有理實際很空洞的觀點(除了「台灣現在就是太自由才會亂、以前戒嚴時社會多和平穩定」這種超常見的黨國奶水發言外,還有「台灣政府在 XX 上爛透了,國外哪有這樣」之類,但要他說出具體是哪個國外、以及該國稍微詳細一點的狀況、該國與台灣在該方面有什麼優劣、等等對方大概都說不出來)。可以看像是社會主義、馬克思主義、巴黎公社、費邊社、蘇維埃社會主義共和國聯邦這些的人類文明崇高的烏托邦理想是在怎麼樣的時空背景下誕生,又是如何實踐後走向消亡的。比如現在很多人一聽到「社會主義」就皺眉,我猜他們應該是直接聯想到中共,但現在中共與中国本身都只能算極右派,跟北韓一樣社會主義只是神主牌,做的事情則是極致的民族主義,北韓跟支那兩國都根本遠遠稱不上社會主義國家。馬克思那個年代的歐洲是工業革命後、一堆僱用童工、一堆禁止工人看時間(好剝削他們休息時間)的雇主、工人毫無保障、貧富差距奇大的社會(而不是只是現在滯台支以及藍白黃最愛整天靠夭的「小老百姓都要餓死了」這種程度的矯情爛演技爛台詞),在這種時空背景下出現社會主義很正常吧。然後看著這些歷史我都會直覺的算年份比如「這個人 1895 出生,活了 70 歲,他經過了哪些歷史事件…」就這樣讀完一個人的一生,再次感到人生的可怕。
– 20220517 草稿
– 20220910 ver1
– 20221229 ver2
– 20230125 ver3
– 20230206 ver4 發現硬碟裡躺著 20220517 就寫過的草稿所以合併回來這篇,超過兩萬字了…
– 20230918 ver5
我是平板電腦重度使用者,Android 平板從 2014 年開始前前後後已經換了三台,但由於我越來越受不了 Android 從 10 開始越來越嚴苛的系統限制,每升級一版 Android,Google 都會想出更新的花招來惡搞使用者,跟 Android 本身一直以來的弱項(比如你絕對不會想在 Android 寫文章或者寫程式,即使 Samsung 搞了個 DeX 但實際用過你就會發現這玩意垃圾得大概只能算是能給他們內部員工達成考績用的專案而已),這幾年來越來越想要一台 Linux 平板:一台系統完全沒有任何限制的平板,我想把檔案存在哪就存在哪、app 想開什麼檔就開什麼檔、我想幹麻就幹麻,不要跟 Android 一樣限制一堆跟我咭咭歪歪(Android 11 開始,整個系統大概只剩讀寫 /storage/emulated/0/Download/
是完全不會有問題的)。
Samsung Galaxy Tab S6 的筆本身非常流暢好用,但…除了 PDF reader 看譜寫注記以外,其餘很多時候我都很懶得用它,因為 app 用起來實在太煩人了。比如很多時候我只是要一個做像是抓兩張螢幕截圖、放在同個圖檔中並排、上面寫點字之類的,在 Android 裡面做這件事只會抓狂,光是在合適的 app 裡開檔找到那兩張圖片的路徑用起來就很煩人(其中一個原因大概是我很習慣檔案管理員這種概念,聽說一般使用者是不習慣的,所以 iOS 還是 Android 本身都沒有內建檔案管理員的原因就在這裡…但對我來說就很痛苦,即使裝了第三方的還是很難用,處處限制)、更別說 app 本身試過 n 套沒有一套滿意(不過這也可能是因為我傳統桌面環境用太習慣)、存檔路徑會再次煩死你,然後分享圖檔出來你來要再被那路徑煩一次…。
Android 我現在很受不了檔案系統權限越綁越緊,一堆我常用的程式連運作都開始出各種問題,比如 Syncthing 還有 MyBible(升級 storage API 後閱讀紀錄跟筆記都不見了…),但 Google 搞得那麼複雜、搞到可信任的 OSS 程式很難正常使用、卻繼續放任像是抖音洨米這些垃圾中共間諜程式開一堆用不到的權限還能上架 Google Play,而且到現在卻能然沒辦法讓使用者自己「限制某程式只能使用某路徑」,反正 Google 一直以來都幹些匪夷所思的爛設計,也不是很意外。
對我來說一定要滿足幾點:
Linux 平板麻煩的是硬體支援問題,所以像是 Acer 或 ASUS 雖然有出一些萬元左右的觸控小筆電,但查過以後發現可能連 eMMC 的 driver 都有問題,而且這些小筆電都靠北重…逛一圈基本都 1.4KG 以上…我主力筆電就 1.5KG 而已,一台小筆電還能做到這麼重…以前我用的 EeePC 901 也才 900g 啊… 也有想過買 Chromebook,但我想 ChromeOS 的系統限制用起來大概跟 Android 不會差多少,而且也是都重得要命,加上系統都鎖住不讓你灌原生 Linux 的。
後來看來看去似乎只有 Microsoft 出的 Surface 系列能滿足 Linux,主要是使用者數量夠多(這也代表有夠多人會想拿來灌 Linux,比如現在的 Linux Kernel 的 Surface 硬體支援就是由 linux-surface 專案貢獻的,看活躍程度可以知道使用者有多少)、台灣容易買也有售後服務、而且這也是是你在市面上能找到最輕的筆電了…
但 Surface Pro 系列我覺得太重太大了,都 13” 而且不含鍵盤就已經 700g 起跳,所以我只看 Surface Go 系列。從 Surface Go 1 出來後我就一直在關注沒下手,因為在燦坤玩展示機發現跑起來那個 Intel 4415Y 只能用「又慢又燙」來形容,後來就買 Galaxy Tab S6 了。Surface Go 2 出來後…還是 Intel 燙死人處理器 4425Y 或 m3 8100Y,燦坤展示機一樣又慢又燙,所以又放棄了。但忍到 Surface Go 3 後還是 6500Y 或 i3-10100Y,而且很多 Review Report 都回報說電池續航力降低到 Go2 的一半只剩 4~5 小時左右 … 算了我現在確實是有需求需要這台機器,Go 3 國外上市後密切注意 linux-surface 的消息跟 Reddit 大家的硬體支援回報,等 12 月中台灣一上市第一天我就直接去赫普電腦 i3 / 8G / 128G / 四年延長保固直接刷下去了,NTD 29365。
後來才我發現燦坤展示的都是最低階的 Pentium 版本,所以慢是正常的…
原本還想說用一段時間 Windows 11、等 linux-surface 把 Go 3 的硬體支援弄好一點再安裝 Linux,結果想想算了我一點都不想在 Windows 下做打電動或使用專有軟體以外的事情,幹麻浪費時間跟 Windows 培養感情,所以 Windows 11 開機、跑完慢到靠北的 Windows Update(可能會包含韌體更新)後,機器來的第一晚我就直接灌 Manjaro Linux 了。
Secure Boot 直接關掉懶得管了,去你的 Secure Boot。因為才 128GB,我直接把 Windows 磁區幹掉。我一向都是手動分割,但第一次安裝時我忘記現在的 UEFI 跟以前 MBR 年代不一樣,即使你沒有要做 dual boot,似乎仍然一定要有一個 FAT32 的 EFI 磁區才可以順利開機,所以我第一次裝就把 Surface Go 3 搞到開不了機了 XD。還好做個 Windows 11 開機碟讓他重裝 Windows 11,然後再裝一次 Manjaro,就成功了。以下是我的分配:
1 | (parted) print all |
/
ext4(我還是不敢嘗試 Btrfs),我知道看起來有點太多,不過我這次安排有 16GB 是要放在 / 的 swapfile,而沒有獨立的 swap partition,這樣比較有彈性,當系統升級空間不夠時還能先把 swapfile 幹掉動態調整。/home
然後用 LUKS 加密。先說說 Surface Go 3 硬體本身…
裝完 Linux 第一個感覺就是機器變好涼、反應速度變好快… Windows 11 一開機就不知道在瞎忙什麼鬼沒事閒著機器就開始發熱而且操作速度感覺沈重,跑 Windows Update 時慢到什麼都做不了而且整台機器燙像暖暖包;Linux 下就算跑 VSCode + Webpack + TypeScript 都沒這麼燙…看來之前評測報告寫的 Go3 續航力只剩 Go2 的一半,大概全部都是 Windows 11 的錯,ㄏㄏ。Linux 實際續航力一般使用(螢幕亮度最低、Wifi 打開、大部分時間都在用 Emacs)大約可以連續使用 8 ~ 9 小時,電量剩 13%。
原本想說這顆沒有風扇的 i3 CPU 不強,可能要裝 LXQt 了,但管他的 KDE 裝下去,媽呀超順的啊,至少 KDE Plasma + KWin 跟 Firefox 這兩個原本以為很吃效能的軟體,一般操作非常流暢,跟我的主力筆電 i5 8265U / 24G 幾乎一樣…(沒有誇飾),但 Emacs 啟動速度就慢大概一半了(Single thread 的關係?)所以趁機把我的 .emacs.d 用一堆 autoload 最佳化了一下啟動速度。
硬體支援有了 surface-linux 的 kernel 後,除了 Webcam 仍然無法運作以外其他都大致正常。
要稱讚一下 KDE,兩年半前 KDE 5 的觸控還很難用的,現在進步很多,手勢做得相當好用,雖然跟 GNOME 3 那種一開始就針對觸控螢幕設計的仍然有一段差距(比如 KDE 現在依然沒有支援旋轉螢幕,我自己是寫 Script 做到),但以我自己的需求 KDE 5 就已經足夠好用了(何況我已經太熟悉 KDE 了不想換 :P)。
Firefox 的觸控支援出乎意料的還不錯(當然 Chromium 應該會更好,但我不用 Chromium),雙指 pinch 縮放也支援。終於不用忍受 Android 版本的 WebExtension API 限制了 (那個 browser.downloads
什麼時候才打算加回來…),搭配最近寫的針對了觸控螢幕最佳化的 Booru Shinshi ボール紳士 就是個完美的廢宅抓圖機。不過整體觸控體驗畢竟還是不可能跟 Android 比啦,畢竟本身還是桌面系統,即使 Windows 10 / 11 的觸控依然也沒做得很好,相對的 Android 的滑鼠鍵盤支援一樣也很廢 XD 各有所長啦,畢竟我買這台本來就是拿來補 Android 平板不足的地方。
我怎麼覺得 Xournal++ 用起來比我在 Android 用過的任何一款模擬紙筆的筆記軟體都簡單好用…筆在 X11 下也正常運作。筆以我的使用情境來說,使用頻率比 Galaxy Tab S6 高太多了,Xournal++ 當計算紙、分享給別人討論觀念都非常方便。
我常常躺著用,所以想阻止 「gyroscope 會偵測目前機器方向自動把鍵盤關掉」這個功能…好像是寫死在 kernel module 的…我目前還沒找到什麼好辦法。
It can reverse the <table>
without JavaScript. This is quite usable under some particular scenarios.
Another method to reverse table rows doesn’t need flexbox — rotate <tbody>
and <tr>
180 degree:1
2
3
4
5table.reverse {
tbody, tbody > tr {
transform: rotate(180deg);
}
}
This works under latest Chrome/Firefox for macOS/Linux pretty well. However, this will rediculously corrupt the rendering of Electron. (tested under Electron v1.7.8 for Windows). I don’t know why.
I use the terms of HTML’s native table, so it’s more comprehensible for experienced HTML developer.
1 | .flex-table |
1 | .flex-table { |
I don’t know why, openSUSE and Chakra, the two KDE distro seems reluctant to setup the fonts and make their Konsole available out-of-box….
If your konsole
(or any other terminal emulator) cannot display text in bold, or characters cannot align correctly, you can:
konsole
to monospace
.Create a file /etc/fonts/local.conf
:
1 | <?xml version='1.0'?> |
binding="strong"
to forcely set.- You can re-order the
<family>
‘s in<prefer>...</prefer>
by your personal preference. I likeDejaVu Sans Mono
.
Save, then run as root:
1 | fc-cache -v -f |
Restart your konsole
, wow.
]]>You also can use
fc-match -s monospace | less
to see if it took effect.
My usage senario
- Left macOS (currently High Sierra + APFS) minimun required space to upgrade itself.
- Defaultly enter Linux when booting.
- Enter macOS by press alt key when booting.
Use macOS to resize APFS partition.
- Ensure FileVault has been disabled and decryption is finished. (I doesn’t try to skip this step so I don’t know what will happen if not)
- Left default 200MB EFI System Partition (ESP) untouched.
- Resize original macOS’ APFS partition until 20GB free space left for system upgrading.
- Created a FAT32 partition on all remained unallocated space.
/
and /home
partition./boot/efi
, add flags boot
and esp
.My example:
MountPoint Number Start End Size File system Name Flags 1 20.5kB 210MB 210MB fat32 EFI System Partition boot, esp 2 210MB 90.9GB 90.7GB apfs Macintosh HD/home 3 90.9GB 216GB 125GB ext4/ 4 216GB 250GB 34.0GB ext4/boot/efi 5 250GB 251GB 472MB fat32 boot, esp
MacBook Pro mid-2015 use BCM43602
network card:
$ lspci | grep Network03:00.0 Network controller: Broadcom Corporation BCM43602 802.11ac Wireless LAN SoC (rev 01)$ dmesg | grep brcm$ lsmod | grep brcmfmac
According to Arch Wiki, this card should has been supported by kernel itself (brcmfmac
).
I don’t know why it doesn’t enabled out-of-box, but it still can be enabled manually:
modprobe brcmfmac
echo brcmfmac > /etc/modules-load.d/brcmfmac.conf
Trouble shooting: Still not works after adding
.conf
intomodules-load.d
?It’s possible that
brcmfmac
was added intoblacklist
inmodprobe.d
.
According to the man page of modprobe.d,modprobe.d
is located at:
/lib/modprobe.d/*.conf
/etc/modprobe.d/*.conf
/run/modprobe.d/*.conf
Ensure
brcmfmac
is not be added into blacklist by any.conf
file. (That is to say, if you findblacklist brcmfmac
, remove that line.)
This is Source
Add to rc.local
1 | #!/bin/sh -e |
fn
key + F1 ~ 12
Test
echo 2 > /sys/module/hid_apple/parameters/fnmode
Permanently:
echo options hid_apple fnmode=2 | sudo tee -a /etc/modprobe.d/hid_apple_fnmode.conf
Reboot, done!
https://wiki.chakralinux.org/index.php?title=Fcitx#CTRL.2BSpace_does_not_work
If you cannot invoke fcitx
when Ctrl + Space
, but fcitx
runs in background without problem, please check your locale, and make sure your locale is un-commented in /etc/locale.gen.
If you sure locale is correct, run fcitx-diagnose
to see what should added to ~/.xprofile
.
Adjust all fonts
-> Set size to 14.0
12.0
96
font DPI seems to be default value. Not recommend to increase font’s DPI for enlarging text, because this makeGDK_DPI_SCALE
a mess.
Scale Display
, adjust to 1.0~/.xprofile
1 | # === Qt ========================================= |
Adjusting
Scale Display
to 1.3 will cause Konsole’s display broken.
- KDE system settings -> Fonts -> Font
- Set Font’s DPI to 148
- Display and Monitor -> Displays
- Click
Scale Display
, adjust to 1.3
Open ~/.config/plasma-org.kde.plasma.desktop-appletsrc
, find a section looks like this, a lot of items:
1 | [Containments][8][General] |
Append one line in this section:
iconSize=2
Save file, Alt + F2
kquitapp plasmashell;kstart plasmashell
to apply.
kquitapp
can also bekquitapp5
orkillall
ssh-agent
+ ssh-add
+ ksshaskpass
Use
ssh-agent
to cache your SSH passphrase when login into KDE, so you needn’t enter passphrase whenevergit push
.
ksshaskpass
Edit (if not exist, create it) ~/.xprofile
(or ~/.xinitrc
), add following 3 lines:
export SSH_ASKPASS="/usr/bin/ksshaskpass"eval $(ssh-agent)
Add ssh-add
into KDE System Setting -> Startup and Shutdown -> Autostart -> Add Program...
I don’t recommend to place
ssh-add
also into~/.xprofile
, because when you login from SDDM, you cannot use the saved passphrase in (locked) KWallet.
Run xdg-user-dirs-update
, then ~/Picture
, ~/Movie
… generated. See https://wiki.archlinux.org/index.php/XDG_user_directories
monospace
font in Konsole
See my another article configure monospace fonts for terminal
hunspell
and its directories for Firefox’s spell checkingSYSTEMD_LOG_LEVEL=debug systemctl status mbp-suspend.service
Just buy a USB external SD card reader to solve this shit.
dmesg | grep SD[ 1.084301] scsi 0:0:0:0: Direct-Access ATA APPLE SSD SM0256 SA0Q PQ: 0 ANSI: 5[ 1.975499] scsi 1:0:0:0: Direct-Access APPLE SD Card Reader 3.00 PQ: 0 ANSI: 6[12968.934410] scsi 1:0:0:0: Direct-Access APPLE SD Card Reader 3.00 PQ: 0 ANSI: 6
scancode
-> keycode
conversion)I still not found the solution for this need. I’ve asked and been waiting for answser on StackExchange
See https://wiki.archlinux.org/index.php/Map_scancodes_to_keycodes
Generic input devices (also USB keyboards) identified by the usb kernel modalias:
evdev:input:bBUSIDvVENDORIDpPRODUCTIDeVERSION-MODALIAS
Run less /proc/bus/input/devices
and find section like this:
I: Bus=0003 Vendor=05ac Product=0274 Version=0110N: Name="Apple Inc. Apple Internal Keyboard / Trackpad"P: Phys=usb-0000:00:14.0-12/input1S: Sysfs=/devices/pci0000:00/0000:00:14.0/usb1/1-12/1-12:1.1/0003:05AC:0274.0004/input/input7U: Uniq=D3H624316K1FTV4A63PSH: Handlers=sysrq kbd leds event7B: PROP=0B: EV=120013B: KEY=10000 0 0 0 1007b00011007 ff9f217ac14057ff ffbeffdfffefffff fffffffffffffffeB: MSC=10B: LED=1f
Run showkey --scancodes
in TTY:
scancode (hex) | keycode | |
---|---|---|
capslock | 3a ba | 58 |
———– | —————- | ——— |
fn | – – | 464 |
leftctrl | 1d 9d | 29 |
leftalt | 38 b8 | 56 |
leftmeta | e0 5b e0 db | 125 |
———– | —————- | ——— |
r_control | e0 5c e0 dc | 126 |
r_alt | e0 38 e0 b8 | 100 |
/etc/udev/hwdb.d/
/etc/udev/hwdb.d/10-apple-kb.hwdb
1 | evdev:input:b0003v05acp0274e0110* |
1 | th.ssid { width: 100%; } /* Not necessary, but I guess you may want this*/ |
Q_PROPERTY()
s, getters, setter slots, signals, and private member variables. They will makes your class a mess (any mostly are duplicated). For example, a QString myFoo
:1 | class MyObjectExposedToQml : public QObject |
Though only one property here but has been nearly create a getter/setter/signal/variable hell. So make some macros to get rid of these shit:
Important: in macro definition,
signals:
andslots:
must be replaced withQ_SIGNALS:
andQ_SLOTS
. Otherwise compilation will fail.
(this problem cost me hours to find out…)
1 |
|
For those who have ever used Angular / Vue and their data-binding
If you have ever used Angular / Vue, you should be familiar with its easy-to-use data-binding; framework will aggressively watch if any value in model is modified, then update view automatically. But QML is not that smart.
This is how QML’s data-binding syntax looks like:
1
2
3 Button {
text: my_object_exposed_to_qml.myFoo
}
Equivalent to JS’s
1
2
3
4
5
6 Button {
Component.onCompleted: {
// Qt.binding() is required, otherwise Button.text won't be updated when myFooChanged() signal is emitted.
text = Qt.binding(function(){ return my_object_exposed_to_qml.myFoo })
}
}
QML’s property binding actually relys on Qt’s signal, (e.g.NOTIFY myFooChanged
above), QML itself will NOT aggressively watch the modification from getter function. The specified signal (NOTIFY signalFunctionName
) must be invoked (e.g.emit myFooChanged
), then QML side can know that the value of property is changed.
Therefore, in C++, use setter (or emit signal manually) instead of assigning the member variable directly, otherwise QML won’t be notified when the value is changed.
1 | class MyObjectExposedToQml : public QObject |
Oh yeah!
]]>Surely it’s not a good practice to place function definition in header. But if you need, you can think how to do that. (This is against the topic of this article.)
ComboBox
on a Flickable
, you may unhappily notice that ComboBox
steals your mouse wheel events on Flickable
.I think an UI component like ComboBox
which accepts mouse wheel event is totally a stupid idea and a great anti-pattern of UI/UX (the value of ComboBox is quite easily to be accidently modified). However, the API of QtQuick Controls, no matter 1 or 2, are totally moron. They totally don’t provide any API to deal with a lot of shit. So you have to workaround it:
1 | // MyComboBox.qml |
Component.onCompleted
), use a while
loop find any parent component has flick
attribute. If found, assign _flickableItem
property as it.MouseArea
to “steal the wheels events back”, which invoke _flickableItem.flick()
when onWheel
.Promise
and setTimeout()
:1 | var callAPI = (api, arg) => new Promise((resolve, reject)=>{ // <- callAPI() always return this promise |
Use like this:
1 | callAPI("AddUser", { username: "ib", password: "ib" }).then((x)=>{ |
1 | API "AddUser" called successfully! ==> {"username":"ib","password":"ib"} |
When you have to call a lot of asynchronous APIs simultaneously, you may use Promise.all()
like this::
1 | var newUsers = [ |
1 | API "AddUser" called successfully! ==> {"username":"marry","password":"marry"} |
Now consider: how to call APIs one-by-one? That is to say, after previous API has replied, then call another?
The answer is: pass another Promise
into resolve()
:
1 | var newUsers = [ |
1 | API "AddUser" called successfully! ==> {"username":"ib","password":"ib"} |
]]>When you pass a
Promise
object intoresolve()
, that passedPromise
will going to be resolved.
See Promise.resolve() and Promise to get more details.
這篇紀錄了我目前為止的一部分關於這個世界的想法,內容估計會得罪非常多人。如果你我有緣,看到了這篇文章,且有什麼想法得罪到你,開罵前懇請先冷靜下來,願意的話我們可以討論,畢竟很有可能邏輯錯誤的人其實是我而不是你。
我很尊敬的程式設計師唐鳳很常講的、很注重的一點:溝通。我期望自己總有一天能夠有那種邏輯與耐心與脾氣。
這是我很反感的言論類型之一:「一代不如一代」 ,這種倚老賣老式的感嘆言論並沒有價值。明明厲害的年輕人就一拖拉古,你沒好好看他們明明在那逐漸發光發熱,硬要說一代不如一代。
即使是想法在老一輩的人中已經算是開明的我爸,也是常常會講「現在的年輕人喔…balabala…」 ,不過我都會提醒他,講這種話就是心態已經老了。
momohecha: 「剛被一個老人嗆年輕人用網路獲取新知不如書有溫度,媽的你要不要試一下我多開 Chrome 分頁的電腦溫度」
不太好意思反問你誰是白癡。
我覺得愛把「社會病了」、「世風日下」掛在嘴邊的人也都是沒看到重點:社會沒有病,而是人性一直都是那樣,只是你們一直用不存在的烏托邦式的理想標準去評估這個人類社會而已(其實我自己也常常這樣,例如很多社會、人權、性別議題,我也在反省…)。聖人並不存在,如果存在他們應該也已經涅槃成佛去了,你不會見到他們。每個人都有缺陷,要如何接受自己的缺陷比較重要。忘記國高中唸過的一堆讓人想睡的儒學了嗎?「堯舜既沒,聖人之道衰,暴君代作,世衰道微」他們也是整天堯舜掛嘴邊,罵世道有多亂。過了兩千年還在罵,一點進步也沒有嗎?怎麼可能,光是人權概念漸漸普及而不是那種「君要臣死,臣不得不死」的封建概念就已經贏古代了。再以犯罪來說,除非是極端的社會,否則我不覺得有辦法藉由改變社會來減少像是隨機殺人一類的犯罪發生。但對普通的犯罪而言,環境我相信是有影響力的,看美國跟北歐的監獄人口/總人口比例就知道。
我從不認同這句話。
家長跟教育家超愛「檢討」教育體制,我覺得他們根本完全抓錯重點。
我個人覺得,義務教育只要做到能夠滿足幾點就成功了:
….等一下,列出來後才發現好像真的還蠻難的。目前很多老師自己前三項都不合格了吧。
國中時,因為那時已經讀到一些關於白色恐怖的歷史,對蔣介石印象非常差(不要說我被別人灌輸,從小我爸就常跟我們講這些但我們都不聽,這些事情是自己後來自己去亂逛維基百科一類的東西才開始認真了解的)。有一天我看著教室後方發黃了的蔣介石肖像畫,突然腦洞大開,拿了便利貼做了兩根翹鬍子貼在牠臉上。後來我們班導上課上到一半,突然停下來,皺眉說「是-誰-在蔣公臉上畫東西的?」全班都在看我,「大不敬啊,去弄掉!」『欸為什麼?!』「去弄掉!」『(碎碎念一邊走過去弄掉)啊不就一個殺人魔嗎…』。這件事一直印象深刻。
上大學後回想起來,國高中小的教育所學的東西除了識字書寫外,從來就不是為了讓你學到生存技能。除了英文與數理,其餘科目都帶有相當的洗腦成分在。考大學拼命 K 書那段期間,當時甚至覺得是這輩子最充實有成就感的日子,後來才知道這叫作斯德哥爾摩症候群。
像那種「如何教出第二個唐鳳」(看標題就知道是廢到不行的廢文)的給家長看的文章,我覺得,當你一旦有這種念頭時,你的小孩就已經準備變成大量飼養的肉雞。
在麥當勞,小孩在遊樂區時總是能聽到一堆家長在聊育兒經,教育補習成績升學什麼的,今遇到一桌媽媽,聽談吐與對話內容實在令人印象深刻地鄉愿。
想起來高中三年最大的願望除了考上國立大學外,其次就是早自習能盡情給它睡到天翻地覆。國高中的早自習我都是在彌留狀態下硬撐開眼皮試圖用最快速度寫完考卷然後好好給它睡死一覺(但很少成功,考卷都寫太慢,要不就是根本沒寫完就倒下去了)這是我高中的平時成績很差的原因之一,小考的平均在 6,70 左右徘徊。就算當天課程當中都沒有小考,當天的早自習仍舊有考試。 偶爾早自習會非常罕見地沒有考試,但就跟怕夫洛夫的狗一樣反而會覺得「怎麼不考試?」,都忘記「早自習」這個詞原本是什麼意思了。
李豪:「台灣的父母老想把小孩送到歐美去讀書。
但是台灣的教育一旦要向歐美教育看齊,一說到要降低上課時數、取消早自習、終結體罰、鼓勵參加學生社團、刪除課綱要多元教育、停止校制服制度、同志婚姻和廢除死刑,就全部不知道怎教小孩了。」
即使是剛從國中畢業,奴性還非常堅強、對師長的教誨深信不疑的我,上了高中後,見到的美術老師竟然只讓我覺得真是毫無品味跟眼光可言、音樂老師更是大頭症。
我唸的高中在我進去時才剛創校沒太久,台灣比較新的法令有規定,公共建築或設施必須有 1% 的營建預算是用在公共藝術上。我們學校在建造時就是其中之一。所以呢,高一上的美術課幾乎整整一學期都在歌功頌德,介紹我們學校的公共藝術,偏偏這些東西爛得連我這種眼光的人都看得出來,還要背誦那些品味糟糕的公共藝術分別叫什麼名子,什麼「日落」、「意象之球」、「生命之環」、「超越之道」,超越之道…缺乏維護都已經生鏽破破爛爛了,你不說我還覺得比較像車諾比…。背誦並被迫學習欣賞這些東西就是我們幾乎整個高一上學期的美術課在做的事情。
過了這麼多年很多同學的名字我都忘記了,卻反而記得這些東西,就跟相聲的內容或周星馳電影的對白一樣,因為實在太有喜感了所以印象深刻。
至於音樂老師呢,上課在講歌劇,突然批評鐘樓怪人音樂劇是「垃圾」(記得很清楚他真的用這個字眼,當時下課我還很震驚的去問他為什麼,後來他有改口就是了…),很想知道你又能寫出什麼。
身為一個深刻理解創作是怎麼一回事的,我覺得啦,音樂碩士博士除非是真的有必要的主題(例如教育或考據?),否則根本不應該寫什麼論文,而是應該寫首作品出來聽聽。
我長期憂鬱傾向負面思考、也都極度缺乏自信,然而即使是自卑、常常崇拜他人的我,就已經一直非常瞧不起那種「研究藝術理論、但自己卻不創作」的人。不創作、然後給作曲家分類成古典派浪漫派抽象派現代派,聽到有人在作曲,就先問他是那一派。你們的研究如此的沒意思,為什麼都不會活得自卑或不耐煩啊?
凡事好像只要被冠上「藝術」或「哲學」等字眼,大家就完全不敢批評了、因為害怕一批評會被笑說不懂藝術。我認為根本不用怕,就大聲說你的看法。如果對方很生氣的開始激烈反駁,這時你就大可放心了,因為那八成是假藝術,閉嘴然後遠離他們吧。
我唸過一些設計相關課程,我很清楚自己不是什麼有天分的人,但我發現很多老師的品味比我還糟糕,同時卻又很會批評學生作品的造型或配色不好看(批評的部份大多在我看來都沒戳中重點)。其實有幾次我覺得我的作品根本畫壞、顏色根本髒掉像是顏料沾到泥巴一樣、心想「啊不爽畫啦不管啦隨便交差吧」直接交出去,竟然還被評審老師問「同學,這真的是你自己畫的嗎?」『對啊,怎麼了?』「畫得很有水準耶,可以直接拿去業界用了」我不知該回答什麼。
大學期中考每次申論題,我的分數幾乎都在平均以下,但如果是能夠自由發揮的題目(例如社會科學、無標準答案的),我反而考過 98 全班最高分。
因為很不會寫申論題,我就去觀摩很擅長考申論題的同學他們都怎麼寫,發現重點內容根本沒差,只是他們比較會掰得很長,但我就辦不到。申論題我常常就用寫 Markdown / Org-mode 時的思維簡易列出一堆 nested list 在加上簡易說明、或者寫成表格、或再畫個示意圖搭配,但就是沒辦法「掰出一堆文字」。
當我有事情真的想闡述時,用文字完整的紀錄一大堆我的思路與想法我還勉強可以;但要倒過來「寫出一些東西」我就完全辦不到了 — 像是歌詞那類的。就算我有東西想寫,當寫完我的想法後,我也完全無法再掰出其他東西,是真的辦不到。例如五月天的「乾杯 Cheers」 ,那歌詞打死我也寫不出來。不是畫地自限,那已經不是人生經驗多寡的問題 – 光是遣詞用字我就絕對辦不到。
因為心理因素的關係,我蠻常寫一堆自我精神分析的紀錄,這種東西我就可以寫得很快很順,因為裡面都是我實際的想法與感受,我只是把心中這些感受直接編譯成文字而已,因為不需要打分數所以也不用硬掰一堆廢話。
想看普羅大眾有多麼擅長寫廢話,就上 Facebook。先來個自拍照,再搭配一些意味不明搔不到癢處沒有邏輯因果關係的自我勵志文:
「加油再出發!」
「這不是我的風格!」
「努力到最後!」
「勇敢給自己一個機會繼續挑戰!」
…我發現這些玩意對我的精神殺傷力比長輩文還強很多很多耶。Facebook 的生態造就出的貼文中,並不是長輩文或內容農場讓最我無法忍受,也不是上面這種無腦自我勵志文,而是:不論是長輩或者平輩,太多人都能夠很流暢地使用「光是隨便瞄過去都覺得讓我這旁人覺得羞愧到不想再看下去的虛偽口吻與虛偽的情緒感嘆用語」寫出貼文與回覆,不知道到底怎麼辦到的,每次看都覺得你們之間的人際關係平衡好可怕,套著面具說話…。
覺得一個人在 FB 貼生活照的頻率與精神生活的貧乏成正比。
品牌名、店家名或介紹中強調「創意」的,根據我看過的經驗,內容物絕對特別沒創意。(ex) 創意料理、創意工作室。名稱中有個「藝術」的狀況也差不多。
所以別人說我有藝術氣息時,我知道他是在稱讚,只是我其實並沒有很開心。我有在作曲,但我從不會說自己是藝術家。當然這只是我自己的潔癖觀點啦。
。
不知道為什麼大部分的人知道別人會彈鋼琴時就會問「你考幾級」,或者「你那麼喜歡寫程式怎麼不去考證照?」。
之前在麥當勞打工時,每個知道我在寫程式時,都一直說服我去補習班上課考證照,我說「沒有必要,找工作直接丟作品給他們看就好」還被說太天真。
我非常討厭考試,大學時期,每次越接近考試我反而越不想唸書,但沒有考試時你把我擺著閒閒沒事,我反而會去找一堆有的沒的東西來學。學東西很快樂。
順帶一題,我爸還曾經要我去考公務員,他覺得我很被動,但又很會考試,我都不知他用哪隻眼睛看我的。我根本超不擅長也超討厭考試,考大學是硬拼的。
然後又覺得我「對自己不感興趣的事情都不會去做」所以真的很適合當公務員一個指令一個動作,我倒想問誰沒事會主動去作自己不愛做的事情?莫名其妙。
沒有衝堂的情況下,我很喜歡去修外系的課。修過資工系的某門 Lab,每個禮拜上課都是上機寫作業當場交。有次的作業「加分題」是「請用任一 script language(例如 Python)實做出跟這次用 C 寫的題目一樣功能的東西」,當我自找麻煩的正在用 Common Lisp 寫這題時,突然聽到旁邊有資工系學生跑去跟助教抱怨說「怎麼可以出這種題目!學校又沒教過 Python!能不能用 C++ 寫?」,當下聽得挺反感。
命裡有時終須有,命裡無時莫強求。雖然直到踏入棺材前也沒人知道到底哪些是命中會有的。
Twitter 用了八年很少 fo 人,這一年來試著多 fo 一些到一百人左右,看看別人在想什麼,不過發現太累了。現實生活已經夠累人了,幹麻連用 SNS 都得虐待自己啊,後來又 unfo 到 50 人左右了。盡量只 fo 有在互動的人,有在雙向互動的感覺好很多。
除非是神,否則每個人都會做錯事,所以過錯並不能拿來評斷人。然而我覺得過錯是有一條底線的 — 基本上這種過錯是不可能「不小心」的 — 當一個人跨過那種底線後,基本上我從此不會把這人的人品當一回事。
例如林佳龍拿對手的病歷來在選舉中攻擊對手,光是這點我就從此不覺得他是什麼好東西(「拿到別人的病歷」是有意為之,在過程中也還有很多時間與機會可以反悔,顯然不是不小心失言、或者誤會那種等級;如果真的有可能不小心,不小心滑進微閣或九隻監視器同時壞掉也是可能的)。
不過觀察了一陣子發現,這個社會中實際上似乎能力是可以抵過人品的,只是我自己無法接受,人品糟糕的傢伙我完全無法忍受與之為伍。記得造園學教授說過有個騙過他水刀機價格的人,但後來(教授)還是繼續選擇跟他當朋友這件事,那時我聽得覺得相當不可思議…。
對事不對人我辦不到。不認識的人我會先對事,一旦了解這人的底後我就優先對人再對事。 例如某些 Twitter 帳號的推出現在我面前,我一開始就會戴有色眼鏡來看。
遇過一個非常聰明,coding 技術很厲害、也很會自學又努力的人,就 follow 他的 Twitter 看看我能不能接受與有沒有能學習效法的地方(以前就常看到這帳號但每次看都覺得講話口氣很油腔滑調又摻雜著虛偽,很討厭所以一直沒有 fo 他),過一陣子,看到他貼他跟前女友的合照,但卻給他自己的臉打上馬賽克。那時再次認真開始懷疑這人的人品。後來發現他很愛筆戰,但常常筆戰中途就會開始無視邏輯只講些酸言酸語攻擊對方,甚至會捏造事實「你之前不是說 XXXXXX 嗎」『我什麼時候說過這句話了?還好這個頻道大家都有 log,回去翻你最好找得到』。一開始是我跟他戰,旁邊還有一位朋友在那搬板凳吃雞排,過幾天換那位朋友也不慎跟他戰起來,我想他應該那時就笑不出來了。從知道他會捏造事實這次我確信他的人品有問題了,跟他的對話中火藥也越來越濃。總之結果就是吵翻了,從此不往來。
最讓我訝異的是,這人的人緣很好耶?
我還是當邊緣人好了。
身為一個整天犯錯的廢物凡人,體會到了一點:如果開口了對任何人都沒好處甚至傷人,那一個人閉嘴不見得是他沒意見,可能只是覺得「不需要浪費時間精力跟這(些)人說什麼」,你只是被人默默貼上「不重要」的標籤、或者覺得討論這個管道已經對你行不通了而已。
我很容易崇拜別人、崇拜頭腦聰明的人、崇拜努力的人、崇拜程式寫得很強的人…,但漸漸發現會唸書的確不代表能夠明辨是非、頭腦好程式寫得好也不代表討論議題時就很注重邏輯。
我發現自己是個相當愛講話的人,但平常沒有啥講話對象,每次一有機會就開心的霹靂啪啦講一堆,講太興奮,得意忘形,冷靜下來就覺得自己講太多不該講的,或者交換想法後覺得自己之前根本觀念錯誤還講那麼多,接著就是陷入再一次(很熟悉的)自我厭惡感中。人的個性看來還是不會隨便改變的,大學四年跟畢業後我一直在試圖克服自我厭惡感,經常看著鏡子裡面自己的臉試圖不要浮現出厭惡感;開始工作後覺得好像從此就不會像以前那樣沒自信優柔寡斷又整天鑽牛角尖,後來發現那種正面正向陽光又充滿希望的感覺是假的,暫時的。然後就會開始感到我曾經那種過於得意風光的心境與表現真是愚蠢至極。
如果能讓我對自己的個性與行為沒有自覺,有時還蠻羨慕那種不會反省的人的心境 — 當然以我自己的個性喜好並不是真的想變成那樣,但至少看來他們很有自信的活著,不像我這種心情這麼容易被外在影響到連自己的理性思考都覺得自己很蠢很膚淺,以及常態性,觸發條件豐富的各種自我厭惡。
我想假如人類是種能夠主動將理性從個性中剝離出來的生物,那這些情形都不會發生…當然這前提是不可能的。
不知是心理還是生理,有時會有種強烈的想跟誰(這裡的 *who 是 nullptr)上床的欲望,不過想到要面對的是一個活生生的人我就無法忍受,更何況這個人從此會入侵我的心理佔據不去更是可怕到極點。所以我是完全無法忍受容忍原諒一夜情(那也不是情,只是生理需求而已)的那種人,雖然我不會拿自己的標準去套用在別人身上、也覺得要不要一夜情是別人自己選擇的生活方式,不過是我自己要找伴侶的話可能就很難了。「全天下男人都會犯的錯」什麼的根本狗屁。
- 論無法理解與忍受的擇偶價值觀:高富帥、白富美、有車有房
- 結婚比相愛重要不知道現在還是不是台灣社會普遍的價值觀。我一直覺得相親是我無法體會的行為,因為相親而結婚則更是不可思議的事情。當時得知(姑且算是)交往對象的父母是因為相親而結婚的時候我都快嚇死了,現在想起來分了絕對是師尊保佑。
Twitter 上就有人回應
要幸福首先還是得有錢,貧賤夫妻百事哀,怎麼也幸福不了的。有錢又不幸的也大有人在就是,這世界上幸福的人本來就是幸運的少數而已。所以我就挺能理解白富美高富帥這些條件的,重點是富,其他都是附加值。人本來就不知道自己能不能幸福,為什麼不盡可能找有錢的呢?如果幸福就賺到了,就算不幸福起碼有錢 https://t.co/zNpG6CUy5l
我的回答是:
這就是價值觀的差異而已。可以說我太天真沒有關係,我很有自覺我在戀愛這個自由市場中完全就是一個異類,我也沒打算改變,不然我自己一個人生活可能比硬找伴活得快活多。
看現實生活中周圍的人的戀愛,大多(七成左右)給我的反應都是…嗯…貴圈真亂 =w=” 不過我的交友圈很窄又很挑,所以現實平均值應該(對我來說)更可怕。
開一下臉書看五分鐘,再次感到我沒辦法跟大部分的人相處得太好,雖然有點慶幸就是了。 上次當一位推友的導遊,在東北角遇到一群時下流行的年輕族群群起出遊,我說那些人我一看打扮就不想接近他們,他說無法理解,不過我也解釋不出啥。大概這就是…嗯…磁場相斥吧?
結婚比相愛重要不知道現在還是不是台灣社會普遍的價值觀。 我一直覺得相親是我無法體會的行為,因為相親而結婚則更是不可思議的事情。
離題一下,其實我不太能理解為什麼大家那麼喜歡把把妹掛在嘴巴上。我覺得世界上比交男女朋友好玩的事情太多了,為什麼一定只能去玩那個呢?也許是開玩笑,但每個人都開這種玩笑我只覺得好乏味啊。當然覺得乏味是我自己家的事啦。例如在藍藍路打工時,每次有新人要進來就一堆豬哥問男的女的漂不漂亮,或放假就說要去把妹什麼的,我個人很討厭這種感覺。也不是啥大不了的,就只是我心理上討厭而已。不過另一方面,我認為這種人會應他們自己的願找到符合他們自己水準的另一半,自由市場嘛。
做服務業將近一年終於請辭,最沒水準的一團客人也在最後一天遇到了,不是中國人,而是以色列旅行團,不知為何所有人都把方便善後用的餐盤襯紙抽出來擺在桌上、飲料蕃茄醬搞的所有桌子都黏黏的、還咬一堆吸管不知幹麻咬完就吐地板滿滿都是啃過的吸管。唯一值得欣慰的是還好廁所沒給我噴得到處是屎。很懷疑是不是以色列人從小就知道如果有人罵他們就會被說是種族歧視,所以出了國就很放心的肆無忌憚亂來。
我原本對人的長相很沒敏感度,以前常聽到有人說「他很醜」我都不覺得,但現在打工的地方真的常常看到打從心底覺得這人真是醜到讓人想潑水的傢伙 – 並不是生理上那種醜,而是一看面相就覺得這人行屍走肉的那種醜。
那種「男生(都/最)怎樣怎樣」 「女生(都/最)怎樣怎樣」的推文我都當性別歧視的廢話來看。
我又來談性別議題了。不過不會談太多。
tampoktsu: 我是這麼認為啦:PTT 部份八卦鄉民認為女性主義完全令其反感、甚至壓縮到他們的生存機會,而且人數還很多。 為什麼不學南韓那樣籌組「反女性主義解放男性聯盟」呢?
我回: 相對女性主義,我比較想支持完全的男女平等。
雖然我是這麼想,但我也不覺得他有可能實現,但任何能讓現狀接近這個想法的活動我都贊成。
「她有著最傑出的學術成就,卻只能長期待在學術職位的最底層。終身職的研究工作幾乎只保留給男性」
「當她發現姊妹會很排外、並非所有人都能進入時,就拒絕了邀約」
「我並沒有強烈的需求要和某人有依附之情,我就是感覺不到它。我永遠不了解婚姻,現在依然…我從來沒經歷過需要它的時刻」
「我不是女性主義者,但我很樂見加諸在猶太人、女人跟黑人等的不合理疆界被打破─這對我們所有人都有益」
— 芭芭拉.麥克林托克──嚮往自由的獨身研究者 - PanSci 泛科學
好愛這篇,我厭惡任何有著任何性別歧視的披著人皮的人。
「希望讓他人理解」以及「對不理解的人容忍度低甚至排外」,上大學後接觸過的人比以前廣,偶爾會遇到這兩個屬性並行出現在同一個群體上(例如跟社運比較相關的社團)…有點不知該怎麼反應,目前覺得比較安全但也消極的應對方式是遠離他們。
大學時曾經去接觸過性別議題相關的社團,原本我還在旁邊試圖聽那個超沒水準的生理女性社長在那大聲嚷嚷一堆有的沒的「我禮拜六要跟我女友去溫泉旅館做愛呵呵呵」「blahblahblah 闖紅燈 blablablabla」…
「什麼是闖紅燈?」我問。
社長叫:『天啊~!怎麼會有人連闖紅燈都不知道啊!』
也許即使我不理解也不應該去試圖理解你們。不過也很有可能是我一開始就弄錯了,這種社團本來就沒有「希望他人理解」,畢竟人通常會需要一點取暖小圈圈,我不是在酸他們,因為我自己本身就是這種需要小圈圈取暖的廢物,看他們的行為覺得也許他們其實也這樣想。
覺得已經累了,除非真的有主動說感興趣聊這種話題的人,不然我不要再主動談這種議題了,知道我的想法並不能改變現實世界的任何現象。我也不是聖人,先撇開很可能有錯外,光是試圖討論的過程就很可能只會造成別人不快甚至決裂。
常常在忍住不要發這種廢推的邊緣徘徊,覺得理智跟歇斯底里總在一念之間,人類這種充滿缺陷的生物好可怕。
自從意識到以來,我一直在避免使用「說真的」「老實說」,因為這種詞扮演的角色除了(沒有根據地)強調以外沒有任何意義,反而讓人覺得自己在唬爛。
我常常有很多想講的,但覺得自己語言能力相當糟糕,寫出一句話之前在我腦裡通常都已經分析並修改過好幾輪了。我很在意每個字透露出來的涵義,但我的語言能力限制讓我覺得自己說話沒辦法每次總是能夠精確能夠講出自己的想法,所以一句話常常推敲很久,或者發出後又覺得不夠精確而修改、或者覺得太沒內容或不宜講出甚至根本就講錯話而刪掉。而且到現在我的話有時還會讓人會錯意…很傷心啊。
這是我 2015 年 4 月份大學畢業前、到畢業後一小段期間寫的日記。時間的流逝好可怕。
之前一直有些顧慮,不過也擺了快兩年,覺得差不多可以放出來了。(你以為在釀酒嗎)
大腦並不擅長記住精確的事情,而且還會自己腦補。我喜歡「精確地」紀錄說過的話、發生的事情,何時何地何人何物。如果連當下都無法記錄到讓自己在以後回顧時信服的話,想想從小到大我們背誦的以為是歷史的東西:我們已經背誦過夠多小說與扭曲的事實與謊言了(新聞製造業就別提了),沒有必要再給世界留下一篇只能讓自己滿足的爛小說。
kuanyui @ JinGuaShi [2017-03-22 水 23:40]
(File created at 2015-04-24 04:41:40)
很感傷,我真的很慶幸我進了中興。雖然有些課很廢(尤其必修)、也遇過一些爛人爛貨,但其他遇到的同學、因為各種管道認識的朋友、那大家都說漂亮但我怎麼也不覺得稱得上漂亮但確實溫腥的校園環境、各種課程與(很少參加的)活動的點點滴滴,我這輩子忘不了的。
在系館放悲慘世界日文版,再次感動。
把 One Day More 一口氣打譜完了。
在社團呆到超過午夜,升上大四後好像就幾乎沒再這樣過了。
好想被這種老師當當看喔,揪咪~
archive.ejs
。<% } %>
讓人好懷念 django 的 template 語法。hexo.el
ta.el
該怎麼寫。ta.el
。用 Emacs + Jedi 寫 Django 就是他 x 的都不知要 import 的東西到底在什麼鬼地方啊,我認為人類不應該把腦容量拿來記這種事情的。Elpy 的 refactoring rename 感覺也沒什麼用,還不如用 swoop。
裝了 PyCharm 的學生版試試。接下來寫 Django 試試看好了…PyCharm 的 Auto completion 確實比 Jedi 強很多。
最常聽到關於的 Emacs 玩笑是「是一個優秀的 OS,可惜缺乏一個體面的編輯器」,對於這個玩笑,我的回答是「哪有那麼爛的 OS」。寫 Elisp 寫到現在常常遇到一些辦不到的任務,像是低階檔案 IO 之前折騰了我好幾次,最後發現 Elisp 對於這塊基本上就是廢到你不該期待它。你甚至無法取得一個含有 escape 字元的檔案的實際內容並存成字,因為 Elisp 在取得檔案內容時會雞婆的幫你把像是 backslash 的地方給 escape 掉。就算不管這些,在寫 Elisp 時也是挺容易把 Emacs 操到神智不清、淨做些怪行為,最後只能重開 Emacs 解決問題。所以只要一寫 Elisp,我的 M-x emacs-uptime
就累積不了太久。
Emacs 還有個問題是「安裝了一大堆 plugin 結果還是離 IDE 有一段距離Elpy 裝完一個小時我就刪掉了,寧可回去用 Jedi 就好。」。我自己是很希望 GNU Emacs 能不能哪天突然想開或有人 fork,至少把像是最常用的幾種語言的自動補全、語法檢查或自動 import 一類的東西弄成開箱即可用(或者只要 setq 一下 var 就可以用),喵的每次要寫新語言都要重搞一次而且還不一定搞得起來…雖然說是「編輯器」所以沒有必要塞這些「不是每個人都需要的東西」,但 Emacs 本身…早就塞了一堆使用者根本用不到得東西啊靠悲根本一點說服力也沒有。
上課有點無趣。
twittering-mode
的原始碼,因為最近 Twitter 網頁版新增了一個功能:包含 comment 的 retweet;其實測試了一下,它也就只是在一般的 tweet 內容最後面插入另一個 tweet 的連結而已,tweet 本身的格式根本沒有變(而且被 retweeted 的 tweet 的 retweet_count
並不會因此增加),但 Twitter 網頁版會自動顯示該連結的 tweet 內容,不需要使用者自行點開。想給 twittering-mode
也加上這種自動抓取的功能。twittering-mode
的程式碼寫得非常高段漂亮,也做了很多最佳化,還把所有東西全部塞在同個檔案中(> 12000 lines),結果就是超難改。而且我沒找到「根據『數個』tweet_id
一次 retrieve 這些 tweets」的 Twitter API。
早上 9:20 起床,繼續寫到 12:00 寫得煩死了,最後改出來的東西(branch 在此) 勉強來說可用,但…太多 HTTP requests 一下就爆掉了啊啊啊靠憋!
下午資料庫昏昏欲睡。這個禮拜來每天腹痛拉肚子。
libpurple
),但 Pidgin 內建的又難用到爆炸,想說用 PyQt 和 Ag 來做一個查詢工具,QProcess
吐出的 stdout 都不知該怎麼 readline,Python 的 subprocess
又會讓 PyQt 整個 block,拎…。<a href="#hello">
,但把 <h2 id="hello">
寫成 <h2 id="#hello">
結果找 bug 找了好幾個小時都沒發現…靠悲已經不是第一次耍這種白痴了。{ % include 'template.html' % }
這種用法之前卻找不到 orzrender_to_string(...)
django.core.urlresolvers.resolve()
來寫 "active"
的 templatetag。csrf_token
,明明看 code 就有做了某個我需要的功能卻連個範例都沒附上,搞了老半天還是不知該怎麼用他,超浪費時間。unpaid => paid
+ Ajax。開始研究要如何用 Python(reportlab
) 吐出單筆訂單的 PDF。reportlab
成功輸出中文 PDF 後,去吃早餐。Order.printed
和 glyphicon 一下,善用零碎時間等下好補眠(喂)。git cherry-pick --abort
,赫然發現所有還沒 commit 的東西都被 revert 了,當下背脊瞬間涼了半截),還好 Emacs 的使用習慣是開一堆 buffer 不關掉,所以各 buffer 的 undo 紀錄都還在;加上有打開 Emacs 的自動備份功能(自動把檔案拷貝一份放在 ~/.saves/
) 所以很快就救回來。對不起以後我會記得乖乖的每做一點就 commit 一次 orzXMLHttpRequest
+ Blob
則是會 csrftoken error,完全不懂為什麼啊混蛋!threading.Thread
+ socket
但要讓 PyQt 不能 block)。listen(5)
就會 segmentation fault;把 GUI 移掉,直接由 parent process 自己開 threading + socket 就沒再發生過這種問題。我覺得我基本概念還是沒弄懂才會不懂為什麼會發生這種事。「寧肯殺頭也不能做歷史的罪人!」
INSERT
比較好啦、我寫的 constraint 好像也是錯的沒被遵守…。)。Ctrl + c
的 Trap 跟 q 鍵離開。這次就乾脆不用 ncurse 了。end
語法,跟 Lisp 或 Python 比起來都看得很累(因為 end
是文字,editor 裡顯示起來就是 keyword,拿這個當作 block 的語法跟其他有意義的 keyword 放在一起實在是很難辨識)。[0, 0, 0].all? {|x| x==0}
,跟 Lisp 裡的 (every (lambda (x) (eq x 0)) '(0 0 0))
幾乎一模一樣。7:10 出發去吃晚餐,跟迪璁筑他們和其他一堆人去台灣大道上的名子忘記了的百貨公司裡的王品集團開的鐵板燒。
璁到底是出生時有什麼天象又出現什麼五彩祥瑞之類的,公認的「每次去上課都剛好點名的人」,還有兩次是一進門時剛好點到,後來她要去上課時還要打電話通知大家,「今天璁要去上課囉」。然後都沒在唸書,只有考前一天晚上讀,還考全班最高,或者總是全班前幾名(我沒翹過課還考不及格)。XD 有些東西真是天份啊。
threading.Thread
fm-bookmarks.el
把功能補完後,丟到 MELPA。晚餐魚露炒空心菜、烤雞翅、蔥爆豬肉、昨天的滷竹筍。
一直以來,很討厭看到故事中的角色因為外在因素,心境「普通->開心->失望」的橋段,因為看得心裡很難過很不舒服。例如「拿到爸爸買的冰淇淋很開心的小朋友,正準備開心的吃時不小心掉到地上而開始哭」這種老梗不行的橋段。甚至只是「拿到爸爸買的冰淇淋很開心的小朋友」這樣我都可以難過又緊張,因為我會不自覺得聯想到他的快樂很容易就會消逝,例如不小心掉到地上。
話說明明很會亂想,可是我卻完全沒有編劇能力呢。當我第一次(驚訝的)意識到小說、電影、卡通所拍的故事原來幾乎都是劇本家虛構出來時,簡直像是一個天生全盲第一次知道原來看見東西是什麼感覺的那種驚訝。因為我完全沒有編劇能力,想到編劇我就腦子一片空白。
一整個下午都在玩妹子的平板上那其實不怎麼好玩的 Android 遊戲神女控。因為之前完全沒玩過這種不用大腦+騙你花錢付費+浪費青春類型的遊戲,反而玩的時候腦袋都在放空,想著玩著這個遊戲還玩到幾百級的人、以及遊戲企劃、遊戲開發者在做這遊戲時,腦子可能都在想些什麼。這樣偶爾玩玩還蠻有意思的。而且也很佩服,這遊戲簡直比 AOE 還複雜。我這種人光是要用 PyQt 寫個 list 都寫不出來了,但這遊戲的界面卻非常複雜,無法想像這遊戲到底花了多少人的心血。
第一次做糖醋排骨,記一下作法:
我覺得我在佛堂已經貌合神離了,如果再找不到這裡一堆現象的解釋,也許該逃一段時間了。
早上看機器學習 PLA。十一點上供。
佛堂阿姨載我到市區放下車,好想哭,吃很油膩的天婦羅蓋飯。
回阿嬤家
學開車,但人太多後來就先回家了。
根本業力大爆發,我來這個世界上是來跟這個家討債的嗎…
中午煮雞肉義大利麵。用魚露代替鯷魚罐頭效果很好。
看漫畫「黑社會的超能力女兒」,for(;;){笑;嘆氣}。
一想到佛堂的趙伯伯講的「要保持笑容」就哭一次。
評估 CKEditor 跟 TinyMCE,因為 Django 套件是 CKEditor 看起來寫得比較好所以就用他了。
今天沒做什麼事。回想起來真是廢人。
看了一下日記,現在覺得佛堂的日子很一言難盡。「要保持笑容」
寫 Django。快寫完了。
很久沒寫 blog。最近發生不少事情,覺得也是時候應該要花點時間來紀錄一下。
最近的每日作息是
前陣子工作上遇到一件很難過的事:我們的產品有 web 介面與 CLI 介面,我負責 web (Angular) 另外一位負責 CLI (Go),我們要實作出邏輯一樣的功能(例如 input validator)。負責 CLI 的同事一天就寫完:而我呢寫了四天還有 bug。我想出的演算法智障到不行,根本繞遠路、複雜、沒效率又辦不到任務。當下立刻跑去請教那位同事他的思路,發現只用了三個 if statements 就解決了,我我我…
雖然我很早就知道自己不聰明,不過這四天的差距實在大到我無法忍受。再加上長期以來自己累積的一些心事(跟工作無關就是了)整個人狀態非常糟糕。連續兩個多月的禮拜六都主動跑去公司加班因為不想待在家裡發慌 – 其實在家裡不是沒事做但就是不想待在家;禮拜日又幾乎都在補眠昏睡中度過,雖然可能跟藥物有點關係(目前每天還有在吃 Epram,雖然醫生說這應該不會嗜睡才對...@_@)。
某天下班後自覺有點到崩潰邊緣,把車停在濱海公路旁、買了一瓶維大力,打電話給高中時的班導談談,潰堤了。(當天稍後還被父母臭罵一頓因為太晚回家手機又打不通)
每天寫 code 的工作也超過半年,卻感覺寫 code 的速度完全沒有變快(怎麼在必要時讓 code 可重用、增加可讀性、更好維護這點倒是有點進步的感覺),而且我在解問題時的思路經常走偏、用一堆複雜的方法繞遠路,或者更糟的情況是根本完全不知該怎麼作…。
所以最近開始盡可能每天練 LeetCode 演算法題目、有空就念演算法和資料結構(大學時因為跟必修衝到沒辦法修)。我也很怕這種工作不知自己能作幾年,尤其我做得目前還算蠻開心的,就多花點時間投資自己吧 :S。
下班到家吃個飯、練一下琴洗完澡,剩下的時間也不多,頂多刷個一兩題就超過十二點準備睡覺了,反正盡量啦,長期少量但穩定的累積應該比短期大量硬塞學習效果好吧,畢竟我不是聰明人啊。
我知道演算法對大部分的 coding 工作來說不是說很重要,whitglit 大大也說「大部分專案只要 call API,不過有意義的專案不一定要滿滿的演算法」,是這樣沒錯…是這樣沒錯啦…可是我不甘心啊!真要說的話,有意義的人生也可以不必靠藝術,但我就是不甘心啊!不甘心!
雖然這樣講很中二,可是當心情差到某種程度時,好像有比較容易寫出曲來(僅僅是比較)…但這樣實在不是個健康的心理狀態。
實際上進度還是太慢,很想快點把去年就預定想完成的東西寫完,我太廢物拖到現在進度依舊有一搭沒一搭。嘗試說服自己不要那麼好高騖遠只想寫大型作品卻眼高手低力有未逮;而且就跟聊天一樣,每次都想一口氣劈哩啪啦講一堆灌給別人聽是我的壞習慣。
最近滿 24 歲了,感覺很糟,離寫出了九百多部作品的 Shubert 去世時的年紀還有七年。經常會想,假如我有那種能耐,我很樂意只活到 30 歲。不過我很早就很清楚自己只是個沒有天分的凡人。
過了小屁孩年代後,幾乎沒有告訴過別人自己的生日:覺得沒有必要過,尤其還是我這種…慶祝什麼的實在高興不太起來,只是提醒我,平常刻意無視掉的自己的存在。尤其上大學後我更怕生日了,每過一年只是提醒自己又老一歲,青春又消耗了一年。
生日對我爸媽的意義比較大,畢竟我可是一出生就花了他們三十幾萬住加護病房的來討債的傢伙。
覺得很可怕,用 Emacs 不知不覺已經滿了五年,這個改變了我的人生的編輯器。也要感謝最近才發現竟然是跟我同校畢業的 letoh 大大當初的鼓勵,不然我可能現在不是做這一行吧。
不知道是不是我亂腦補啦,Beethoven 一輩子寫了太多大眾取向的音樂,到了某個年紀漸漸開始改成寫自己心中說不完的話。Hammerklavier 這部作品給我的感覺就是後者(顯然就不是給初學者聽的曲目)。兩百年前的心事排山倒海從耳朵灌進來。以前聽不懂在衝啥,但古典聽多了反而現在酷愛聽這種類型的作品。好像這種個性的作曲家特別對我胃口,Alkan, Brahms…。也許有些東西真的要年紀才能累積出來吧,想要寫出這種東西,偏偏我又很不希望年紀再增長了…現在看到大學生都覺得,唉唉,真是青春的肉體(台語發音)(X)
覺得 Schubert 如果沒有誤交損友得梅毒掛掉,年長後不知會寫出多麼棒的作品…太可惜了。
覺得人生就短短七十年,何況自己也不知能不能活到那時候,難過也是一天高興也是一天,何不對自己好一點(聽過一個人說「會這樣講的人都是他媽的特別自私的人」…嗯…我會注意自己有沒有這樣 orz),但我常常忘記這個領悟。
看來我還不到能夠幫到別人的階段。
我一直對班導道歉:畢業這麼久了還去煩她。
班導對我說:
「老師就是這樣的生物,我現在也是在給自己造福啊。」
「要適度給自己掌聲。」
佛堂的大伯一直告訴我;
「你要保持笑容。」
其實我到現在還是會覺得自己是個不該被生下的人,不過以前那種為自己的存在所感到的罪惡感幾乎沒了,畢竟我已經活在這世界上了不然我應該要怎樣嘛。不想帶給別人麻煩、安靜的活下去。
期許自己這是新的開始。
]]>[2018-04-11] 這篇文章未來應該不會再變動了,QML 已經是我最厭惡的程式語言之一(詳情請見本文留言區),我想以後除非發瘋否則應該不會再嘗試第二次。
這篇文章是初學 QML 時寫的,很可能有謬誤。
沒想到網頁寫一寫莫名其妙就開始寫 QML 了。總之就是工作上有個新專案,最後是用 QML 開發,最大的優勢是前後端的開發可以分離。可以先把 UI 邏輯開發完,同時一邊跟客戶討論需求後,最後才進行後台業務邏輯實做。而在寫 UI 的過程幾乎不用寫 C++
雖然 KDE5 Plasma 桌面已經全面改用 QML 重寫、Blackberry、Ubuntu Phone 也都採用 QML 作為 GUI toolkit 使用者基數應該挺龐大的,然而目前寫了一個多月,實際在開發時還是踩到很多雷,而這些雷的原因也很雜,所以這裡來快速簡單的統整一下,希望對任何想學 QML 的新手能有一點點幫助,避免更多人成為孤獨的踩雷家。
QtQuick
是一套新一代的跨平台 GUI framework,於 Qt 4.7 首次出現,裡面包含 QML 這個以 JS 為基礎的程式語言(QML 是 JS 的 superset)。QtQuick
提供了很多很低階的 GUI 元素,例如 Item
, Rectangle
, MouseArea
, Text
,然而這些元件過於低階,例如即使你只是要一個最常見的按鈕(例如 QPushButton
)你也必須先花很多精力自己組合這些低階 GUI 元素,根本浪費開發者生命輪子滿地滾。後來 Qt5.1 出現了Controls
(又稱為Controls 1
),就是幫你預先實做出了一些最常見的 GUI 設計元素,例如 Button
, TextField
, SpinBox
, ComboBox
,而且也保留了一些外觀的自訂能力。
Controls 2
,跟 Control 1
是互不相干互相獨立的,你可以在同一 App 中同時使用兩者。差別在於:QWidget
中的各種 GUI 元件,而且在各個 OS 上外觀風格看起來盡量與 native 相同。Qt5.7
開始,Controls 2
自己內建了一套 Google 的 Material
,以及 Microsoft 的 Universal
樣式,讓你可以快速開發出看起來大致與 Android native UI 相同的 App。Controls 2
中的所有元件預設都不會去監控滑鼠的 hovering 事件(我猜也可能是為了效能?),也沒有任何 curosr 樣式(這點實在很糟),所以你要拿來開發跨傳統桌面平台的程式而且赫然發現他竟然都沒處理滑鼠 hovering 事件的話,你就得把所有 Controls 2
自己重包一次自訂自己要的效果…Controls 3
(搬板凳吃雞排)。QWidget
時代的邏輯去寫 QML
,否則你、會、踩、到、雷。QML
,否則你、會、踩、到、雷。QML
,否則你、會、踩、到、雷。QML 是個 MVC 三者摻在一起做撒尿牛丸的玩意,我發現他很容易寫出難以維護的東西。每次寫我都覺得很可怕,我已經見識過一堆連 Python 都能寫得醜到靠北的人了,這 QML…
總之要多人協作可能很需要 code style guide。
當然別人的 code 讀多了也發現,即使是 Python 都有人能寫得超難讀,就變數名這點來說好了,像變數全部小寫還無底線、亂自行發明會混淆的縮寫、或者意義不明或根本意義錯誤會誤導思考方向的變數名稱、以及 assign 了卻根本沒用到的變數等等。想到這種人如果來寫 QML 就覺得很可怕。
可以把 component 當成 property type 傳入,就像寫 Qt/C++ 把 QWidget instance 的 reference/pointer 作為參數傳入另一個 QWidget 裡面,但不建議,因為不好維護。
謹慎使用 Signal.connect()
,實在太容易寫完就忘記到底是在哪裡 .connect()
的了。
大部分時候其實可以善用自定義 signal
,然後在一個適當的 scope 下(能夠同時看到 signal emitter 跟 receiver 的 scope)透過 Connection { ... }
來達成 component 間的互動、call function 等等,這樣維護會比較容易。
在 QML 中,有三種方式來使用 Qt 很著名的 signal / slot 系統:
onXxxxxChanged
signalObject.connect()
Connections { target: 監控的對象(發射者); ... }
其使用方法官方文件寫得非常清楚易懂(難得不瑣碎的文件),自己去看。
待補完,我自己也還沒弄得很清楚 orz @coldnew 大大快來救我…
Item
是 QML 中所有 visible 元素的基礎 class。
就說其實底層是 C++了,就是所有你肉眼能看到的 QML 物件,都是繼承自
Item
這個 class。如果你寫過傳統 Qt GUI,Item
概念就跟QWidget
很像。
不過跟傳統 QWidget
不同的地方是, Item
本身是看不到的(很弔鬼吧)、也不佔任何可見空間,但你可以拿他來封裝(encapsulate)其他可見 QML 元素。
如何封裝呢?可以看看稍後下面 Panel
的例子。
在網路上討論 QML 話題時,大小寫很重要… QML 的 component 跟 QML 的 Component
指的是不同東西…因為 QML 裡面有種 component 就叫做 Component
。
所以為了避免混淆,我通常會寫成
Component { ... }
封裝好、可重用的物件就叫 component。
自訂 component 有很多種方法,最容易的就是直接建立 YourComponentName.qml
檔案。往後就可以在其他地方直接 YourComponentName { ... }
來使用。
#注意事項
- 檔名就是 component 名稱,必須是大寫開頭的 CamelCase
- 每個檔案(每個 component)都只能有一個 root
Item
。多寫會編譯不過。
另一種常見的自訂 component 方法是 inline component,就是不建立獨立的新的 .qml
檔,直接用 Component { ... }
這個鬼東西在一個 component 中定義另一個新的 component。入門建議先不要碰這裡,因為這用起來有點麻煩,有興趣的可以自己看文件(我雖然有用但我也還沒完全摸透,所以先擺者以後也許會補完這段。)
例如內建的 Rectangle {}
,我們可以在裡面塞一堆有的沒的東西:
1 | Rectangle { |
這要怎麼自己做呢?比如說,我想要用 QML 實做類似 Bootstrap 中的 panel?
很簡單,塞進去的東西其實是被塞進 Item.data
這個 property 中,所以直接直接這樣:
1 | // Panel.qml |
以後就可以這樣用 Panel
1 | Panel { |
熟悉 HTML / CSS 的話,嗯,你那堆概念在 QML 裡面完全不管用,別以為 QML 號稱給設計師好學習就真以為這是 CSS + JS 了,這他媽的完全不一樣啊。請務必把這些概念扔掉再來寫 QML!
寫了三個禮拜 QML 後,有人問我 HTML / CSS 相關問題,我竟然腦袋完全轉不過去,因為 QML 光是 position 跟 layout 的邏輯就跟 HTML / CSS 完完全全不一樣,就好像 「Java 跟 JavaScript 有什麼不一樣」之間的那種不一樣。
如果你寫過傳統 QWidget,你一定寫過像是 QVBoxLayout
/QHBoxLayout
/QGridLayout
,還有應該也很熟悉 addSpacing()
等方法。如果你是這種人,那更要扔掉這些概念再來寫 QML!否則你、會、踩、到、雷!
ColumnLayout
/RowLayout
/GridLayout
,他們是惡魔!請改用 Column
/Row
/Grid
。anchors
,除非是出現重複性的排版(ex:一排按鈕、一排表單欄位)這種情況才該使用 Column
/Row
/Grid
。Row { ... }
,那是 QWidget/QLayout 時代的邏輯。請用 anchors
來定位。
Column
/Row
/Grid
與ColumnLayout
/RowLayout
/GridLayout
的差異是,後者是前者的加強版。
前者雖然會根據包含的 Component 調整自身的尺寸,但他只管怎麼擺放 Component 的位置,並不會主動調整其中的 Component 的尺寸。後者的話,就可以在內部的 Componet 中使用Layout.fillWidth: true
或Layout.fillHeight: true
這兩個 attached properties 來自動調整尺寸。
除此之外,GridLayout
又比Grid
多出了Layout.colomnSpan
跟Layout.rowSpan
這兩個 attached property,會寫 HTML table 語法的人應該很熟悉這個。
看起來很美好啦…但實際使用起來各種 bug 就是了。
我曾經因為 QML 的 Layout 浪費過將近一整天的時間在 debug,那次的狀況是不知道為啥當
ColumnLayout
內的 Item.height 改變時,Layout 自己的 height 竟然還蠢到不會自己調整,而且也找不到什麼方法強制它重新 render,後來發現全部改用Column
/Row
/Grid
問題就全部解決,真是見鬼了。偏偏那天又睡很少,搞得一整天火氣都超大。
childrenRect
拿這貨來指定元素尺寸常常失敗,我目前完全搞不懂這貨是拿來幹麻的,如果你用這玩意遇到問題還是乖乖手動計算width
/ height
,或者使用會自行調整 container 自身大小的 Row
Column
。
我的經驗而已,如果有人明白為什麼、以及使用時機的話,請告訴我。
QML 雖然是 JS 的 superset,但千萬不要直接拿 JS 的想法去寫,否則你會踩到雷。
要牢牢記住:QML 的底層其實還是 C++,雖然這代表能夠透過 Qt MOC 來與 C++ 溝通、透過 C++ 來擴充 QML 的功能,但這同時也代表,QML 的 JS 對於 data type 的容錯是有限的,不能像 JS 那樣亂來。
舉例來說,我就踩過一個雷:
以下範例會用到一點點 HTML5 中的 Canvas 基本觀念,假設讀者已經知道。
假設我要一個 Canvas
(這裡假設他的 id
是 canvas
),自訂兩個 property:
strokeColor
這個 property 的值指定筆刷顏色。removeColor
這個 property 的值變成 true
時 ,讓筆刷顏色變成灰色 "#ddd"
來看範例 code。 ExampleCanvas.qml
如下:
1 | Canvas { |
然後這樣使用:
1 | ExampleCanvas { |
看起來一切美好,然而實際執行的行為卻會是這樣:
ExampleCanvas
確實用灰色 "#ddd"
畫出了圖形ExampleCanvas
,確實也變成了預設值紅色 "#f44"
我後來發現問題是出在第 8 行,寫死的灰色 "#ddd"
那裡。
我猜測原因是 implicit type cast 的問題。QML 中你可以很簡單的用 "#f44"
這種包含了 RGB 色碼的 string
來指定顏色,他會 implicit cast 成 color
這個 QML type(C++ 內部實際所使用的則是 QColor
,有寫過 Qt/C++ 的一定很熟這玩意)。在絕大部分情況下這是完全沒有問題的。
然而使用 property color strokeColor: "#f44"
這種方法指定 color
就是 explicit cast 了,會直接讓 strokeColor
存真正的 color
而不是 string
而已。
上面的例子, strokeColor
裡面存的是真正的 color
,第 8 行的灰色#ddd
卻只是string
,推估問題就出在這了。我已經 assign ctx.strokeStyle
為 color
,再次 assign 的話如果是 string
他就忽略(實驗結果是這樣,我目前功力還不夠去看 C++ 怎麼實做這部份的行為)。
所以這個問題的解決方法就是,把灰色也用 color
type 存成 property,然後第 8 行的 string
改成 color
。
]]>請一定要讀一下 QML 中內建的基本 data type 一覽。
還有一個不能算 type 的 type,叫做alias
(只能用在 property),這非常常用。可以去翻翻看 Controls 的原始碼看他怎麼使用alias
property。。
後來覺得這篇文章原本講的方法實在太麻煩了,而且當你有用 submodule 時會有問題 (總不能直接改 submodule 的 git repo URL 吧),剛好發現一個好辦法:使用環境變數 GIT_SSH_COMMAND
,如下:1
GIT_SSH_COMMAND="ssh -i ~/.ssh/COMPANY_KEY" git clone git@github.com:foo/bar
但這樣每次都要打前面那一串很麻煩,不如直接
export
,例如我自己是寫了個簡單的 alias 到~/.zshrc
裡面:
1
2 alias set-company-git-ssh='export GIT_SSH_COMMAND="ssh -i ~/.ssh/COMPANY_KEY";
export PS1="${PS1}COMPANY ==> "'
這樣下了
set-company-git-ssh
後就可以安心使用git
,連 zsh 的$PS1
(prompt) 都會變,一目了然。順帶一提,
npm install
自己也會去吃GIT_SSH_COMMAND
,很方便。
工作上需要用公司的 email 申請一個新的 Github 帳號,這樣一來我的系統上就有兩個 Github 帳號用於開發…orz,總之今天摸索了一下多重 SSH key / GitHub 帳號時的應對方式。
clone
/ fetch
/ push
(這樣就不需要每次 push 都輸入 GitHub 帳號密碼)clone
。git push
時,根據 clone
時選的帳號,來自動選擇正確的 SSH key。
協定 長怎樣 需要 Github 密碼 SSH `git@github.com:USERNAME/REPONAME.git` 不用 HTTPS https://github.com/USERNAME/REPONAME.git
每次 push 都要
因為現在一組 SSH key 只能綁一個 Github 帳號(就算可以綁多個我也不太建議,你會很混亂),所以我們要建立一個新的:
這個很少會做,很多細節都忘光了,所以還是寫一下筆記。
cd ~/.sshssh-keygen -t rsa -b 4096 -C "YOU@COMPANY.com"
這裡假設建立了一個叫 COMPANY
的 SSH key。做完後,這會在 ~/.ssh/
下產生兩個新的檔案。 .pub
結尾的是 public key,另一個則是 private key。
這時打開 Github web 界面中的帳號設定,選 SSH key 那一頁,然後把 public key 整個檔案的內容 copy 下來貼進去。
- 給不知道非對稱加密 的基本概念的人:public key 是公開給別人看的,private key 則是打死不能給任何人看的,不要搞錯了。我遇過很有趣的一次是對方把他的 private key 貼給我了…
- 給不知道 Passphrase 是什麼東西的人:passphrase 跟 Github 密碼毫無關係,這只是讓 private key 多一層保障。在建立 SSH key 時如果有指定 passphrase,以後就算有人拿到你的 private key 檔案也沒辦法用他。缺點是會導致每次 push 都要輸入 passphrase(雖然是不用輸入 Github 的帳號密碼了)。
為了以後方便選用不同帳號 git clone 在 ~/.zshrc
或 ~/.bashrc
內加入:
alias company-git-clone='git clone --config user.name="YOUR NAME" --config user.email=YOU@COMPANY.com $@'
以後就只要輸入 company-git-clone REPO-SSH-URL
,效果就等同於:
git clone REPO-SSH-URLcd REPOgit config user.name "YOUR NAME"git config user.email YOU@COMPANY.com.tw
注意!其實這部份跟 SSH key 之間並沒有關聯。設定 user.name 跟 user.email 其實就只是以後你在該 repository 下 commit 時,會在 commit log 中顯示的名子跟電子郵件而已。所以當然,(如果公司沒有特別規定的話)你也可以在這裡填自己常用的 email 而不是公司的 email。
你可能會記得,你生平第一次使用 git 前應該有設定過類似這樣的東西:
$ git config --global user.name "John Doe"$ git config --global user.email johndoe@example.com
這裡因為有用
--global
,所以這是寫入到你的家目錄下~/.gitconfig
設定檔中。如果不加--global
參數,就變成寫入目前$PWD
所在的 git repository 的.git/config
設定檔中。
現在你應該能夠明白上面這個 alias 在幹麻。總之就是如果repo/.git/config
沒有特別指定 user,就會直接用~/.gitconfig
裡的。
現在建立 ~/.ssh/config
這個檔案,加入如下內容
#自己私人用的 GitHub 帳號,id_rsa 就是我自己原本用的 ssh keyHost github.com HostName github.com User git IdentityFile ~/.ssh/id_rsa#公司工作用的 GitHub 帳號,此處的 COMPANY 你可以自行取名Host github.com-COMPANY HostName github.com User git IdentityFile ~/.ssh/COMPANY
拿我的一個小玩具 repo kuanyui/takahashi.js 當作例子:
指令 | 用了 ~/.ssh/ 下的哪個 key | 會用哪個 git user (commit log 顯示哪組 name/email) | |
---|---|---|---|
V | git clone git@github.com:kuanyui/takahashi.js.git | id_rsa | ~/.gitconfig 內的設定 |
company-git-clone git@github.com:kuanyui/takahashi.js.git | id_rsa | takahashi.js/.git/config 內的設定 | |
git clone git@github-COMPANY.com:kuanyui/takahashi.js.git | COMPANY | ~/.gitconfig 內的設定 | |
V | company-git-clone git@github-COMPANY.com:kuanyui/takahashi.js.git | COMPANY | takahashi.js/.git/config 內的設定 |
我們要用的就是打 V
的那兩個。
只要用這種方法,以後 push 時 git 就會自動選擇要用哪個 ssh key、push 到哪個 GitHub 帳號了。
]]>你可以試著做上面的動作,仔細觀察每次
clone REPO
下來後,REPO/.git/config
的內容差異,一旦了解它們是差在哪,你就會很難忘記這些概念了。
[注意]
_(:3」∠ )_
,但現在沒那心情所以也懶得仔細再看一次科科,本文最後的 singleton 範例有些東西我自己也搞不清楚了,知道的大大敬請指教 <(_ _)>
要理解 Python 的 Meta programming,必須同時理解 object
, type
以及 __metaclass__
, __call__
, __new__
, __init__
的運作機制。
type()
這個內建函數,來得知某樣東西的 type。type()
一個 object 時,會回傳一個東西叫做 Type Object
,你可以用 print()
印出來看看是什麼樣子:1 | print( type(1) ) # <class 'int'> |
"hello"
這個字串,在 Python 中其實是 str
這個 class
的 instance。1 | def func(): |
那我定義一個 class 的話,該 class 的 type 又是什麼?建立出來的 instance 的 type 又是什麼?我上面沒寫,因為這個問題的答案很違反直覺,下面就要來解釋。
一般來說,物件導向語言中的「class」是用來「描述如何建立 object」的程式碼;我們寫 class 就是為了建立 object。然而在 Python 中:
當你一寫下 class
關鍵字 ,Python 會執行它,並建立一個 class object
[注意]
為了避免混淆,接下來提到的所有 class object 指的皆為 「class 本身的 object」,而不是 class instance object。
既然 Python 的 class 自己也是 object,也就是說你可以把 class object :
前面提到的 type()
這內建函數極度詭異,當塞三個參數進去時,他的功能會變成建立 class object…怎麼做呢?官方文件是這樣寫:
type(name, bases, dict)
分別對應到 class attributes 中的:
name
會變成 __name__
,也就是 class 的名稱bases
會變成 __bases__
,也就是該 class 要繼承自哪些 base classdict
會變成 __dict__
,也就是該 class 所有的 member1 | # 手動寫法 (用 class 關鍵字) =================================================== |
這兩種寫法的意義是完全相同的,真是他媽的莫名其妙對吧。分析一下上面這個鬼打牆的範例:
Hello
(class object) 就是 class 自己本身的 object。 <class '__main__.Hello'>
Hello()
(class instance object) 就是大家都知道的 instance 沒啥好說的。type()
可以得知一個 object 的 type:Hello()
因為是 instance,很合理的 type 就是 class object <class '__main__.Hello'>
Hello
是 class object,那他的 type 呢?嗯,真是靠北,就是 type
,也就是 <class 'type'>
那還有個問題: type
自己本身的 type 是什麼?
1 | print( type(Hello) ) # <class 'type'> |
__class__
str
這個 class 建立所有的 string objectint
這個 class 建立所有的 int objecttype
這個 class 建立了所有的 class object
透過 __class__
這個特殊 attribute,可以得知一個 object 是什麼 class 的 instance:
1 | title = "The C++ Programming Language" |
那…來看看這些 object 的 .__class__.__class__
又是什麼
1 | print(title.__class__.__class__) # <class 'type'> |
嗯嗯,Python 裡面所有的 class 都是 type
的 instance。
metaclass 是 class 的 class,也就是說:
object 是 class 的 instance
class 是 metaclass 的 instance
type
type
是 Python 中的 metaclass:
type
本身也是一個 class
type
本身的 metaclass 就是他自己
要寫一個 metaclass 的話,就繼承 type
__call__()
預設會呼叫 __new__()
跟 __init__()
來釐清一下:
1 | class Hello: |
Python 在實體化 Hello
時的過程:
Hello() ↓ 等同呼叫 Hello.__call__() ↓ 呼叫 Hello.__new__() 建立出 object 並回傳該 object ↓再呼叫 Hello.__init__() 來讓該 object 初始化其他有的沒的
__call__()
在 class 中的預設行為,就是依序幫你呼叫 __new__()
跟 __init__()
。
假設我們定義了一個 class 叫 Hello
__call__
定義了當 Hello
後面被加上小括號、當作 function 來呼叫時的行為。預設行為是依序呼叫 __new__()
跟 __init__()
__new__
定義了 Hello
如何實體化,最後會回傳一個實體 object。__init__
定義了 Hello
實體化後,其實體 object 如何初始化(例如 member variable 定義之類的,這是大家最熟悉的部份)。__new__
1 | class Single(object): |
還記得self
只是約定成俗的東西、其實你要寫啥都可以吧? cls
就是這樣的存在。Python 大家都習慣用 cls
當作指向 class 的變數名稱、並用 self
當作指向 instance 的變數名稱。
1 | class Singleton(type): |
id 不同,為什麼?
如果第 5 行不加上 cls
,寫成 super().__new__(*args, **kwargs)
會爆掉:
TypeError: type.__new__(X): X is not a type object (str)
為什麼?
__call__
下手1 | class Singleton(type): |
En
Jacob Gade’s “Tango Jalousie” transcription for piano solo.Zh
我不知道這中文要怎麼翻譯哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈Jp
ヤコブ・ゲーゼの『タンゴ・ジェラシー』のピアノ独奏トランスクリプション。楽譜 PDF をダウンロウド / Download sheet PDF / 下載 PDF 樂譜
這首好像很有名,連我爸媽的年代他們都聽過,但我是因為這個辣椒交響樂團才第一次聽到:
這旋律尤其是中間 2:33 秒開始那段真是他娘親的太美了啊混蛋。
總之,這次聽寫改編是根據上面這兩個影片。太小看後面的工作量了,前面很好改,所以原本以為三天可以寫完,最後寫了兩個禮拜…因為後半部很難推敲該怎麼改比較好…
每次寫完 transcription 貼上這個 blog 時都會順便寫些有的沒的近況,因為我覺得這樣才有人味,我寫報告也都是這樣會隨便延伸,所以有些老師喜歡有些討厭,分數落差很大。
寫這篇文章時又順手改了一下 hexo.el
。hexo.el
真的很好用又懶人啊,實在很討厭那種看不起 frontend 還到處酸別人用 frontend 的 geek,那只是為 geek 而 geek 而已,吃屎去吧自以為是的傢伙,偏偏這種人永遠不會認錯。拎老師就是愛用 Magit 來操作 git
、愛用 QWinFF 來操作 ffmpeg
、愛用 hexo.el 來操作 hexo
啦。
以下嚴重劇透,沒看過這部的請自主避難(但我非常推薦去讀一下這部),謝謝。
逃離伊甸園是個故事規模挺大的漫畫,加上有著各種廢墟跟龐大島嶼的場景非常對我胃口。
看到網路上一堆人罵這部「夢結局」。拜託喔這才不是什麼夢結局勒,主角們確實還活著。
其實這部劇情結尾給人的衝擊跟 BioShock3 有點像。對,就是時空穿越。結尾短短三話就把整個故事的謎底揭露了:
飛機降落的島嶼是石動美依奈的爺爺為了紀念喜歡史前生物的孫女而砸錢建出的人工島。
主角媽媽執行計畫後的某一天夜裡,夢到兒子跟同班同學們的冒險:
最後在敘述主角媽媽跟石動爺爺的那段實在很感人…但重看一次發現石動爺爺臨終的最後一句話「這樣,我也能去美依奈…那裡…」就讓我有點好奇了。因為那時美依奈她應該並不算死了,只是在未來,那爺爺去世後,到底能不能見到美依奈呢?
不過還是有部份小疑點我沒搞懂是怎麼回事。
]]>因為這幾個疑點沒解釋,所以確實有被腰斬的可能?我不知道啦,至少我很滿意這個結局。不過也有可能是我完全沒有編劇天份的關係,完全無法想像還有更好的結局的話會是怎樣。
此篇假設你已經理解 Lisp 中的 cons 與 list。
atom 這個詞本來的意思就是指不可分割的東西、最小的單位,而 Lisp 中,只有 cons (或者用其他語言使用者比較可以理解的詞,叫做 list) 是可以分割的。例如最基本的 operator 之一。
其他舉凡 integer, float, symbol, string 甚至乍看之下以為可以分割的 vector 都是屬於「不可分割」的東西。
Lisp 中一切不可分割的東西,都叫做 atom。或者換句話說,list 以外的任何東西,都是 atom,因為只有 list 是可以分割的。
有個例外…就是
nil
。 這鬼東西比較機車一點,雖然它屬於 list(空的 list),但也同時屬於 atom(空的 list 確實也無法再分割啊)…
atom
這個最基本的 Lisp operator 的功能就是判斷一個物件是否為 atom:
1 | (atom 12) ; => t |
所以…在現代的 Lisp dialect 中,(atom x)
的意義基本上完全等同於 (not (consp nil))
,真是毫無屁用啊。
一個 symbol 一定屬於 atom,但 atom 不一定屬於 symbol
舉例來說,一個 integer 是個 atom,但並不屬於 symbol
1 | ;; 一個 symbol |
一個 interger 只是 atom,而不是 symbol,所以當然也沒有 symbol 該有的功能,例如 每一個 symbol 都有點像是物件導向語言中的物件,裡面包含了一些屬性,以 Common Lisp 跟 Emacs Lisp 為例,每個 symbol 都擁有如下的屬性:
屬性名稱 | 可用啥函數取出內容 | 用途 |
---|---|---|
name | symbol-name | 該 symbol 轉成字串時的樣子 |
value | symbol-value | 該 symbol 作為 variable 使用時所儲存的 |
function | symbol-function | 該 symbol 作為 function 使用時所儲存的 function 本體 |
plist | symbol-plist | 一個看你要拿來幹麻都行的 plist |
你就可以知道,為什麼一個 function 或 variable 要取名時得用 symbol 當名稱。一個整數在 Lisp 無法拿來當作 function 或 variable 的名稱,因為整數並不是 symbol。
symbol 可以想成是 C/C++ 裡的指標,每個 symbol 都指向記憶體的某個位置。所以,當你用 eq
來比較兩個 symbol 是否相同時,會比使用 equal
或 string=
來比較兩個字串速度來得快。(因為字串得一個個字元比較,而 symbol 只要比對記憶體位置)
「阿母啊!我終於搞懂 Lexical Scoping 是啥啦~!」
Lexical scoping 與 Dynamic scoping 我以前一直嘗試想要弄懂但卻一直搞不懂,就算一時看懂了也不知這到底在幹麻或能幹麻所以每次看完就忘記(用不到的東西都記不住的啦),但最近因為 Lisp 寫得比較熟悉了,開始狂用 functional programming 的一些技巧後才終於了解其中奧妙,尤其是 lexical scoping 的好用之處,以及為什麼王垠會幹譙 dynamic scoping。希望這篇筆記可以幫助到一些跟我一樣搞不清楚狀況的人搞懂並記住兩者差異,尤其是如何善用 lexical scoping 的特性做一些神奇的功能。
關於 Emacs Lisp 的 Lexical Scoping
Emacs Lisp 在 Emacs 24.3 開始也支援 lexical scoping 了,然而它預設仍然是 dynamic scoping。如果需要使用 lexical scoping。必須在你寫的
el
檔案的第一行內加入這句咒語「-*- lexical-binding: t; -*-
」,例如:
1 ;;; hexo.el --- Major mode & tools for Hexo -*- lexical-binding: t; -*-
這句咒語的作用技術上來說,Emacs 的設計是:當
lexical-binding
這個 buffer local 變數的值是 non-nil 時,該el
檔案/buffer 就會以 lexical scoping 去 interpret Emacs Lisp。而-*- lexical-binding: t; -*-
的作用其實就是自動在你打開這個檔案、或者 interpreter 在 eval 這個檔案時自動幫你(setq-local lexical-binding t)
而已。
要記住用身體記住最快,所以如果可以建議以下整個自己開個 Emacs 跑一遍。以下會拿 Emacs Lisp 當例子,而不是大家常用的 Scheme 或 JS。為什麼呢~~~因為 Emacs Lisp 是目前我所知道最詭異的語言,竟然同時存在 dynamic scoping 跟 lexical scoping 的執行方式……總而言之,寫 Emacs Lisp 你可以自己決定要用哪一種 scoping,這種情況拿來實驗 scoping 是非常容易理解的,因為你可以拿一樣的 code 放在不同的 scoping 下實際執行比較看看。
下面會大量用到 lambda
。如果你不熟悉 Lisp 裡的 lambda
,請先讀過這篇Lisp 裡面的 Lambda 到底是什麼?
我們先用 Emacs 建立一個新檔案 test.el
,注意行首不要加上 -*- lexical-binding: t; -*-
,這樣該檔案寫的 Emacs Lisp 都會是預設的 dynamic scoping。
首先,我們先寫出兩個非常簡單、功能完全相同的函數(只是一個有名字、一個是 lambda 匿名函數),這兩個函數都一樣接受 1 個參數 x
,並回傳 (* x 3)
的值:
1 | ;; 匿名函數 |
這兩個函數都不會有任何問題,不管餵它幾次、不管在哪裡餵,只要餵的數字 x
一樣,他永遠會給你正確答案,也就是 x
* 3:
1 | ;; 匿名函數 |
到這裡為止都很單純。
讓我們讓函數定義變得詭異起來:
1 | ;; 匿名函數 |
注意第一個 lambda
內的那個 a
,它的值 3
是從外部的 let
得來的,而不是一開始就把 3
這個值寫死在 lambda
中。
所以第二個 lambda 在被呼叫時立刻炸掉,因為它只知道 x
是 7
,卻不知道 a
是多少。
這段 code 沒有任何副作用與 assignment,所以應該很好懂吧?那現在我們來看有名子的函數是不是也是這樣。我們再用類似的環境條件重新 defun
一次 triple
這個函數:
1 | ;; 有名字的函數 |
可以理解嗎?Emacs Lisp interpreter 在第二次呼叫 triple
時告訴你「變數 a 尚未定義」,這就是你的 function 內有自由變數時,dynamic scoping 會遇到的麻煩。
在這個例子中,a
就是一個自由變數。
在 let
裡面 defun
時,function 的定義中包含了 a
這個自由變數。在 dynamical scoping 下,定義該 function 時只會保留一個 reference a
,但並「不會」捕捉這個 a
實際的值 3
,。
所以在 let
裡呼叫 (triple 7)
不會有問題(因為呼叫 (triple 7)
時,triple
知道他裡面的 a
其實是 3
),然而一旦跑到 let
外面,呼叫 (triple 7)
時,triple
不知道他裡面的 a
到底是什麼,於是就炸掉了:「變數 a 尚未定義」。
這就是 dynamical scoping 的問題所在。你定義的 function 很有可能放在不同的地方執行起來就得到不同的結果。
我們現在來看看 lexical scoping。在我們剛才的 test.el
的第一行(一定要在第一行!)尾端加上 -*- lexical-binding: t; -*-
後,存檔,重開 test.el
。現在,這個檔案中寫的 Emacs Lisp 會變成以 lexical scoping 的方式來執行。
再嘗試一次 defun 之前,來看看熟悉的 lambda
現在變成什麼樣子。輸入下面這行,按 C-x C-e
eval 它:
1 | (lambda (x) (* 3 x)) |
minibuffer 竟然變成奇怪的 (closure (t) (x) (* 3 x))
而不是原本的 (lambda (x) (* 3 x))
,這代表有成功啟動 lexical scoping。
1 | ;; 匿名函數 |
到這裡為止都是一樣的,但接下來用 defun
,細微的差異就出現了:
1 | ;; 有名字的函數 |
這裡就是 lexical scoping 與 closure 的威力展現之時了。
Closure 中文翻譯成「閉包」,可以想像一下,他會把自由變數給捕捉並「包」起來。
這裡要先離題一下…之前 這篇 裡面提過,Emacs Lisp 是屬於 LISP-2,他的 function 跟 variable 是放在不同的 namespace 下,所以要取得一個已經定義的函數的定義不像 Scheme 或 JS 那樣簡單,必須要用
symbol-function
來強制取得。總之…還是順便提一下免得看不懂。
到底閉包長什麼樣呢?使用 symbol-function
來看看我們剛才新定義的 triple
實際長什麼樣子:
1 | (symbol-function 'triple) |
這個 closure
就是關鍵之處了。注意那個 (a . 3)
,這就是在 let
中被 closure
所捕捉到的自由變數 a
啦,所以就算定義該 function 時,裡面包含了自由變數,也會被 closure
給完美地捕捉並「包」起來。就算往後呼叫 triple
時,全域或區域變數中都沒有 a
也沒關係,因為 closure
裡面捕捉到一個 a
了。 lambda
在呼叫時,如果自己裡面找不到 a
,會先往上一層找,就會找到被 closure
所捕捉到的 a
。再也不用擔心定義 function 會炸掉,真是太完美了!
所以,為什麼會叫做「lexical scoping(詞法作用域)」,因為有了 closure,在程式設計師的眼裡,在寫一段 code 時,該段 code 的 scope 只要管「該段 code 寫在 code 裡的上下文」,而不用費神去管「該段 code 在執行時的上下文(例如 function 定義時其中包含了執行時如果沒寫好就可能會變來變去的全域變數)」,所以 lexical scoping 也被稱為「static scoping(靜態作用域)」,而相對的,沒有 closure 的 scoping 就叫做「動態作用域(dynamic scoping)」。
一開始我也想說「我又不會無聊到故意寫個 let
還在裡面定義 function,lexical scoping 到底有什麼強的?」,後來才發現它真的很好用。這裡就舉個簡單的例子來談 lexical scoping 的實際用途。
這是我自己在寫 code 時遇到的情況,我覺得拿來解釋 scoping 很容易理解。
有寫 Lisp 的應該都很熟悉 (member ELT LIST)
這個函數。他可以檢查 ELT
是否在 LIST
之中 ,如果是,回傳該 ELT
從 LIST
上的位置數起的 cdr
,否則回傳 nil
:
1 | (member ELT LIST) |
簡單的說,我們現在要做的就是「動態產生 member
函數」:
generate-member-decider
generate-member-decider
他的功能是接受 1 個型態為 list 的 arg,並回傳一個匿名 function lambda
。lambda
功能則是接受 1 個 arg,並判斷這個 arg 是否屬於剛才 list 內的一員。1 | (defun generate-member-decider (list) |
看懂了吧?這種寫法在 dynamic scoping 裡面一定炸掉的。
在 functional programming 的世界裡,這種產生 function 的 function 只要會用的話真的很好用啊!
最後我一定要特別提一下,Emacs Lisp 裡面有提供一個東西叫做
lexical-let
,這玩意…其實是以前 Emacs Lisp 不支援 dynamic scoping 時,用一堆奇技淫巧來「模擬」出來的 lexical scoping 版的let
。不要用它,你會很混亂。
Scheme 是第一個實做 closure 的語言,一開始是為了解答「要如何給 Lisp 加上物件導向的功能」。如果你有興趣,可以讀讀 Closures And Objects Are Equivalent ,只靠著 closure 的威力,要怎麼用 Scheme 的簡潔語法搞出物件導向來。
]]>lambda
到底是什麼東西。多年後才開竅,豁然開朗感覺真是很神奇。以下會拿 Emacs Lisp 跟 Scheme 當例子。
簡單來說,Lisp 裡的 lambda
就是沒有名字的函數。精確的說,lambda
是 Lisp 中拿來表示「匿名函數」(anonymous function) 的方法。
…這種說法誰聽得懂啦。那麼先來用大家在 Common Lisp / Emacs Lisp 中最熟悉的 defun
定義一個函數 double
,它接受 x
一個參數,最後回傳 x * 2
的值:
1 | ;;;; Emacs Lisp / Common Lisp |
但如果寫過 Scheme,就會知道 Scheme 可以寫成等價的:
1 | ;;;; Scheme |
注意第二種寫法,他其實就是把 double
這個名稱綁到 (lambda (x) (* x 2))
上面,所以以後我們呼叫 (double ...)
就是在呼叫 (lambda (x) (* x 2))
相較於 Scheme 的設計,Emacs Lisp 的 defun
在背後做了很多 magic,而不像 Scheme 這樣極簡主義、沒有什麼 magic 直接暴露給使用者看內部設計。其實呢…Emacs Lisp 中,defun
所做的事情跟 Scheme 的 define
本質上其實一模一樣,裡面也是一個 lambda
,一樣也是把這個 lambda
綁到一個名子上:
1 | ;; 因為 defun 在 Emacs Lisp 中其實只是一個 macro, |
上面我們用了 defun 或 define 給原本沒有名子的 lambda 函數取了名子 double
,可以讓我們輕鬆的使用:
1 | (double 7) |
這種方法來呼叫實際上長成這樣的 lambda 函數:
1 | (lambda (x) (* x 2)) |
最後回傳:
1 | ;; => (* x 2) |
那,我們要怎麼呼叫一個沒有名字的 lambda 函數呢?很簡單,根據 Lisp 的語法,僅僅寫一個寫 car
只會被 interpreter 解釋成「取出 car
這個變數的值」(所以身為 LISP-1 的 Scheme interpreter 會回你 #<procedure car (_)>
,而身為 LISP-2 的 Emacs Lisp interpreter 則會爆炸,因為你還沒有定義 car
這個變數),但(car x)
就會變成要執行該變數。如果 car
這個變數的內容是一個 (lambda ...)
表達式,就會變成執行這個 lambda
。也就是說,讓你的 lambda 包上一層括弧,這個 lambda 就會被執行了:
1 | (lambda (x) (* x 2)) ;; 就只是一個「沒有名字」的函數,沒有被呼叫。 |
看得懂嗎?GNU Emacs Lisp 文件就是這樣教你 lambda 的,但當時初學 Lisp,腦子打結完全看不懂,兩年後把才突然開竅,原來這麼簡單、又神奇。只是一眼看過去被括號混淆了視聽而造成理解障礙而已。
LISP-1 與 LISP-2?
LISP-1 是指 function 與 variable 共用同一個 namespace 的語言,所以你沒辦法讓 function 與 varianble 取同個名字。目前大部分的程式語言都是這樣設計,例如 Python、Java、JavaScript、Scheme。
LISP-2 則是 function 與 variable 各自有不同 namespace 的語言,所以你可以同時定義一個名字叫
foobar
的 function,以及一個叫foobar
的 variable。這樣設計的語言有 Ruby、Emacs Lisp、Common Lisp、Perl。
funcall
與 apply
因為 Emacs Lisp 是 LISP-2,不像 Scheme 那樣 LISP-1 單純,所以你沒辦法直接用 setq
來把 lambda 綁到一個變數上直接呼叫。不過還是可以用 funcall
或 apply
來強制呼叫 variable 裡的 lambda
其實他們原本的主要用途並不是這樣啦…只是剛好這裡可以這樣做。
1 | (setq multiply (lambda (a b) (* a b))) |
Lisp 裡面是非常常用 Lambda 的,例如最常用的 mapcar
1
2
3(mapcar (lambda (x) (* x 2))
'(1 2 3 4 5))
;; => (2 4 6 8 10)
或者也很常用的 remove-if
1 | (remove-if (lambda (x) (> x 5)) |
Lambda calculus 又是個更難懂的東西,我自己也還沒仔細去看過。不過前陣子有大大跟我說「let
是可以很簡單的轉換成 lambda
的」:
1 | ;;; let |
原來 let 的本質這麼簡單,美得看到當下真是嚇了一跳。有時間來讀一下 lambda calculus 吧。
]]>hexo.el
)。不過有些因為目前我沒用過/用不到,所以也懶得去研究其中差異,不要打我。start-process
(Async)(start-process NAME BUFFER PROGRAM &rest PROGRAM-ARGS)
這是 Emacs Lisp 中最低階的 process 呼叫方法之一,他 stdout 輸出的 BUFFER
(fundamental-mode
) 連 ANSI color 都沒有(所以會看到一堆亂七八糟的 ANSI color 控制字元),要自己使用 set-process-filter
來自訂 Buffer 的 IO。
設定不出來的 filter…
看一下 set-process-filter 的文件:
1
2
3
4
5
6
7
8
9
10 (set-process-filter PROCESS FILTER)
Give PROCESS the filter function FILTER; nil means default.
A value of t means stop accepting output from the process.
When a process has a non-default filter, its buffer is not used for output.
Instead, each time it does output, the entire string of output is
passed to the filter.
The filter gets two arguments: the process and the string of output.
看起來自訂 filter 應該很容易,所以我這樣寫:
1 | (set-process-filter my-process (lambda (process string) |
但很奇怪,雖然 ANSI color 控制字元經過實驗確實被
ansi-color-apply
給消掉了,但不管怎麼試顏色(text-properties)仍舊就是出不來。這裡有待高人指點。
call-process
(Sync)(call-process PROGRAM &optional INFILE DESTINATION DISPLAY &rest ARGS)
總之我是把這玩意看作是 start-process
的 sync 版本。
start-process-shell-command
(Async)(start-process-shell-command NAME BUFFER COMMAND)
這玩意基本上跟 start-process
一樣,只是吃的 input 變成 shell command string 而已。如果你只是要開個 process 做些事情、不用去讀他的 output 的話,用這個沒問題。但如果你還需要漂亮的輸出…還是用 shell-command
吧。
call-process-shell-command
(Sync)(call-process-shell-command COMMAND &optional INFILE BUFFER DISPLAY)
應該只是 start-process-shell-command
的 sync 版本(好隨便)。
shell-command
(Sync)(shell-command COMMAND &optional OUTPUT-BUFFER ERROR-BUFFER)
這玩意很容易使用,看一下上面這兩行你大概就知道這是啥了。而且這玩意會自動幫你 render ANSI color 成 propertized text(用人類的話來說,就是你可以在 OUTPUT-BUFFER
中看到字體有顏色),真是太棒了。
async-shell-command
(Async)(async-shell-command COMMAND &optional OUTPUT-BUFFER ERROR-BUFFER)
跟 shell-command
幾乎一樣,只是會自動幫你在 COMMAND
的結尾加上 &
萬一執行的指令需要輸入東西(例如
git push
可能會叫你輸入密碼)怎麼辦?利用前面提過的
set-process-filter
:
1
2
3
4
5 (let ((process-buffer-name "*test-process*")
(process-object nil))
(async-shell-command "echo hello" process-buffer-name)
(setq process-object (get-buffer-process process-buffer-name))
(set-process-filter process-object 'comint-output-filter))
comint-output-filter
很方便,你不用自己浪費生命寫 filter,這個 filter 會自動幫你抓是否有 prompt 之類的東西。
shell-command-to-string
(Sync)(shell-command-to-string COMMAND)
這玩意本質跟 shell-command
一樣,只是用途就如名稱那樣是「執行完 shell command 後,return stdout 為字串」而不是另外開一個 buffer 來慢慢顯示 stdout。所以他只有 Synchronous。
En
“The Elder Scrolls V: Skyrim”‘s main themes piano solo transcription (paraphrase).Zh
「上古捲軸五:天際」的主題曲鋼琴獨奏改編。Jp
『The Elder Scrolls V: Skyrim』のピアノ独奏トランスクリプション。Sheet updated in 20160130
楽譜 PDF をダウンロウド / Download sheet PDF / 下載 PDF 樂譜
暫時懶得錄音啦好麻煩喔,而且相機腳架不見了啦幹。
這首真是超熱血彈起來超爽啊。超喜歡上古捲軸 Skyrim,雖然我都沒啥在看劇情都在到處亂逛看風景。
曾經在大學社團成發時,跟社團中的一位小提琴手一起合奏過這首曲子,跟悲慘世界 One Day More 一樣非常受觀眾歡迎,台下似乎也很多人玩過 Skyrim(這應該是我表演過最受歡迎的兩首吧)。當時拿到的是合奏譜,但我們有額外加上/改編了大概 40% 的東西。
緣份還真是神奇的東西啊。如果不是有在用 Twitter,我應該不會玩過 Skyrim,也不會知道這首曲子。當初只是偶然去社團晃晃,偶然聽到隔壁竟然有人在拉 Skyrim 的旋律,也偶然心血來潮上前閒聊一下,就從他那拿到譜一起合奏這首了。
覺得這輩子目前做過最好的決定應該是學樂器吧(好像很少人不是被父母逼去學的),而且學的是心情很糟時可以用暴力發洩搞得滿身大汗的鋼琴。不過視奏能力得花不少時間練得好一點,視奏能力提升後,彈琴的樂趣才開始指數飆升。重點是,鋼琴是非常少數適合獨奏的樂器(其實我覺得就算是流浪者之歌,小提琴獨奏聽起來就是好無聊好單薄喔…),想彈就彈不用揪人。
學鋼琴的契機是小一時聽到父母朋友的鄰居的大姊姊在彈鋼琴,好喜歡那個聲音。就在某次我媽晚餐在煮飯時跑去說「媽,我想學鋼琴耶」沒想到我媽竟然很贊成。這真的要感謝我的父母…感謝不完啊,畢竟鋼琴買下來跟五年多的學費對一個普通家庭來說可是很驚人的……。(不過有辦法這樣爽快贊成,不知是否跟父母自己就是靠藝術吃飯的有關。)
所以呢…最近就動手以之前的合奏譜為基礎改成純鋼琴獨奏了,…應該說幾乎全部重寫(95%),只有前兩頁看得出原本的樣子,因為我改編一律希望盡可能忠於原曲,在雙手能彈出的範圍內、且盡量讓鋼琴音色發揮貼近原曲的音響效果。我還蠻有自信在網路上或 YouTube 你應該都找不到聽起來或彈起來比這還爽的 Skyrim 改編了。
嗯,這首希望可以讓你彈得非常爽,我自己是彈得很爽啦。
Just saw this fabulous The Tale of Viktor Navorski, however, I don’t know how to play clarinet and its not for solo… So, I merge the staffes. Download
Therefore, this is totally not my work, so I put only the original composer & transcriptor’s name.
剛剛看到這個 The Terminal 的配樂 The Tale of Viktor Navorski 改編的相當棒,可惜我不會單簧管而且這要合奏…所以順手合併成了鋼琴獨奏譜。 按我下載
然而這就完全不是我做的,所以我只放了原作曲家跟改編者的名子。
如果你喜歡我的改編作品,希望用鋼琴親手彈出你熱愛的曲子,可以參考我的樂曲改編服務。
]]>奇怪連我自己都忘記什麼時候寫了這篇的就這樣躺在
_posts/
裡…日記真是神奇的東西。 [2015-12-27 日 00:39]
坐立難安的那種糟糕感覺,做什麼感覺都不對,果然我還是不存在在這世上比較好。為什麼自己這麼沒用呢。又期望快點睡死然後意識再也不要醒來。
爸爸說過的「永遠別在網路上跟別人抱怨」我銘記在心,所以我這些廢話才貼在這個 blog,是我自己的記事,至少不像 Twitter 是主動推給別人看。
我不夠努力,我沒有藉口。
最近接收了一隻爸的 Android 手機(不過沒拿來當手機因為太耗電,而且記憶體過小,內建軟體更新完就差不多要警告空間不足了,所以搞了老半天把它 root 砍掉一堆內建的東西),只裝了 Anki 拿來背日文單字,算是做的少數比較有營養的事情之一,但有營養不能當飯吃,還是彌補不了我這個廢物的缺陷,噁心想吐。
真的很羞愧,Django 最近也沒在寫。專案大概完成了 89%吧,但沒有動力與心情實在寫不下去了。
對我來說,能做的事情中,能不讓我自己感到愚蠢/噁心/羞愧的,好像只有藝術。不這麼做的話,我會覺得支撐我這種廢物生存下去而不感到羞恥的最後一點信仰與價值與都沒了。
我仍然試著作曲,但產量少得驚人。至今以來也花了不少時間,但這一年來只有吐過兩首,演奏總時間不到兩分半。
我寫出一堆湊不起來的片段。其實也有稍微分析過一些曲式(主要是奏鳴曲,因為想寫),但也沒啥屁用,還是不會接。可能是就是那種不懂得抉擇的挑三揀四個性,我兩個小節都會推敲很久,但其實別人一看甚至只是一定一定覺得沒什麼,實際上肯定也沒什麼,因為這種感覺在大學不斷遇到,別人客觀角度看我做的東西就是沒什麼,但我卻還煩半天擠不出來。這就是廢物的現實。相較之下,我妹的個性就非常爽快、也從不會鑽牛角尖,不像我這種煩死人的人渣。
我「不會下決定」,我會不斷推敲:
- 什麼旋律非常好聽,至少有觸動到自己的感覺
- 這個旋律有沒有跟其他作品類似甚至重複過(如果是,跳回 1. )
- 才決定要用在哪裡
如果不是非常好聽我就是寫不下去,可是我發現古典音樂作品裡面,很多時段都不是非常好聽,多是過場(個人感覺,可能我沒有那種音樂慧根吧)
而且我連 1.都不太會判斷了。其實很多作品的旋律我都不覺得好聽,但卻是名曲(例如 Liszt 的「森林的絮語」主題),甚至一開始覺得超難聽,聽了很久以後才發現好聽之處的(例如拉三第一樂章一開始的主題、Alkan Piano Concerto 第一樂章一開始的主題)。
總是覺得爸媽好厲害,不只是他們能在自己的領域上闖出一片天(台灣能只靠著畫插畫這超窄門吃飯的沒幾個,而且也不開畫室教學生或跑去學校當老師,還能把兩個小孩拉拔大、學鋼琴…總覺得非常對不起他們,養出我這種討人厭的難搞的來討債的廢物死小孩),而且能對自己的興趣不斷鑽研進步。每次想到這裡都覺得我這種貨色不應該是他們的小孩。不像我妹那樣也是繪畫能力超強又有興趣沒事做時的興趣就是畫圖,我卻跑去念什麼書讀什麼大學嘛,本科學不下去、寫程式寫得不怎樣、鋼琴技巧毫無天份、作曲先別談質量連數量都湊不起一打,學一堆沒辦法拿來養活自己的半吊子技能。雖然我個人很慶幸念了這所大學,至少學生生活本身是開心、令人懷念的。我覺得我精神都快分裂了,私以為世界本身是各種矛盾的集合啊。
]]>COSCUP 2015 流水帳心得文一篇。
5:50 起床,6:30 出門,7:30 到瑞芳車站,7:39 搭上火車,8:20 到南港車站,8:50 到會場。
在南港車站等車時遇到一男兩女學生貌,一問之下也是去 coscup 的,不過因為他們自己一直狂聊天,我就不太好意思插話閒聊。
一進去就遇到 superbil 大大,原來我沒被忘記啊 QQ。
社群攤位到處亂逛,在 GitHub 攤位遇到大名久仰的 muan 大大,稍微聊了一下 jekyll、拿個 Octocat 跟 git 貼紙。
coldnew「Build your own Embedded Linux distro by Yocto project」
因為對 Embedded Linux 完全不懂所以也完全聽不懂在講什麼…不過其實來聽這場只是為了演講過後去窩序ㄆ一下寫了一堆 Emacs Lisp 的 coldnew 大大(之前丟了一堆難看的 patch 給他的 org-ioslide)。Github 上的大頭照跟本人落差也是有點大啊,後來才知道那是十年前大一時拍的照片了。
PCMan「LibIME-Windows 下的 Open Source 中文輸入法開發」
PCMan 出品品質保障,很有梗的演講 + 熱血的專案,可惜我已經很久沒用 Windows 了。
jserv & 曾政嘉「Linux 桌面系統在繁體中文資訊化的發展回顧」
其實類似的題目 jserv 已經講過數次,自由軟體的正體/繁體中文 i18n、l10n 的現況,例如永遠都是那幾個人在開發的新酷音(對不起我是廢材我不會寫 C/C++ ,不然我早就去丟 PR 加上一個我很想要的功能了…)、以及一大堆 FLOSS 專案其實只有一個人的「翻譯團隊」等等。
確實有點驚訝,我用得這麼爽這麼開心的 KDE 竟然才一個人翻譯,感覺應該貢獻一下翻譯,但才想起來我自己根本沒在用中文翻譯…
界面翻譯好像真的只有一般使用者會需要(哪有不熟英文的開發者),能定下心來做翻譯這種枯燥工作真的只剩熱血在支撐吧。裝 Linux 中文桌面給家人用時,i18n 確實是很重要;但想起之前年少無知翻譯過某軟體後…我想我這種沒語言天份的廢材還是不要出去秀自己的下限好了 orz
吃完飯 cosplay cup。
Ly「立委哩公蝦」
沒在認真聽內容,在台下改 1947 序曲。
想想這種議題真的蠻令人無力的。
ZSShen「A Beginner’s Journey to Mozilla SpiderMonky JS Engine」
超硬 der 主題,好像是在講一些 Mozilla SpiderMonkey 的背後運作,我進去三分鐘看到投影片出現 CFG 就逃離現場了 (<= 寫不出 compiler 的廢物 ・゚・。・゚・(つД`) )到處逛社群。
edwardc「快快樂樂管理 Log: Logstash + Cloud Logging」
大開眼界,我沒想到 log 竟然可以這麼肥,而且還只是「中小企業」而已。果然現實不過我這種沒有經驗的廢物能想像的。不過這場教的方法不知能用多久就是=w=”
Jserv & 陳建霖 「Build a Minimal Operating System Kernel for ARM」
演講廳爆滿,可惜內容聽不懂…orz 但那種教學方式與氣氛真是讓人羨慕啊。很希望我念的學校有這種老師,不過…這些都是緣份啦…。
旁邊有個傢伙佔著座位滑神魔之塔,台灣最美麗的風景果然是人。
R0 二樓遇到 rail02000 大大,看一堆可怕的價格飆升。
有點感到奇怪的是,我不知道連譯者的簽名書都會有加值效果=w=”
c9s 標到了「jserv 陪你寫程式」,奇怪他自己明明已經是大神了還標這幹麻 w。
捕捉到野生的 @azazabc123 XD
— 0x⛄0000000 (@sntc06) 2015, 8 月 15
跟去年一樣混亂的狀況,延遲了一個小時才開始的 BoF,因為沒有特別想去的社群,也不想看啥電影,莫名其妙就跟著 superbil 跑到新竹碼農跟 KDE 那攤了。pizza 終於有吃飽。
demo 了 Emacs 的 Org-mode、WDired、wgrep 給對 Emacs 有興趣的人看。回頭一看發現 superbil 大大也在傳教。
8:35 離開,搭火車回基隆,快 11:00 到家。
跑去 openSUSE 攤位跟 SUSE 台北辦公室的大大聊天,靠悲了一下悲劇的 zypper 跟 YaST2。(對不起我又變成那種只會抱怨的 end-user)
clkao「g0v 村情咨文:跨界元年」
其他題目沒有特別感興趣的,而且想聽 jserv 中午的那場演講就先跑到活動中心 H0 了。其實沒有很認真聽,也沒有特別感想。orz VLC 那場我英文聽力爛到爆就放棄去了。(私心偏好 mplayer,科科)
ETBlue「動民主血淚史」聽一下就不想聽了(被拖走)。
後來才發現「Neural Turing Machines Implementation」這題目好像有趣得多,但有點怕跑去 R0 到時會回不來 H0 就放棄,而且說真的我也不覺得我能聽得懂,只好在 H0 的位子上看 R0 的投影片…
期待這場錄影釋出。
jserv「為納稅人而教:開放原始碼應用於高等教育,可以帶來哪些轉變?」
jserv 談教育,品質保證。之前 jserv 就已經談過幾次這個題目,現在已經不知還能打什麼心得了。
Meghna Singh「The CV is Dead!」
全英文演講,麥克風又小聲到靠悲,專注力只聽完前兩頁就散失光了,後面完全聽不懂他們兩個在講什麼鬼。廢材的英文聽力可以嚇人到什麼程度可是不容小覷。超想離席的。好像應該去聽 R1 的「A Peek into Python’s Object Model and Bytecode from a Smalltalk User」才對,感覺那場很歡樂。
freedom「如何快速建立資料庫服務的私有雲(DBaaS)-以 OpenStack 和 MySQL 為建置基礎」
超爛演講,講得比我還爛,完全不知道在講三小。雖然本來就有預期這是廣告場,不過真的講得太爛了,講題離題,明明要講 OpenStack 卻幾乎都在講 MySQL,也沒聽懂他到底想表達什麼,更別說講者音量根本只在台上喃喃自語又糊得要命。奇怪了 Oracle 都啃花錢贊助 COSCUP 了,好好的打廣告機會怎麼找這種人來浪費掉啊(喂你們還排在 jserv 這超大人潮力場的場次前面耶)。
H1 的「台灣個性與 Open Source 開發/ Taiwaners and Open Source Development」好像評價不錯,等著看錄影。
R1「fetch is the new xhr, fetch-er is the new $.ajax」之前在寫前端時好像用過,但我忘記是什麼鬼了,等著看錄影。
jserv「『封麥』演說:台灣開放原始碼生態圈回顧」
jserv:昨天聽到會眾的談話,讓我驚覺就算 COSCUP 連續辦了十年,不少人仍以「如何佔便宜」的心態,對待已和我們生活密不可分的自由軟體和開放原始碼,於是我把「封麥」演說的沈重詞彙拿掉,僅留下暗喻「舉辦再多研討會,也改變不了嚴重缺乏開發者」的困境,但多少人聽進去了呢?
其實我不太確定大大說的佔便宜是指什麼事…去#cschat.tw,發現大家也不太確定他在指什麼=w=”
(22 時 21 分 54 秒) whitglint: 也許是自由軟體推廣起來了, 以前都是 開發者==使用者 XD
jserv: @iblis15 請問你每天用的軟體中,有多少是台灣人參與?難道與中文相關的自由軟體都很完美嗎?我並沒有否定 COSCUP,而是檢討我們傳遞「技術打底」的迫切性,顯然不夠顯著
確實不完美,但我覺得已經非常好了說。(倒不如說,就算不是中文相關的自由軟體也不一定完美啊…)我很感謝所有對自由軟體 CJK 環境的貢獻者,從中文顯示、輸入到列印,跟十二年前用過的 Mandrake Linux 9.1 比起來現在簡直無法想像。jserv 常常說新酷音很爛,我一點都不覺得啊,比微軟新注音好用多了。以我現在用的自由軟體來說,會遇到中文問題的已經不多了,真的比較麻煩的大概只剩 LaTeX(有 texlive 跟 XeLaTeX 後問題少很多),還有 Emacs 仍需要調校不少東西,但跟以前比起來已經好很多很多了。至於「技術打底」…我不會寫 C/C++ 啊是個只會寫 Python 跟 Lisp 這類高階語言的傢伙._.
話說 Emacs 的狀況比較特殊,會用到 CJK 使用者幾乎都是日本人(Emacs 本身的 CJK 支援也幾乎是日本人在貢獻),中文使用者好像相當稀少。BoF 時,大家對於 Emacs 有台灣社群感到相當驚訝的樣子。
我個人很不喜歡強調地域、區域、血緣、種族、性別等等只會分化這個世界的玩意(原因我已經講到懶得再次敘述了,有興趣的請看夏末廢話數則),所以其實 jserv 的某些觀點我並不贊同。
我不喜歡在貢獻自由軟體時還要強調我是哪裡來等等事情,或者強調某某專案是台灣人開發等等(最喜歡搞這套的就中國人吧,整天講国产国产国产软件长国产软件短的看得都想吐。),根本沒有必要。你問我哪裡人,我偏好的回答是,我是住在地球上的一個人類。但我真的很討厭人類,所以更偏好的回答是,我只是個地球上的生物。
雖然我功力很廢,但我很樂意貢獻自由軟體(雖然以我的能力能貢獻的不多 orz);不過我不會說自己是哪裡人。
還有,我果然還是不喜歡 PyLadies、WoFOSS 這類什麼「女性專屬」社群啊(理由一樣在這篇 裡面寫過,對我開罵前請先讀一下)。…其實他們完全沒做錯什麼,只是我還是不夠成熟也沒有雅量想法又激進吧。
在門口等雪人鐵道漂 J 橡皮擦他們時遇到了 coldnew 大大,話匣子打開狂聊,後來就大家一起去吃拉麵了(免費續麵還不錯)。一邊走一邊繼續講。coldnew 大大感覺真的對 Lisp 跟 Clojure 很有愛,尤其 Clojure Script,不過我前端還不需要寫到很複雜的東西,好像還沒必要用到這個…而且其實目前還不覺得 JS + JQuery 有特別難寫。再觀望看看。
這次參加 COSCUP 感受最深的,是在與會期間的各種所見所聞、常常覺得人生很有希望、還是美好的而感到還可以繼續活下去、做點有意義或有趣的事;但冷靜下來卻仍覺得超沒希望,尤其我又是個才智平庸的廢物。
對不起這個敘述沒什麼邏輯,只是個記敘而已。
一點主觀的無意義抱怨:其實我不太喜歡這次的參加者。可能是因為一堆佔位和需要被 GC 一下的 garbage、IRC 上面一些無聊的冷嘲熱諷…或者又只是我太神經質對與會者期望過高…。
其實 COSCUP 會後想想,我不應該再試圖推廣 Emacs 了,私心覺得目前 emacs.tw 社群的小規模剛剛好,氣氛溫馨愉快、有問題就有解答。
明明上大學後體會到最深刻的真理之一就是「人多準沒好事」,我幹麻沒事找事拉更多人進來啊白痴,Emacs 感興趣就玩,社群也隨緣吧。
]]>site_title
), like this:1 | class Label(models.Model): |
And, make a form like this to update it:
1 | Site Configuration |
There are some package like jezdez/django-constance to do this task, but I would rather not to use too many 3rd part package in project. Though, I use
django-crispy-forms
.
settings.py
Define your labels in settings.py
:
1 | LABELS = [ |
1 | from django.conf import settings |
We define save()
method to save request.POST
into our model.
1 | from django import forms |
1 | from pages.models import Label |
label_settings.html
This page is used to edit/save our labels.1
2
3<form method="post" action="">
{% crispy form %}
</form>
1 | from django import template |
1 | {% load common_tags %} |
此曲謹獻給所有 228 與白色恐怖時期的受難者。
This work is dedicated to all sufferers of White Terror Period in Taiwan.
並向蕭泰然大師致敬;您是獨一無二且偉大的作曲家。
Besides, express my respect to master Hsiao Tyzen; you’re an unique and great composer.
(updated) [2015-12-27 日] 樂譜大量修訂。
Mn
Siau Thài-jiân “1947 Sū-khek” kǹg-khîm ê to̍k-chàu kái‑pian pán‑pún.En
Hsiao Tyzen‘s “1947 Overture” piano solo transcription.Zh
蕭泰然 大師的《一九四七序曲》鋼琴獨奏改編。Jp
蕭泰然の『1947 序曲』のピアノ独奏トランスクリプション。
楽譜 PDF をダウンロウド / Download sheet PDF / 下載 PDF 樂譜
表紙 PDF をダウンロウド / Download cover PDF / 下載 PDF 封面
特別感謝:好朋友 Yoxem 幫忙校訂 Holo 語(台語/閩南語)歌詞。
Special Thanks: Friend Yoxem corrected the Holo lyrics.
我暫時就不錄音了,沒心力再去搞那個,我演奏爛到不行的,但這首絕對是彈得出來的獨奏作品。如果有人能演奏並讓我知道,我會非常開心而欣慰的(如果允許我放您的演奏版本在這篇文章中那更好)。
Currently I think I won’t record my performance; I have no patience to try that anymore; my performance skill is awefully terrible (though, this piece is truly solo-playable). Nevertheless, if you play this piece and let me know, I would be very happy and gratified. (It would be better if you allow me to put your performance recording in this page).
去年底左右第一次聽到這首,是因為蕭泰然大師病重的新聞而去找來聽,出乎意料的,聽得感動到痛哭了很久。重複聽好幾次到現在仍然每每會讓我眼角泛淚。
過了一段時間,蕭泰然先生在 2015/2/22 過世,差六天又是那個日子。覺得我好像太晚聽到了,以前沒有注意過這位作曲家。但好像也不算不幸,早一年聽到我可能反而沒能力、或沒心情去改編它。雖然改編比作曲相較之下容易很多(我到現在依舊沒有可以登上檯面的份量的作曲作品),但畢竟還是很累人且耗時間的。
從「種一叢樹仔」那裡開始的獨唱歌聲,是那種會穿透心臟與靈魂的嗓門,發出參雜著哀傷、關懷、愛與思念、超脫時空的動人聲音。
這種難以言諭的感動,以及為了向蕭泰然大師致敬,使我覺得應該要找時間來把整首改成鋼琴獨奏。可能會被說太理想化太浪漫太煽情,隨便了,至少這是我所感受到、所想再次表達的。
這幾天就花了約兩個禮拜的時間把整首聽寫並改編完了,交叉聽了四種不同的演奏版本來比較。在改的過程聽那和弦還真能體會為何他常常被稱為「台灣拉赫曼尼諾夫」。
原本想找管弦總譜來改寫,但我一直沒找到哪裡可以入手蕭泰然大師的譜,只好聽寫。當我已經寫到「台灣翠青」那段時,才偶然因為 FB 連結發現了這個。算了…反正都寫到這了就有始有終吧 orz。全部聽寫應該也不會有什麼版權問題。
人生短暫。雖然我這個廢材目前生存在世界上好像沒什麼屁用,我想我是我們家最無用、最沒才華、內心個性又麻煩簡直是被生來討債的廢人,對不起我的家人。但改這首曲子,這個生命也許多了那麼一點點的正面意義。
我不敢也不願把這作品定位成什麼貢獻或使命,只是在理解台灣過去百年來悲慘歷史的情況下,我想改編這首應該算是有點意義;一個廢材抱著感動、追悼的心情而…算是對這個文化進貢那麼一點點估計馬上就會被溶化稀釋到不見蹤影的小作品吧。但我想我沒有空口說白話:想用實際的行動致上我個人 – 跟這整個不幸的歷史洪流與所有人權鬥士們的奮鬥比起來根本微不足道 – 對 228 事件以及白色恐怖時期的受難者的哀悼之意。
蕭泰然大師在發願寫這首曲子時,就已經定位這首一定會有政治意含與立場了。我沒有心情敘述這些,討論可以但不要來跟我灌輸意識型態,而且跟我這種小咖浪費時間沒有意義的。
另外,請不要把我改這首曲子解讀成我「愛不愛台灣」一類的議題,這點我沒心情也沒力氣也懶得敘述,也沒有必要,不要浪費時間探聽我這種滄海一粟的小咖的想法,知道了你也不能幹麻,我只是個普通地生存在這個星球上的一個廢物而已;熟識的推友、家人親友們應該會記得我對這議題的看法,他們知道就夠了,否則不要跟我這種陌生人談論這種東西,對你的生命沒有影響。我今天只是想來分享《1947 序曲》這個作品,請以藝術的角度去彈/欣賞吧。
對於此曲後段的「台灣翠青」歌詞我個人覺得已經有點不太合現實,所以有做部份修改。相信如果我能向蕭泰然大師親自解釋的話,他應該、可能、也許、大概會理解並允許我這麼做的;我只希望這部作品能有更寬廣的心胸。
1 | // 原版歌詞: |
I hate recording. Don’t blame me for my performance technique because I know it is shit clearly for a long time. This video is only for preview and prove this is indeed playable.
En
Les Misérables “One Day More” piano solo transcription.Jp
「レ・ミゼラブル」の「ワン・デイ・モア」のピアノ独奏トランスクリプション。Zh
悲慘世界的「One Day More」鋼琴獨奏改編。
PDF をダウンロウド / PDF Download / 下載 PDF
Sorry for writing the following diary in Chinese. I’m too lazy to translate.
日記の翻訳は面倒だ、もし訳ありません。
否定自己一直我是心中根深蒂固的進步動力(好像有點矛盾但對我來說確實如此),一直罵自己不夠努力、做得不夠好來驅使自己進步,我一直認為這對任何有點夢想的人來說是再平常不過的事情,然而家人和恩師覺得我這種想法很不健康。
這種心態也許有部份是受我父母的影響 - 並不是因為他們也抱這種負面想法,而是我父母實在是他們專業領域中的專家中的專家,從小看他們工作只越來越覺得那是種可能我這輩子都無法跨越的高牆。像是親眼看我爸畫圖:他能夠畫完一幅水彩,調色盤卻是乾淨的;能完全不打草稿順暢的用毛筆畫出一堆簡直完稿水準的三國武將水墨畫;能根據印象畫出熟人的肖像。然而常常畫完水彩只說「不行,這幅畫壞了/顏色不對」…。
雖然覺得這部劇情狗血得有點令人頭皮發麻,不過還是很喜歡裡面的一些心境描述。 ˊ・ω・ˋ
我一直覺得永遠不該對自己滿意,多多罵自己,才會有持續進步的動力。但這點就被我的恩師罵了;「要激勵自己應該是稱讚自己而不是一直否定自己」、「沒有人是十全十美的」。
No programmer/worker/woman/person is perfect at everything. Good enough is perfect. https://t.co/cbDuIUlLle pic.twitter.com/WAiYyHYXre
— Django Girls ATX (@DjangoGirlsATX) 2015, 4 月 26
也許是時候不該再輕視自己或妄自菲薄了,但「覺得自己是廢物的想法」已經這樣至少七八年了。我不知能不能改掉,但我會試試看。
這首改編兩年前早該放上來了,只是記譜好麻煩、譜打完了還要錄他媽的錄影…。超討厭錄影,沒那種演奏天份,不過剛剛挖到大一時的錄影有點舒坦了:三年多過去了我的鋼琴演奏聽起來真的一點進步也沒有(笑)。
悲慘世界的 One Day More 是我非常喜歡的曲子,已經聽了快十年了(國一開始算)竟然還是聽不膩…要感動人心果然還是要有人味、有劇情。在改編這首時不斷讚嘆作曲家 Claude-Michel Schönberg 的功力,然後又開始覺得自己好廢了…請克制。
2013 年大年初二時去電影院看哭得西哩嘩啦慘不忍睹,那時就想說學校社團成發就來改編這首上台吧。這首並不是無中生有,而是拿現有的演唱譜來改,不過我相當有自信的是,至少目前我還沒聽過有誰能把這首改成 piano solo 且比我改得更好更精彩的(彈得比我好、錯音比我少的倒是很多啦,也很容易)。我很有自信啊老師。
表演在同年四月份左右,那時悲慘世界電影版還很紅而且很多人看過,表演這首時觀眾反應真的特別好。比較可惜的是當時沒有錄影。
大學我所上過的社團成發曲目,最成功的兩首我想應該是 Skyrim 主題曲,以及 One Day More。
都不是古典,可以放心亂改。尤其表演完 One Day More 之後印象很深刻的是,有位不認識的社團同學跑來私下跟我說「在台下聽整個超震撼的!一開始前奏出來時竟然有種在聽現場原曲的錯覺……聽完你的演奏讓我重拾起學鋼琴的熱情」,聽得蠻開心的,很少有這種成就感。
由於打譜實在是件枯燥乏味的事情,這首表演後一直懶得把譜打出來、只有記得亂七八糟的原譜就這樣擺了兩年。前陣子發現 MuseScore 2.0 released 了,搭配 MIDI input 試用之下,打譜效率驚為天人(「相較」之下),除了 bug 多了點以及穩定性依舊有點悲劇外,比要價 USD 119 的 Sibelius First 還強大好用。不過,把這首全部打完還是花了將近兩天,有點可怕。
]]>這只是一篇流水帳,文筆依舊糟糕。
感謝社團好友鑫的邀請,不然我又要宅家裡一整天。今天[2015-04-18 土]就跟鑫跑去台中 SOGO 9 樓聽長得很像 Edna Mode 的鋼琴家顏華容老師的演講,主題是下禮拜某場音樂會的導聆(Prokofiev 鋼協三、基捷中衛;Shostakovich 1917)。之前有在勤美誠品聽過一場,只覺得其實不管主題是什麼,她的演講都蠻值得聽。
演講非常有趣,從彼得大帝那時代開始、講到 1905 年社會動盪、1917 革命、史達林、赫魯雪夫到最後蘇聯垮台,闡述這些時空背景如何影響 Prokofiev 和 Shostakovich 的音樂、以及這次曲目和這些因素的關聯。也聽到其他像是關於 1975 蕭邦鋼琴大賽的冠軍頭銜背後令人很悲傷的一些內幕政治八卦。蘇聯真的很黑,枉費國歌這麼好聽。
可惜今天沒帶錄音筆,內容太多了有點跟不上也消化不完。還是我真的不只記性有問題,連理解語句都有障礙啊 orz
演講結束後跟朋友跑去前面聽看看還會講什麼(一直以來聽演講後的跟屁虫壞習慣 w),沒想到顏華容一見到我就說:「欸你曲子寫好了沒?」
『蛤?!老師怎麼還記得?!』「怎麼會不記得?」
好可怕,僅僅只見過一次面問了一點問題而已,幾個月過去了竟然還記得長相以及問過什麼問題,真的好羨慕那種記性(我記性很差還臉盲)…老天果然是不公平的,聰明人果然就是不一樣…
朋友鑫上次的經驗更可怕,之前他只是在 Facebook 上面用私訊問一些練琴的問題,沒想到顏老師竟然洋洋灑灑很認真的回了一大串;後來我跟跑去勤美誠品聽演講,演講完跑到前面問問題。老師一看到鑫,立刻手指著他說「欸,你是那個…..什麼鑫….啊,xx 鑫對不對?」,這是第一次見面、而且 Facebook 的大頭照一點都不清楚、顏華容老師自己又不知帶了幾百個學生,怎麼有辦法記得還認出來@A@
記得第一次聽她的演講時,僅僅只是聽她開口講幾句話,竟然就會覺得她是個絕頂聰明的人,從記性、談吐口條、閱讀量、演講內容都能讓我有這種感覺;目前印象中沒有遇過其他會給我這種強烈感覺的人。這次聽仍然如此。跟她對話的感覺,會浮現一種像是在仰視著某個不知名的外星高智商生物的那種敬畏;但本人又完全不擺架子、很親切近人。說真的,只是她剛好感興趣的是音樂,不然我覺得她不管從事什麼領域都能成為佼佼者。好羨慕,可不可以幹細胞或其他什麼技術複製一個顏華容然後把我的靈魂轉移過去、原本這個就不要了啊…
結束後下午四點四十,馬上被拉回現實(真不希望結束),吃了丸龜制麵的 69 元湯麵後搭車回學校,又吃了國洸自助餐 30 元。
這篇是在[2015-04-19 日 01:51 – 03:01]時寫的。這就是智商的差距啊,這篇不到千字的廢文用打字竟然還要打一個小時,學測考作文寫字都嫌慢。晚上寫這篇,可惡又想吃國洸了。超好吃的。
]]>.ove
可攜性非常差、用 Acrobat Pro 輸出 PDF 也會有很多(可重現的)靈異現象。種種原因,一直想要換一套來寫,不過實在找不到比 Overture 的 UI 更好的替代品。Musescore 2 最近 released 了,UI 比以前進步不少,雖然打譜的操作邏輯個人依舊覺得挺累人又不太好學,不過有電鋼琴或電子琴 MIDI input 輸入的話,打譜效率挺令人滿意。
進入正題,今天試著把 ove 轉成 MusicXML,可以保證檔案未來的可攜性(目前主流軟體都支援),以後要用哪套再說。不過還是會遇到一些問題,在此做個筆記。
雖然 Musescore 號稱實驗性的支援
.ove
,但實際使用卻沒幾個檔案能順利開啟、讓 Musescore 不斷無預警跳出,不靠譜。
還有另一套叫做ove2xml,不過其實它的作者跟現在維護 Musescore ove 模組的就是同個人,兩者轉檔能力應該一樣…,不要跟我們這次需要用的 ove2xmly 搞混了。
ove2xmly
轉檔。這時轉出來的 MusicXML 檔其實 Musescore 一讀取就會瞬間當掉跳出,這應該是 Musescore 的問題(懶得找原因了)。不過沒關係,Finale 可以正常讀取這些檔案(畢竟大廠做的可能容錯也做得比較好)。但又不是音樂系沒有 Finale 怎麼辦?好消息是 Finale 的超陽春免費版 Finale NotePad 也一樣支援 MusicXML 的讀取與匯出。用 Finale NotePad 打開 ove2xmly
吐出的 xml
後,按 Alt-f m e
就可以再次匯出成 Musescore 能夠正確讀取的 MusicXML 3 格式。
版本控制一下這些 xml 吧,做錯方便回復
我這次轉的 50 幾個檔案中有 5 個檔案 Finale NotePad 也無法正確開啟,會說什麼檔案中包含超出 Unicode 範圍的字元。這可能是因為 ove 檔中有一些非 ASCII 字元沒刪除乾淨,原因不明。不管怎樣,反正檔案不多,最快的解決方法就直接用 Emacs(或任何你習慣的文字編輯器)開啟該 MusicXML 檔,把檔案中顯示不正常的字元刪掉,例如用 Emacs 讀取的話,會看起來像這樣:
1 | <creator type="composer">\350\229\337\086\</creator> |
那堆反斜線和數字是有問題的字元,刪掉就對了。沒刪除乾淨的話在存檔時 Emacs 會通知你哪裡還有問題。
我只會 Emacs,其他文字編輯器要怎麼做我也不知道,不過應該大同小異。
好啦,現在譜是你寫的,但 ove2xmly
硬是把你譜面中的版權宣告全改成(!C) 2008-11 Irvine Greene
了,雖然非常感謝這位作者做出這個拯救眾生的 converter,但這種情況還是不允許的!cd
進目錄,sed
一行解決:
1 | for f in *.xml; do sed -i 's/(!C) 2008-11 Irvine Greene/(C) 2012-2015 kuanyui.github.io/g' $f; done |
步驟有點麻煩,不過因為我只有 5, 60 幾個 ove 檔案需要轉,全部弄完不會花太多時間。如果真的有大量轉檔需求,應該可以研究一下 ove2xmly
的 code 是怎麼寫的。
話說之前想學 Lilypond,不過現在已經完全放棄了,那種可讀性跟 brainfuck 有得拼的語法不是凡人能用的。不相信的話去 Mutopia Project 網站上找個 .ly
檔案看一下範例就知道我在說什麼了了。
Crispy Forms
and Bootstrap
to make a form like this:.label
) and detail description (.help_text
) for form field.FormHelper()
and Layout()
With crispy forms
, you can set the layout within a subclassed forms.ModelForm
, without writing anything in template.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55from django import forms
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Submit, Layout, Div, Button, Fieldset
from .models import CustomUser
class CustomUserForm(forms.ModelForm):
class Meta:
model = CustomUser
# specify what fields should be used in this form.
fields = ('email',
'last_name', 'first_name',
'phone_number',
'mobile_number',
'zip_code', 'home_address',
'bank_id_first', 'bank_id_last')
def __init__(self, *args, submit_title="儲存編輯", **kwargs):
super().__init__(*args, **kwargs)
my_field_text= [
# (field_name, Field title label, Detailed field description)
('email', '郵件', '電子郵件將會作為您往後登入時使用'),
('last_name', '姓', ''),
('first_name', '名', ''),
('phone_number', '電話', '郵寄一律採用掛號,所以手機與住家電話請至少要有一支確定能找得到人'),
('mobile_number', '手機', ''),
('zip_code', '郵遞區號', ''),
('home_address', '地址', ''),
('bank_id_first', '銀行代碼', ''),
('bank_id_last', '銀行帳號', '此帳號為對賬與退貨退款時使用,不會用於其它用途'),
]
for x in my_field_text:
self.fields[x[0]].label=x[1]
self.fields[x[0]].help_text=x[2]
# Set layout for fields.
self.helper = FormHelper()
self.helper.layout = Layout(
Div('email', 'password'),
Div(
Div('last_name', css_class="col-sm-2"),
Div('first_name', css_class="col-sm-10"),
css_class = 'row'
),
Div('phone_number', 'mobile_number'),
Div(
Div('zip_code', css_class="col-sm-2"),
Div('home_address', css_class="col-sm-10"),
css_class = 'row'
),
Div(
Div('bank_id_first', css_class="col-sm-2"),
Div('bank_id_last', css_class="col-sm-10"),
css_class = 'row'
),
)
self.helper.add_input(Submit('submit', submit_title))
提醒:真的很流水帳,純粹心情記事而已。
近來心情一直在很不優的狀態下。寫點日記好了,不知為何我很喜歡流水帳。
爸常說,永遠別在網路上抱怨或訴苦。近來常常想起這句,感覺確有一些道理…。
早上搭十點的車回家。晚上開始寫個一直想要但好像沒人寫過的 Emacs Dired 的小外掛fm-bookmark.el。八點半左右時很睏,睡到十一點起床。繼續寫。
寫到早上繼續寫,下午三點多太睏才睡了一覺起來吃晚餐。晚上十點才完成。總覺得做這種小東西還是花了太多時間。
最近因為需要寫 web,買了「Effective JavaScript」來讀(這本真的很值得推薦 - 如果你已經有 OO 和 FP 基礎概念,想學 JS 的話看這本很快就能上手)想說既然都學了,那就把一個一直很想要但也是沒人做的 Firefox 外掛 Copy as Org-mode 研究一下看能不能做出來吧。
目前寫了短短一陣子的 JS,我發現並不討厭寫 JS 耶(要被 vinta 揍惹),反而一邊寫一邊驚嘆這種語言竟然能在十天內設計並實做出來…,不過我想這很大一部份原因要感謝 Emacs 的 js2-mode 的語法檢查、提示和警告做得相當聰明,因此至少從來沒讓我去煩惱那大小括號分號甚至 redeclaration。比較讓我受不了的是標準物件內建的方法實在少的有點可憐。如果以後真的要寫 JS,我想還是會學一下 livescript。不過目前主要只是要寫前端的 AJAX 而已,JQuery 很夠用。
下午三點多左右,全家去龍洞攀岩場晃晃,晚上去蘇義興吃飯,真的很好吃。
早上九點半,清明節去阿嬤家拜拜吃午飯其實蠻開心的,但我妹不喜歡直嚷嚷要回家。下午一點半回家。
在家裡,一邊聽 2012 年出的那部悲慘世界電影版一邊寫 JS 一邊一把鼻涕一把眼淚哭得一塌糊塗(這畫面好像有點蠢)。怎麼那麼好看啦 ・゚・。・゚・(つД`)超喜歡尚萬強這個角色的…每次聽主教那段、芳婷那段、尚萬強最後告白和去世的那段 “She is the best of my life” 都讓我狂噴淚到快虛脫啊 (´;д;`)
寫到 3:30 躺平。家人還是最溫暖的。
5:40 起床吃了一片土司,6:50 搭上客運繼續睡到 09:50 左右到台中,到宿舍後沒吃午餐,寫到晚上 18:00 左右終於寫完了,丟到 AMO 後才跟鑫去吃飯。35 元解決。一看 git log,發現今天的有效 code 行數其實很短…不管什麼領域,我做事情都始終如一的慢。
有在想不知以後有沒有辦法走資訊業,學越多越覺得自己不足啊。我很早就知道我不是聰明人了,唯一有自信能勝過別人的只有好奇心和自學能力。但我發現是這樣…目前我的興趣裡,好像只有電腦這領域有辦法讓我廢寢忘食一直學一直做。至於音樂的話我很早就看清了,毫無天份只能當消遣而已。畫圖也沒辦法像我爸媽和妹妹那樣很有動力和熱情的一直畫一直畫一直進步還能當工作。先別提其他的,光就這一點從客觀角度來看,我是家裡最不搭調的成員。
晚上在系館聽到同學們的畢業專討時間又被陰了,嗯,很符合我對這個系的印象=w=”。
今天一整天基本上一樣是在一片低氣壓下度過的。早上的課很囧,一半以上腦子最清楚的時間都在看內容與之前幾堂近似、學不到什麼新東西的紀錄片,課程後半則是都在發呆沒什麼心情聽課。下午的課三個小時,最後三十多分鐘在打瞌睡,實在太無聊了。這學期除了兩門課我是真的感興趣外,其餘都是為了湊滿畢業學分而修課而已。聽過從 CMU 交換回來的朋友描述美國的大學課程,比起來台灣高等教育的課程安排和五花八門的修課與畢業門檻限制還是把大學生當高中生在教。
中午和晚上繼續寫 Django,寫網站真的有很多細節和流程要考慮,不過再怎樣也比做模型有營養多了就是。
]]>transaction
in Django.update
Within One StepIf we need to update only one field of a model (That is, no other field or model need to be updated simultaneously to ensure the consistency of ACID), we can use F()
, select_for_update()
and filter()
to update field without race condition..
Following example:
n
quantity before selling.n
products.1 | from django.db.models import F |
select_for_update()
returns a queryset that will lock rows until the end of the transaction (generating SELECT ... FOR UPDATE
)FIELDNAME__gte = number
means greater than or equal to number
.filter()
always return an objects set.
When no object satisfied the query’s condition (quantity >= n
), returns an empty set.
An empty set won’t trigger the update()
manipulation.
get()
always return one object. Raise error when get more than one.filter()
always return an objects set.(obj, obj, obj, ...)
F()
object represents the value of a model field. It makes it possible to refer to model field values and perform database operations using them without actually having to pull them out of the database into Python memory.
But we still need transaction with multiple steps. So use django.db.transaction.atomic()
to ensure ACID’s atomic.
A transaction usually need to update multiple fields across models, so we implement the mechanism in
views.py
instead ofmodels.py
.
Now the following example implement the mechanism of add_to_cart()
:
n
amount products via a form.n
:n
products;n
items into my Cart
model.n
) && (quantity > 0):Cart
model.1 | from django.db import transaction |
class="active"
into HTML tag according to the URL of current page:Because we need to access request context in template, so add the following settings if you haven’t.
1 | TEMPLATE_CONTEXT_PROCESSORS = ( |
Create templatetags
directory with common_tags.py
under APP_NAME
:
I only use simple string matching (
if stringA in stringB: ...
). Feel free to modify if you want to use RegExp.
1 | # APP_NAME/templatetags/common_tags.py |
First, add:
1 | {% load common_tags %} |
at the top of your template file.
Read the code and you will know what they mean and the differences among the three tags:
1 | <a href="{{ child.get_absolute_url }}" class="{% is_active request child.get_absolute_url %}"> |
reverse()
1 | <li class="{% is_active_reverse request 'show_current_user_profile' %}"> |
But in many condition, reverse()
is very hard/inconvenient to use if the URL pattern needs pk
or other kwargs. So we use another more universal way, resolve()
:
resolve()
1 | <a class="{% is_active_resolve request 'all_products' 'products_under_category' %}" |
resolve()
needs only URL name, without pk
or so.
]]>Notice the three tags can accept multiple arguments (
all_products
,products_under_category
).
以睡覺為每日的分界線。
org-ioslide
。org-ioslide
加上 MathJax
支援、修改樣式(折騰 compass)4:50 左右睡覺。org-ioslide
org-ioslide
,org-ioslide
<q>...</q>
和 speak notes。8:02 寫完。吃早餐。1 | <button> and <a> pretend each other via CSS |
<form>
寫法好噁心啊…<form>
的 <button>
要用 type="button"
不能用 type="submit"
,不然按下去會丟兩次 request 出去然後 server 狂吐 error…(為了這點搞好久…)DELETE
寫後,好像就沒有用 <form>
+ <button>
這種噁心寫法的意義了…DELETE
<a>
+ JS 實現 DELETE
好了…DELETE
空白的一天…懶得寫日記拖了幾天就忘了 orz
1 | class CurrentCustomUserForm(forms.ModelForm): |
org-ioslide
的互動插入功能寫一寫然後 push 回 upstream。1 | while True: |
M-x calendar
還要按p C
…就弄了一下Emacs 內建的 calendar 台灣在地化(其實只是 fork 強國的 calendar 外掛再改一下名子)初三。待在家。
幾乎整天都在做衣服。
coc whiterun
也是一樣。洗澡前幫米漿又清了一下耳朵,超會掙扎,且依舊都是血水 (´;д;`)
百無聊賴發神經,看一下 Haskell(一陣子沒寫又快忘得差不多了),然後開始寫 LeetCode。
push
要用 append
這種事都忘記必須 Google 你看看,果然還是比較熟 Emacs Lisp…雖說熟也沒熟到哪,尤其內部一堆機制依舊完全搞不懂)爸妹出門採買,待在家午餐弄 干貝 + 杏鮑菇 + 甜椒 + 洋蔥 義大利麵,這次的比上次更好吃(一樣份量的料只做兩人份,會比較好吃好像是廢話)。
以下以 Django 1.7 為環境。
一般來說要擴充 Django 內建的 user model 欄位,可以自行建立隨便一個想要的 model,然後 foreign key 接到 user 上,不知怎的這種方法感覺有點噁心,而且當你不想用 username 當作使用者登入的 id、想改用其他欄位時(例如 email)好像就沒辦法了,所以還是自己自訂好。
以下建立一個使用 email
和 password
登入的 user model 範例。
首先 python manage.py startapp users
1 | from django.db import models |
1 | from django.contrib import admin |
1 | from django.contrib.auth.forms import UserCreationForm, UserChangeForm |
也許我們還會需要讓使用者能夠自行修改自己的帳號資料內容(而不是以管理員的權限來修改,所以一些 fields 不應該顯示出來),所以再在 forms.py
加上下列:
注意,有使用
crispy_forms
套件,沒用過的話詳情請自行 Google。
1 | # ====================================================== |
這個很重要不要忘記加了:把原本的 User
替換成我們剛剛定義的 CustomUser
:
AUTH_USER_MODEL = 'users.CustomUser'
INSTALLED_APPS
也記得加上 'users'
。最後再更新 db:
1 | python manage.py makemigrations users |
如果改到
python manage.py createsuperuser
然後 runserver
看看 admin。
stats
can help you to do some statistical works easily. For example, correlation coefficient:Take a look of chapter “Stats” in gnuplot manual first.
stats
1 | stats data using 5:4 name "A" |
data
should be replaced with your data file or data variable.
Now, all statistics data have been generated automatically and ready to be used.
“A” is to be set as prefix.
For example, variable A_correlation
is the correlation coefficient value between col 5 & 4.
Update: Sorry, it’s correlation coefficient, not R2.
Add a label to show correlation coefficient on the plot:
1 | set label 1 sprintf("r = %4.2f",A_correlation) at graph 0.1, graph 0.85 |
Variable | Meaning |
---|---|
STATS_correlation | correlation coefficient between x and y values |
STATS_slope | A corresponding to a linear fit y = Ax + B |
STATS_intercept | B corresponding to a linear fit y = Ax + B |
So we can define a linear equation y = mx + c
to draw it:1
2line_fit(x)=A_slope*(x)+A_intercept
plot line_fit(x) title 'Linear Fit'
Following are some notes for installing Frescobaldi
under openSUSE.
Since 13.2, it seems that
Frescobaldi
has been included in openSUSE official repository, so you should don’t need to add OBS repositories nor upgrade PyQt4 & SIP.
One-click Install on OBS:
Now you may see an error when starting Frescobaldi:
RuntimeError: the sip module implements API v10.0 to v10.1 but the popplerqt4 module requires API v11.1
The PyQt4 and Python-SIP (Python 2 ) in openSUSE 13.1 are too old to satisfy the dependancies of Frescobaldi so you have to upgrade both of them:
On my system: Original Upgrade topython-qt4 4.10.3-3.4.1 -> 4.11.2-136.4python-sip 4.15.1-3.1.2 -> 4.16.3-131.1
You may see a lot of warnings from the packages that depend on PyQt4, just force them to upgrade PyQt & SIP.
Frescobaldi’s MIDI player may not work. Now install portmidi & timidity.
zypper install portmidi timidity
Start Timidity daemon in ALSA server mode:
timidity -iA &
Then start Frescobaldi, choose Edit -> Preference -> MIDI settings -> Player output
and select Timidity
port. Now try to play your sheet within Frescobaldi. ˊ・ω・ˋ
Add following setting in /etc/timidity.cfg
.
opt EFresamp=lopt EFreverb=g,65opt EFchorus=sopt s48kHzopt p64aopt anti-aliased=aopt Os#opt EFreverb=25#opt EFchorus=0# latency config. set to B2,8 if your cpu can't do B2,5# opt B2,5# By default, try to use the instrument patches from freepats:#source /etc/timidity/freepats.cfg# alternatively, you can use the fluid-soundfont:#source /etc/timidity/fluidr3_gm.cfg#source /etc/timidity/fluidr3_gs.cfg
]]>Pentadactyl is a Firefox plugin ,which can let you:
Pentadactyl has great flexibility, so you can re-binding keys into Emacs-flavored.
~/.pentadactyl/plugins/emacs.penta
.If Pentadactyl act abnormally after upgrading FireFox, try to upgrade your Pentadactyl first, most of problems can be solved immediately. If still unsolved, install nightly builds.
C-x C-f
- Open… (URL & search)Remember to specify keywords for each search engines (Right click on
Search bar -> customize -> keywords
)
For example,g => Google
,b => Bing
,d => DuckDuckGo
.
Then you can searchSOMETHING
with Google like this:g SOMETHING
C-g
- Cancel current action.M-x
- Enter Pentadactyl commands.C-z
- Temporarily escape back to default Firefox shortcuts map.
C-x C-s
- Save current page as…
C-x C-c
- Exit Firefoxf
- Find and open link.F
- Find and open link with new tab.Press
Tab
to switch highlighted item.
PressEnter
to select the highlighted item.
C-b
- BackC-f
- Forward
C-v
- Scroll down 1/2 page.
M-v
- Scroll up 1/2 page.M-<
- Top.M->
- Bottom.
C-s
- Find string in current page.
However, due to the limitation of Pentadactyl, you have to use
n
andN
to “find next/previously” after invokingC-s
.
]]
- Auto find “next” link on page and open it. (pattern is customizable)[[
- Auto find “previous” link on page and open it. (pattern is customizable)C-x C-<left>/<right>
- Switch tabs. (Though I still use C-Tab
& C-Shicf-Tab
)C-x k
- Close tab.C-x C-b
- Buffer manager.R
- Reload (refresh) current page.M-w
- Copy the URL of current page.a
- Add current tab into Favorites.C-x i
- Jump to and focus on the first input area in page directly.C-i
- (Under INSERT
mode) Edit current input area within Emacs client.i
- Enter CARET
mode, which let you move cursor around. Then press v
(VISUAL
mode) to toggle selection.Press
;
to enter a mode. For example, press;i
can open a image.
i
- Open image.I
- Open image with a new tab.rehash
- Reload all your Pentadactyl configuration file.Qt 中的 MVC 概念、各種 list model/view/controller 等,如果要搞清楚請一定要讀: Model/View Programming | Documentation | Qt Project
注意!這個部份我自己也看得一個頭五個大,以下有可能有記錯搞錯寫錯的地方,正確資訊還是以官方的 MVC 文件為主。如果您發現了錯誤敬請指正,謝謝。
來看看 Qt 到底有多少 List/Model/View 相關的玩意:
啊啊列不完啦。
因為實在太多了,其中差別我根本也記不住,但還是可以猜想做什麼事情時,該用什麼:
QAbstract*Model
吧,我不會告訴你怎麼寫的~QListWidget
、QTreeWidget
, QTableWidget
QListWidget
。QTreeWidget
。QTableWidget
。
QListWidget
、QTreeWidget
,QTableWidget
都是是把 Model, View, Controller 合在一個 widget 裡面,不需要自己搭配各種 Model + View(例如QStandardItem
+QStandardItemModel
+QListView
),用起來比較方便。
role
與 multiple-columns 是不同的概念,不要搞混。
假設一個 single column list 有一堆 items,每個 item 自己也還會有一些屬性欄位能夠放不同資料,這種屬性欄位在 Qt 裡面叫做 role
。
一個 multiple columns list 有 rows x columns 個 items,每個 item 也都一樣有各自的 role
。
以 QAbstractListModel().roleName()
為例,其各個 item 預設都有如下的 roles(當然這些項目都還可以自由增減):
display
,decoration
,edit
,toolTip
,statusTip
,whatsThis
其中像是 display
就是顯示在 list 中的樣子(最常見就是字串),decoration
是圖示(如檔案管理員常見的各檔案類型的 icon), toolTip
就是滑鼠移上去會顯示的東西等等。
role 的詳細使用方式請自行翻文件。
製作一個 single column 的 list
1 | self.list = QListWidget(self) |
製作一個 multiple column 的 list(此處不需要用到 tree 結構),由於我們要用到多重 multiple colummn,必須使用 QTreeWidgetItem
來為每一個 item 建立其對應的各種 columns 內的資料。(這種概念很難記吧?)
1 | itemList = [] |
item.setData(0, 0, fileName)
第 1 個參數就是指 column 編號,第 2 個參數則是 role 的編號。
[2018-04-03 火 10:03] 修正一些錯誤觀念
[2014-09-22 月 22:33] 更新:新增 parent 說明
學了一個暑假的 PyQt,決定還是應該把詳細的撞牆筆記寫出來,如果您想學 PyQt,希望這篇對您會有點幫助。以下概念如有謬誤敬請指正:)
- 那入門學 PyQt 要不要順便一起學 QML 呢?我個人的建議是:不要。
- [2018-04-03 火 10:06] 補充:QML 是我見過最糟糕的程式語言之一,滿滿的雷,是個實做殘缺不全又飽含許多讓你開發到抓狂的異常行為的 ECMAScript/JavaScript,我現在連寫 Qt/C++ 都已經放棄 QML 了、繼續寫 QWidget 去。
由於我之前沒有 OOP 基礎,所以一開始的門檻還是有點高,也因此這部份我會講得比較清楚又囉唆一點,讓沒有 OOP 基礎的人也能夠輕易看懂。不過學 PyQt 其實不需要先學會 Python,就跟(聽說)學 Rails 並不須要先學會 Ruby 一樣。因為PyQt 會用到的 Python 特性非常偏頗,而且細節頗多,與其說在寫 Python 還不如說就是在寫 PyQt。最難的就是搞懂並記住這些特性與細節(且有些細節在一般 Python 程式裡應該也很少用),基本上先把幾個基本概念和常用 pattern 記住就對了。- class 裡定義的 function 叫做 method,class 裡定義的 variable 就是 attribute。
- instance 中文翻成「實體」,一個 class 經常要先建立 class 的 instance 才能開始使用,因為要建立 instance 才會載入 class 的
__init__
部份。
一開始請先讀 amulet 大神寫的這串 PyQt 入門教學,寫得非常好:
- OGC Gains Comfort: [PyQt 教學] Part 1: Introduction
- OGC Gains Comfort: [PyQt 教學] Part 2: 建構開發環境
- OGC Gains Comfort: [PyQt 教學] Part 3: 起步走
- OGC Gains Comfort: [PyQt 教學] Part 4: Layout Management
- OGC Gains Comfort: [PyQt 教學] Part 5: Signals & Slots mechanism
- OGC Gains Comfort: [PyQt 教學] Part 6: 物件導向的寫法
- OGC Gains Comfort: [PyQt 教學] Part 7: 聚砂成塔
接下來我不會從頭講,因為上述的教學講得已經很好了,然而我想把我在學的時候遇到的一些不懂也不知該怎麼問的概念部份重新講一次,所以現在這篇應該算是上述文章的補充講義。所以如果您讀了上面的那些教學有什麼沒看懂的部份,就請回來看我寫的這些更詳細的筆記,搭配看應該是非常好理解的(尤其 class 的部份)。
這裡需要的基礎知識主要是著重在 Python 的 class 部份,不過您只需要有最基礎的 Python class 概念就可以看這幾篇文章和本篇學 PyQt 了。
除此之外也可以參考 Python 的變數命名方式,寫起 PyQt 起來能省下不少讀 code 的功夫。
module 有兩種最常見的 import 方式,第一種是:
1 | from PyQt4.QtCore import * |
因為 *
會將 module 內的 namespace 拿來直接蓋過目前環境的 namespace。所以使用這種方法的話,要呼叫 module 內的東西只需要寫成這樣: app = QApplication(sys.argv)
另二種是:
1 | from PyQt4 import QtCore, QtGui |
這種方法的話,要寫成這樣: app = QtGui.QApplication(sys.argv)
第一種方法可以少打幾個字,雖然一般來說會有 namespace 污染的問題,但由於 Qt 的命名方式不管什麼都是 Q 開頭,幾乎不可能跟你寫的東西撞名,所以其實沒啥問題。
第二種方法優點是是不會污染到目前環境的 namespace(不過 PyQt 的 class 都是以 Q 開頭,也幾乎不太可能會污染到你原有的 class 名稱),缺點是要多打幾個字。
我自己是用第二種方式,原因是 Jedi
這套 Python auto-complete 外掛似乎要用第二種才能運作。以下範例皆採用第二種方式。
Qt 中:
一切的物件都是從QtCore.QObject
繼承而來(如QShortcut
);
一切的 GUI 物件都是從QtGui.QWidget
繼承而來(如QLabel
)。
別把 Object 跟 Widget 看錯了!
1 | class MyWidget(QtGui.QWidget): |
第一行的語法 class CLASS_NAME(INHERT)
, INHERT
參數是代表「現在所定義的這個 class 該繼承 INHERT 這個 class」,簡單來說就是 INHERT
這整個 class 的所有內容拷會貝一份,複製到你現在定義的這個 class 內。
這裡是先方便你理解才說用「拷貝一份」,其實 OOP 繼承時完全不會複製 class 的內容,真的那樣複製的話太浪費資源也太沒效率。
不過初學時你還是可以先這樣想,其餘的以後再說。
MyWidget
,並繼承了 QtGui.QWidget
這個 class。MyWidget
就是 QWidget
的 child class(子類別,或者語意更精確的「衍生類別」 “derived class“),QWidget
是MyWidget
的 parent class(父類別 ,或者更精確的「基礎類別」 “base class“)。我們上面繼承了QtGui.QWidget
,所以現在我們可以來自訂這個 QWidget
、改成我們想要的元件了。
第二行def __init__(self, parent = None):
就是在「重新定義」 QtGui.QWidget
的 __init__
:
__init__
這個 method 是 建立 class 的instance實體後,會自動呼叫的 method。 。__init__
就是在建構 Qt 的元件本身。但我們現在要自訂它,例如更改 QWidget 的背景色、尺寸等等。除了背景色、尺寸外,還有這個
QWidget
要放什麼類型的 layout,layout 裡面要放哪些 QWidget,以及預設要呼叫哪些 method、預設有哪些 attribute 等,都是在__init__
這裡自訂。因為他就是一建立 該 class 的 instance 時,會初始化載入的部份。
self
是很怪很怪的東西,他指的就是這個 class 的 instance 本身…總之 Python 裡面在 class 中 定義 method 時,第一個參數一定要加上 self
,再來後面接的才是我們(在其他語言中)一般認知上的 function/method 參數,先狠狠地記住這點就對了。
其實也不全然是這樣,還有
@static_method
和@class_method
這兩種東西的寫法就通常不會寫self
或者根本不用刻意加第一個參數,不過這你大可以先無視,以後熟悉 OOP 後再去查這兩種東西的用法。
parent = None
代表 __init__
中, parent
這個 argument參數 的預設值是 None
。也就是說,我們之後在呼叫 MyWidget()
這個 class 時,如果沒有指定 parent
,那 parent
這個 argument 就會預設被賦予 None
這個值。parent
的值在 PyQt 裡有一個重要角色,就是決定目前 QWidget
是否是另一個 QWidget
的 child object,如果 parent
是 None
,就代表他沒有 parent,是一個獨立的物件。
稍後會提到 parent 在 PyQt 裡的用法。
注意,這裡的
parent
為 Qt 術語中的 parent,不是 OOP 那個 parent class 的 parent。
super(MyWidget, self).__init__(parent)
是平常 Python 可能很少用(好啦除非你整天用到繼承),但 PyQt 裡一直狂用的重要東西。要解釋得分成多部份:
MyWidget
繼承 QtGui.QWidget
後,MyWidget
的整個 class、 包含 __init__
都跟 QtGui.QWidget
一模一樣。MyWidget
,而使用到了 def __init__()
,一旦定義 def
了一個「已經存在的 method」,那 MyWidget
所繼承而來的該 method 將會會直接被忽略並覆蓋過去。def __init__()
會導致 MyWidget
的 __init__
(從 QtGui.QWidget
繼承而來的 __init__
) 被整個清空,這樣一來該 Qt 元件就沒辦法成功被初始化(因為載入 Qt 元件的部份都是被定義在 __init__
中)。MyWidget
中的 __init__
,又能夠保有原本從 QtGui.QWidget
繼承而來的 __init__
,所以在我們 def __init__()
之後,就立刻重新載入一次原本 QtGui.QWidget
內的 __init__
。要做到這件事,有兩種方法:QtGui.QWidget().__init__()
。super()
來作跟樓上一樣的事情,有兩種寫法:super(MyWidget, self).__init__()
: super(MyWidget, self)
指的就是「MyWidget
這個 class 所繼承的 class」,在我們的例子中指的正是 QtGui.QWidget
。QtGui.QWidget
的 __init__()
」super().__init__()
。我自己後來也都這樣寫,傳統 Python2 的寫法根本是喪心病狂般難記難寫。QDialog
)記得加上 parent = None
。因為以後要呼叫這個自訂的 MyWidget
時,就可以指定 parent
,這樣 parent
一旦關閉,MyWidget
也會自動關閉。例如:1 | child_window = QtGui.QMainWindow(main_window) # main_window 關閉時,child_window 也會被自動關閉。 |
還有一點概念非常重要,沒有
parent
(且也沒有被放在 window 或者 layout 中) 的任何QWidget
就會變成一個獨立的視窗。
要建立視窗時要注意一點,如果要在 class 的 method 裡面建立獨立視窗的 instance,記得加上self
,例如self.label = QLabel()
,不可直接label = QLabel()
,不然該會視窗跑不出來。
self
的概念很重要,什麼時候該用?看他需不需要被跨 method 存取。如果只是上面的 __init__
中建立了一個 layout,裡面塞一些 QWidget
,這種 layout 因為用完就可以丟了,所以就不需要self
,只要寫layout = QtGui.QVBoxLayout()
,不用寫成 self.layout = QtGui.QVBoxLayout()
。
然而,假設有一個 QLabel
,在 __init__
裡面定義過後,你想要再透過其他 method 來存取他(例如定義一個 method updateLabelText(self, string)
,藉由這個 method 來修改該 QLabel
),這種時候就要加上 self
,讓他能夠被「跨 method 存取」:
1 | class MyWidget(QtGui.QWidget): |
使用 self
前綴的東西,該 class 內的所有 methods 都能夠存取它。
parent
(不是 OOP 那個 parent class!很重要!)是 PyQt 裡很常用的概念,他可以讓各個 QWidget 之間有 parent & child 的從屬關係。使用時機有:
QWidget
A(可以是標準 QWidget
或任何從 QWidget
所 subclass 出來的物件,當然也可以是自己自訂過的 QWidget
)後,想要把它作為放進 QWidget
B(也就是 A 是 child,B 是 parent),並讓 B 的 instance 也能存取 A 的 instance。怎麼用?自己在自訂 QWidget
時記得在__init__
的參數加上parent=None
,以及super()
時也記得要加上 parent,像是這樣:super().__init__(parent)
1 | class MyWidget(QtGui.QWidget): |
往後要建立 MyWidget
的 instance 時,記得以self
作為 MyWidget
的參數:
1 | self.my_widget = MyWidget(self) |
現在,這個 self
就是 self.my_widget
的 parent 囉。
至於我要怎麼在 MyWidget
的定義中存取 parent 呢?很簡單,self.parentWidget()
就是 parent 了!
我總算會寫 lisp macro 了 Q_Q
然後呢?嗯…沒有然後了。
好啦,就是後來在寫 fsc.el 時確實省掉了一些不必要的重複部份,比之前用的方法好寫也好維護得多。
在 freenode 上的 #lisp
認識一位自學中文、文筆卻異常流利的阿根廷人,推薦說可以學學 Haskell 的純函數式,所以昨天(9/12)手上的東西暫時都告一段落了就開始摸摸看。相信像我這種遞迴寫到腦袋快爆掉的廢物一定可以學到起笑的。
總算參加到了 COSCUP 2014 啦 www
這次用貢獻者專案拿到票,體驗到了特權到底是怎樣的好滋味,不用神經兮兮地搶票。然後 emacs.tw 社群有報了一個「編輯器 BoF」,為了有點話題可以扯所以就做了 fsc.el 這個給 Emacser 玩的小玩具:
畫到四點多受不了,睡一個小時就去搭車,聽議程竟然還沒睡著。然而最後 BoF 其實也沒時間講到這個 orz
Worship 時間見到 rail02000 和 floatj 大大,還有 BoF 時 #emacs.tw 很少出現的大神 kanru,以及 superbil 等等大大(worship)。然後當然還有…議程中終於親眼見到宅色夫 jserv 和唐鳳大神了啊啊啊(尖叫)。
2014/9/10 19:00 ~ 20:40 參加了第一次的 Emacs.tw 台灣聚會。自我介紹…有蠻多人都是 Vim 用了數年後跳來 Emacs 的。再來就是講講 emacs-tw 現在在做的事和計畫要作的事順便推坑請大家進來一起做(有興趣的人請上 #emacs.tw @ freenode)。
至於網路代號跟長相我一如往常地當然是記不住:
最左邊的是 g0v 的 Superbil、中間後方黑衣服是在 Mozilla Taiwan 工作的 kanru、右方黑衣是寫新酷音輸入法的 czchen(不過他好像沒有在用 Emacs),右邊白衣沒記錯的話應該是 gko,其他的就不記得了=w=” 基本上這次來的人幾乎都是 #emacs.tw IRC 上面的常駐土地公。然後雖然不太重要,但此次聚會的(生理)性別比是 arithmetic error DIVISION-BY-ZERO signalled
。到底是為什麼呢~
趁假期趕緊學 PyQt,真的超實用的,可以快速做出一些自己需要但沒有人做過的小東西。
由於之前沒有 OOP 基礎,所以一開始的門檻還是有點高,(我實在很不想把教科書從頭念到尾才開始寫東西,那是種很有效率地消磨意志力的學習方式。)。學 PyQt 其實不需要先學會 Python,因為他會用到的 Python 特性非常偏頗,要先把幾個 pattern 記住,不然根本什麼都寫不出來。如果你只學過非物件導向程式語言,那我覺得入門 PyQt 最難也最重要的地方應該是得快點弄懂 class inherit, instance, parent, super()
, self
的概念,但弄懂後 Python 的部份就很簡單了,剩下 Qt 本身。
有興趣的話,PyQt 相關筆記請看另外一篇。
混帳 QML 讓我一開始浪費了「很多」時間,超過一個月(Qt 官網的 PySide 教學全是 QML,但我…不推薦入門就讀那個,很痛苦。當然如果你本來就已經很熟 Qt 那另當別論。)。我的建議是學 PyQt 先不要碰 QML 比較好,目前教學還太少了,會學到很想哭,或者看到一堆沒有屁用的 QML 教學會看到很想罵髒話(例如教你怎麼用純 QML 寫出一個華麗的 list…我要知道的是怎麼用 QML 存取程式中的 data 啊,連 data 都寫在 QML 裡的教學有個屁用啊 (╯°□°)╯︵ ┻━┻ ),而且目前就我所知要在 QML 裡面用 list model 沒辦法用 QStandardItemModel
之類用起來比較容易的 model(就我所知是這樣,有錯敬請指教), 只能用 QAbstractListModel
,一堆必要的 method 都得自己手動刻;生命是很美好的,不要想不開啊!!!
PyQt + QML + QAbstractListModel 最後學起來除了學習曲線變得有點不必要的陡峭外,給我的感覺只剩下寫起來煩死人,教學少,出了問題後斷斷續續找了一個多月找不到解法,最後問 IRC 竟然還是沒人解答的東西。
然後為了要讓 QML 能夠與 Python 程式碼互相溝通,反而得花上更多心力,像是為了讓 QML 存取 Python 程式中的資料得加上一堆 @pyqtProperty
,整個 code 看起來亂七八糟,我有點懷疑這樣真的有讓程式比較好懂好維護嗎(至少比較難寫是絕對的…)orz 大概只有美工在改 UI 時會覺得比較輕鬆而已吧。
也許程式的規模變大後用 QML 真的會比較好維護吧,但一開始我是覺得真的不要碰這比較好。短期內我是絕對不會再碰這鬼東西,至少要直到教學數量變多一點後。
學 PyQt 最難的地方應該是弄懂 MVC,還有 Signal/Slot 和 Property,不過前者很多時候都能用 list widget 之類的東西解決,不用自己硬幹 QAbstractListModel
(除非你用 QML) 。signal 和 slot 的話,其實沒有想像中的常需要自己寫 slot/signal (除非你用 QML) ,不過有時還是會需要自己寫所以還是得弄懂。至於 property,PyQt 已經把很多東西都包裝得很好,幾乎不需要用到 (除非你用 QML) ,想要讓 Qt 讀取 string 就直接餵食 Python 的 string 就好了,不用考慮其他有的沒的。
總之最後,寫了這幾個小東西:
Stardict Flashcard 是我一直很想要的東西,因為我這麼懶的人休想叫我背單字前還得自己做單字卡,但其他 flashcard 軟體(例如知名的 Anki
)都一定得自己做。我只希望餵給程式一個純文字檔案,每一行就是一個單字,然後自己去抓 Stardict 字典檔中的單字解釋。剛好 Stardict 內建就有個功能,只要按 Alt+e
就會將單字加入一個文字檔中,這下要作單字卡就太容易了。
這是我一直很想要的圖片瀏覽器,因為 Linux/Un*x 上沒有一款符合我的需要。原本好友 lzh 用 PyGTK 寫了一部份功能,然而因為課業因素沒辦法繼續寫下去。不過學了 PyQt 之後終於有機會把它做出來了 QAQ。要求是:
1. 可以輕鬆地用全鍵盤操作(仍可用滑鼠)。是 Emacs/Vim flavored 的話就更好了。2. 不能吃太多資源。也不能動不動就像 Gwenview 那樣 memory leak 把記憶體塞爆。3. 能夠按照檔名/時間排序。4. 能夠設定成切換圖片後不改變縮放比例(神奇的是,Linux 上我找不到一款 viewer 有這種設計。Comix 不算=w=")。5. 盡可能利用螢幕空間。6. 方便呼叫外部命令。7. 單鍵重新命名檔案。8. 盡可能利用螢幕空間。
除了第二點因為用 PyQt 寫所以不怎麼輕量、初次啟動也頗慢外,至少其他點是做到了…
最後,有人猜得出為什麼 icon 長那樣嗎?=w=+ lzh 你不可以講 XD
Posemaniacs Timer 是 Posemaniacs 專用的計時器,不然我一直畫出一堆沒有頭的身體。
前陣子妹子做的 BJD參加某聯展,沒想到:
「台灣人,民智未開,已知用火。」
- 印度歷史學家 Vankrishman Khodrasekhar (1928 - 2011)
「我們總是自欺欺人,認為自己的國家是政教分離的。不過一旦遇到真正重要的議題--例如協助自殺、死刑、同性結婚、毒品--大多數人的反應就彷彿啟蒙時代從未發生過一樣。基本上,我們仍然像是淘氣的小孩,因為摘取禁果而必須受到父權禁令的懲罰。」
-- 泰拉斯・格雷斯哥《老饕犯賤走天涯》 p.365
道德應該是拿來約束自己的,你要怎麼虐待自己別人不會有意見,但不該拿來硬套在別人身上。
「當有人爭新聞自由的時候,我保持沉默。
當有人被非法逮捕的時候,我保持沉默。
當有人反服貿協議的時候,我保持沉默。
當有人反都更強拆的時候,我保持沉默。
當有人臥軌爭權益的時候,我保持沉默。
當其他人要結婚的時候,上帝呀!這怎麼行?上街抗議去!」
我認為在台灣長大、小於二十五歲卻反對同性婚姻的人,是腦殘。因為就算家庭灌輸你傳統的兩性教育,但你明明就應該還在能夠改變想法的年紀,近來這議題已經這麼多人在奔走呼籲說服,那就是自己沒聽見不願接受而已。我找不出反對同性婚姻的理由。同志也不能領養小孩,認為他們家庭教育會有問題、倫常關係被破壞、不夠格領養。忘記誰說的了: 「有沒有想過需要被領養的小孩到底是同性戀還是異性戀搞出來的?」 蓋核電不用公投,別人要結婚你這混蛋總統卻說要公投…奇怪他到底有什麼理由反對同性婚姻和多元成家啊?明明他自己老爸的家庭就超「多元」。
「很多人二十五歲就死了,只是到了七十歲才埋葬。」
我想這裡定義的「活著」,有一部份是他還有沒有辦法讓自己接受不同的新知,尤其是價值觀。不過前陣子看到這篇奇文後,我又再次對台灣人主流的兩性價值觀感到失望了 。「『女人最終的勝利永遠是小孩』,小孩能成為堂堂正正的人,甚至有成就,對女人來說是絕對的勝利;就算老公不好或外遇,只要孩子好,心向著媽咪,女人就是勝利者。」 我不知道還能對這句下什麼評語,這實在是太噁心了,難怪我會被說娘,因為這篇文章及其推文者的兩性觀都超乎我想像的變態啊,相對而言在他們眼中我當然也是變態了。只是目前的社會強加的道德賦予它正當性。如果這篇奇文真的是台灣男性普遍價值觀,那我還是繼續被說娘好了,那種兩性價值觀我才不要。說真的連這麼變態的想法都能接受的台灣人,怎麼反而無法接受同性婚姻、多元家庭、變性人?
從另一個角度看,我也是那個無法接受別人價值觀的死人。
我個人對最近越來越紅的 “xxx Girls” 其實頗為反感…從 Ruby Girls 到後來的 R Girls, Django Girls。趁機講一下我的感想。
我個人是不太能理解已經在搞 FLOSS 運動了,照理心胸應該都是相對開闊的,卻怎麼還有這麼強的性別意識。我想他們看到我這種感想應該會很反感,不過相對的我也要說,「限定女性參加」這幾個字眼在我看來也很刺眼(即使我並沒有被該條件排除在外),因為我覺得這是把人依照先天條件硬劃分成兩半。
我好像一直不太能成功地對於不同性別成功建立起什麼刻板印象,所以不是很能體會到底是什麼鬼東西會讓人覺得女性就應該幹麻幹麻幹麻、男性就應該幹麻幹麻幹麻。
要辦 workshop,我想如果真有興趣要學什麼東西應該也不會去管周圍是男是女。就好像修課時還要管有沒有熟的同學一起修一樣。幹麻還要辦性別限定的 workshop?
zhusee2: 我覺得在軟體工程師職場上,還是以男性佔多數的情況下,由女性來舉辦 xxx Girls 以期能協助更多有興趣的女性被看到、或是增加進入職場的機會,我不覺得這樣有到「性別歧視」的程度。
確實這是目前的現實狀況擺在眼前。不過除了那種性別不友善的公司外,我還是無法理解是什麼原因會造成今天資訊產業職場的兩性就職狀況。我數學好爛原本以為我這輩子不可能寫出任何 code 了,後來才發現被國高中教育騙了,那些東西根本就沒用過(勉強說得上有用到的唯一一個概念叫做「函式」)。所以那興趣到底是真的有先後天的外在限制,還是只是自己心理上(因為各種原因的)故步自封?這是我一直很好奇的一點。
zhusee2: 社會對性別的期望也許從小就把人導向某個特定方向;或者是可能影響了雇主在用人方面的挑選決定。
所以應該有一部份就是自己故步自封,或許長輩來的壓力也是有
話說回來,有了網路,資訊類的知識很多應該都是能夠自學的,IRC、StackOverflow 這些求助管道也非常多,有興趣和耐心的話(先別提經濟或時間因素)應該沒有什麼能阻擋你去學這些東西,不管你是什麼性別。這樣一來到底還有什麼理由要辦 Rails Girls 這種活動?男女都可參加的 workshop 效果不都一樣?
最後我得出的結論是,xxx Girls 會讓女性想參加的「誘因」,說難聽點我想是:
否則我還是不能理解你明明有興趣卻不參加一般 workshop、或者乾脆直接自學的理由到底是什麼。
不過進一步考慮:
試想,上帝造人時應該把所有人都造成雙性人,只是不能自體受精。這樣或許可以少掉很多很多人類社會目前的問題 (認真(被拖走
任何人要吵毒品議題之前,我推薦都應該先讀過「The Devil’s Picnic(台譯:老饕犯賤走天涯)」這本書再來討論才有意義。
如果有人問我讀過最喜歡的非小說類書籍,這本在我心目中絕對排名前二名。重看好幾遍依舊精彩。
為什麼我們可以合法的買香煙抽攝取一堆致癮性超強的尼古丁,但卻不能合法的種大麻嚼古柯葉吃罌粟籽餅乾(古柯葉要提煉成古柯鹼才會成為致癮物質,至於大麻則是根本沒有人上癮過。)。我們可以輕鬆又合法地買到吃肉骨粉長大的的牛肉,但西班牙放牧豬做成的生火腿卻是違法的。讀完這本書,就會再次體驗到美國政府(以及其他等等政府)的偽善,以及自己是不是已經被這些白爛毒品、食品安全法律洗腦得很完美。
人類實在是蠻擅長吹牛的,雖然是對整個世界沒什麼實質傷害…
前陣子偶然路過圖書館,順道看了一場法輪功學員辦的巡迴畫展。畫的內容除了活摘、受迫害外,還有就是各種修煉法輪功時看到的「景象」,諸如蓮花、光圈、金童玉女(我不知道那叫啥,總之就是那種很常見的造型相當難看的沒穿褲子只穿肚兜的光頭小孩)、雲彩之類的東西。
不過這裡不談畫的美感…進去看了一陣子之後,有位講解志工 A 很熱心地來問我需不需要講解,我就問了一些關於法輪功讓我疑惑蠻久的問題。還有畫的內容:
「那些光圈蓮花是啥玩意,主角還騰空飛起來」
「那是法輪功學員把自己修煉時所看到的景象所畫下來」
「還飄起來?!」
「對。」
「這是誇飾吧,怎麼可能騰空飄起來。」
「這些是真的,(以下略)…,而且法輪功學員提倡『真善忍』,不會說這種謊」
我就跟他提到其實我對於大紀元、新紀元提出的資料不怎麼信任,因為我之前看過他們一系列文章「馬克思的成魔之路」,因為實在對於內容的真實性非常感興趣(我還記得我看那系列文章時是考學測的前兩天),就去查證了一番,最後我得出的結論還是「不可信」(例如寫 Marx & Satan 那位牧師的背景),那時剛好也看到看到對岸也有個 blog 提出一些證據懷疑其真實性。(不過現在連那篇 blog 也找不到,很多內容我也忘了,就饒了我吧,根本用不到的知識忘掉也好,至少那時我也是考證了好一陣子才得出了比較可信的結論)
令人發噱的一點是,如果想找相關資料的話,跳出的永遠都是同一串新紀元文章的轉載版。
志工 A 說他覺得蠻有趣的,會回去查一查到底是怎麼回事。但後來有另一個志工 B 跑來,換他跟我講。志工 B 一點懷疑精神也沒有,例如我還談到之前大記元那篇名滿天下的奇文「發正念清除電腦病毒」,藉此證明大紀元自己還是有些未經考證的文章。沒想到志工 B 的回答竟然是「你又沒有親身經歷過,你怎麼能說那是假的?」我聽了下巴都快掉下來,根本就是段宜康在跟狗/冥/黨黨員對話的感覺啊:「正念是很好的 balabala,你怎麼能證明發正念就沒辦法清除電腦病毒?法輪功學員提倡真善忍,他們絕對不願意說謊。」。凡是跟事實不符合的台詞總是特別難記,所以他講了一大串狗屁倒灶我根本也記不住,就只是不斷在「你沒見識過正念、自己不相信正念的力量」這個節骨眼上繞圈圈。
讓人想起電影「12 Angry Men」中提到的那位年老的目擊證人,能夠像是親眼目擊似的對嫌疑人指證歷歷,但卻瞞不過旁人與證據發現他只是年老後孤單,少獲眾人注目;難得受到注目而說謊又誇大事實罷了。
這三者應該一向是最惡名昭彰的談話話題,我覺得這實在是非常莫名其妙的事情。
我認為種族意識是一種相當無聊與愚蠢的事情,別人膚色跟你不一樣你就可以畫小圈圈,小學生嗎。我最討厭聽到的就是什麼「咱#中%國&人就是聰明」之類的蠢話,原來聰明與否是看膚色不是看腦袋啊,那你跟納粹有什麼兩樣?而且你如果真的很聰明的話用不著自己強調。我對任何民族我都不抱反感,唯有一種我抱有非常大的反感,就是那種民族種族意識特強的民族,尤其是強到會拿來威脅或攻擊他人的那種。以色列、王$八@朝就是標準模範生。
不過除非你認為種族的智能真有高下之分,不然這種愛國愛民族愛過頭的腦殘我認為是環境害出來的,而在這類環境下腦子能夠清醒的人並不多。
當然如果只是膚色那還算單純,但如果加上考慮例如自然資源爭奪、利益分配等問題,以人類的天性好像跟本永遠不可能脫離種族意識這種分你我的思維模式。
講到種族就要提到「沾光」這件事。在台灣,只要有台灣人有了什麼能夠登上國際版面的特殊成就(哪怕他其實只是有台灣人血統的外國人),就會開始有人說是台灣之光,強調他是台灣人。我不是故意唱反調,而是我不懂為何別人努力獲得的榮譽,你什麼也沒做,只是生物學上有近似的血緣關係的人卻也能在那裡洋洋得意與有榮焉?幹,這干你們是否為同個種族有個屁關係啊。說難聽點,陳進興也是台灣人啊,怎麼不來與有榮焉一下?這種認同實在很虛偽。
拎周罵/拎北宇宙人啦幹。
台灣談政治只要對方是溝名動就難辦,沒讀過歷史就算了,但溝名動到底有多惡劣多壞多腐敗讀過歷史的明眼人都知道(讀到會哭出來的…)。不過很多台灣人有一種「只要對整體民眾有過一點貢獻,即使再怎麼踐踏人權也可以繼續在 21 世紀執政下去」的腦殘心態(或者其實只是很單純的認為自己是重果仁的腦殘)。想像一下納粹如果今天繼續在德國參與政治,會有多少人開罵反對。然而這種荒謬的政權卻能夠繼續在台灣生存下去,而且活得超爽。幹。
至於宗教,我覺得其實應該是很單純的事情,相信上帝/真主很偉大,就應該好好用用上帝/真主給人類的腦袋,自己判斷教義是不是符合你心中的良知。
我就直說了,我認為任何宗教,只要有種族偏見、性別歧視的,我都不願意相信那是好東西。高中的時候有稍微研究過伊斯蘭教,因為我想相信伊斯蘭教其實是個沒有歧視的普世宗教,然而結果卻讓我很失望,例如在法庭作證時,兩位(還是三位有點忘了)女性只有一個男性的同等效力(出自「伊斯蘭製造」,但手邊沒有書 orz),拿這個問題去質問伊斯蘭學者的話,他們卻會說「我們是男女平等的。先知穆罕默德有說過三次,你的母親比父親偉大,三次!」要搞這套怎麼不學明朝也蓋個貞節牌坊之類的當做女人的乖寶寶獎勵。
猶太教和婆羅門教/印度教是兩個我相當反感的宗教。一個充滿了種族意識封閉又排外,只有猶太人是上帝選民,出生不是猶太人是你活該;另一個是到了 21 世紀還是個拋棄不了種性階級制度、種族歧視、不公不義與偏見的弱智宗教(種性制度似乎已經廢除,但實際上所有人都知道根本沒有啊),歷史地理課還要背誦你們的階級制度真是浪費腦容量,為什麼可以活到現在呢。
我覺得團結不是壞事,但會排外的團結就很討厭了。
一@lksjdfc 貫#sacsd 道我了解很少,只是有一事一直覺得莫名奇妙:為啥要威脅教徒說透漏「三寶」給非教友知道會遭天打雷劈?我知道了也沒被天打雷劈。沒聽過有人威脅非佛教徒不准唸心經。
雖然李敖很嘴砲也很多人討厭他,不過我真的很想知道藏傳佛教與達賴喇嘛是否真的跟他提出的那些證據一樣糟糕惡劣(關鍵字:西藏農奴制)。只小小地希望事實不是如此,不過就我目前看過的資料,看來這希望不大。最近在街上遇到在發「藏傳佛教的真實」之類的文宣也越來越多了。
話說十戒說不可以殺人,但神自己殺的不算(參閱「出埃及記」),明明住在台灣卻怎麼感覺很眼熟。
我個人覺得這兩個議題的重點其實非常類似:
允許死刑,但依舊避免不了死刑冤案。
廢除死刑,杜絕一切死刑冤案。
蓋核四,但發生事故台灣將會有近一半面積無法住人。
不蓋核電,但其他種類的電廠發生事故也不可能嚴重影響到台灣半數居民。
不能保證判決毫無瑕疵,就不應該有死刑。我認為無視歷史上那些冤案(以及現在還在監獄中繼續無辜被關的鄭性澤等),還執意支持死刑的人,是很鄉愿而欠缺考慮的心態。我曾經支持死刑,但看過太多冤獄案件後開始覺得,還要支持那就是矇著眼睛、跟鸚鵡一樣繼續 loop 著那些支持死刑的論調。
尤其經過近來的地溝油炸大腸花學運後,相信應該很多人開始不信任現有立法司法體系,那怎麼還有臉、還有立場支持這種體系做出的判決。法律想怎麼搞你永遠都不缺罪名的,看前總統陳水扁現在的處境就知道:(。
至於核能,先別提核能發電到底佔台灣用電量少到什麼程度,以及平時那比起各國來說挺多的發電預備量了。可能我天生沒賭性吧,我就是不願意賭核電安全。其實如果國土大一點那我還不至於反對核能,但在台灣這種土地小人口密度又高到只要出事情、就會有一半人口流離失所的情況下,拿核能當作能源解決方案實在是種沒有後路的爛賭注。
所以也是這個議題我也再次深刻體認到,我實在沒什麼冒險精神(我指真的會造成實質危害的風險)。還有為什麼常常能聽到有人可以好好的家不要搞到欠賭債,但我卻無法理解他們的心態。
台灣不知是不是因為教育裡缺乏像法國那種哲學思考訓練,媒體想操弄實在太容易了,不過也許也是我太高估人類平均的邏輯能力。今年六月份的一些新聞(我就不貼連結了,有興趣可以搜一下)標題類似「昨日創下今年用電量最高峰」。嗯,我看這標題就能猜到底下一定會釣出超多挺核不知在挺殺小的腦殘,一看果然沒猜錯。「那些反核的難道不用出來負責嗎?」「反核的現在都不說話了」…新聞明明也沒說「創下『 N 年來』高峰」只說「創下『今年』高峰」,廢話哪一年沒有用電量高峰?也沒說說供電量不足啊。
其實說直白點,這根本也不需要什麼邏輯思考,而是下面那些留言自己開始酸反核的根本是他爹娘的弱智啊。
今天把 《放浪息子》漫畫又整套看了一遍,這是目前唯一會讓我覺得「好希望連載繼續下去」的作品,斷尾真的太可惜了…QAQ
目前心目中讓我最感動不已的三部漫畫應該是(無前後排序):
重看好幾次還是很感動,都是各種現實的無奈,用劇情刻劃得淋漓盡致。
…不過放浪息子真是太讚啦 QAQ 為什麼會那麼不出名呢…,如果讓我當教育部長(而且有權力可以自由決定要作什麼的話),我一定把放浪息子列為兩性教育教材,全國國高中小都採購一套(當然在這之前要先請人把長鴻沒翻完的部份翻譯完)讓全國的高中小學生一起看著女裝的修一哈嘶哈嘶。
話說放浪息子的主角感覺心智都異常的早熟啊,不過日本動漫的劇情好像一直都是這樣,不管是心智還是身材,小學生像國中生(放浪息子),國中生像高中生(放浪息子)、高中生像大學生(櫻花莊的寵物女孩),大學生像大叔(要聽爸爸的話)。
]]>self.tr()
Use self.tr()
to surround all strings needed to be translated in Python code. (Must be in a QWidget
class). For example:
1 | from PyQt4 import QtCore, QtGui |
QTranslator()
Take zh_TW
for example, install QTranslator()
in QApplication()
. Use QTranslator().load()
to load translate file.
bool QTranslator.load (self, QString fileName, QString directory = QString(), QString searchDelimiters = QString(), QString suffix = QString())bool QTranslator.load (self, QLocale locale, QString fileName, QString prefix = QString(), QString directory = QString(), QString suffix = QString())
Notice: the file QTranslator loads is a
.qm
file (a binary file generate from.ts
), instead of a.ts
.
1 | translator = QtCore.QTranslator() |
- QTranslator Class Reference
- QLocale Class Reference
Beside to os.getenv()
, you can also get current system’s locale name with QtCore.QLocale.system().name()
, its return value is a string like ja_JP
. So you can load translation file by system’s locale:
1 | print('Localization loaded: ' |
pylupdate
To Create .ts
FileNow create a directory translate/
, then use pylupdate
to generate an empty .ts
file in it for your PyQt file:
$ pylupdate4 main.py -ts translate/zh_TW.ts
Open translate/zh_TW.ts
with Qt Linguist and begin to translate.
you can also use your prefered text editor to edit the file directly, because it’s just a XML file.
lrelease
To Convert .ts
into .qm
After finishing the translating, use lrelease
to generate .qm
binary file from .ts
.
$ lrelease translate/zh_TW.tsUpdating 'translate/zh_TW.qm'...Generated 55 translation(s) (55 finished and 0 unfinished)
After modifying strings in PyQt file, updating the translation file is necessary.
First, use pylupdate
to update .ts
file:
$ pylupdate4 main.py -ts translate/zh_TW.ts
Now you can open the .ts
file with Qt Linguist to update old translations. After that, use lrelease
again to generate .qm
.
$ lrelease translate/zh_TW.tsUpdating 'translate/zh_TW.qm'...Generated 56 translation(s) (56 finished and 0 unfinished)
At last, maybe you want to totally remove the unused/obsoleted translation items in
.ts
file, use-noobsolete
option to do this:
$ pylupdate4 main.py -ts -noobsolete translate/zh_TW.ts
]]>寫了一陣子 Python 後,我最後是用這種命名方法:
HelpWindow
, MainWindow
reloadFiles
, applyAndWriteConfigFile
.button_box
, main_window
,就算只是創建完就丟的 instance(例如 Qt 的layout
或push_button
)也應該要給它有意義的變數。絕對不要偷懶用縮寫寫成像是 m = QtGui.QMainWindow()
,這樣鬼知道那個 m 到底是 QMainWindow 還是 list 的 model? 我真的不懂又不是古早年代變數長度有限制,省那幾個字讓 code 更難讀到底是想做什麼…(超常見到這種鬼東西)for i in range(5): ....
。不過我還是常常不縮寫,因為這樣可以讓 code 讀起來更像有意義的英文,比較好懂。這樣命名很簡單,且一看到 variable 就可以知道這些分別屬於什麼東西。至少目前我發現這樣命名還不錯,讀起來很容易。
不知還有什麼我還不知道的語言特性需要用到變數,有的話會再補上。
]]>Jp
天使の羽根を踏まないでっ の OP「やさしい世界を君に」のピアノ独奏トランスクリプション。En
Piano solo transcription of “Tennshi no Hane wo Fumanai de”‘s OP “Yasashi Seikai wo Kimi ni”.Zh
別踩雞毛的 OP piano solo transcription。
PDF をダウンロウド / PDF Download / 下載 PDF
I enjoy this piece but I am definitely not a good performer, nor interested in playing piano without any fucking mistake (Unfortunately, I never succeed this mission impossible after learning piano for 12 years). So if you can and wish, please upload your recording and email me, I will place in this page.
昨天(20140825)吃完晚餐後,心血來潮一鼓作氣改完了。
一直非常喜歡這個 OP(不過好像不是很多人喜歡…=w=”管他娘的我聽得好爽就好),不過:
想找 opensource 的,然而 MuseScore 的穩定性讓我現在還是不太敢碰它、Rose Garden 又操作極度詭異實在搞不懂又缺乏教學文件(是有教學文件,但都太舊不知幾年前的…)…有沒有人有推薦的啊 orz 我音感完全不行,所以 LilyPond 那類外星等級的腦袋在用的就別談了 orz。
我這種廢物的視奏能力經過三年訓練以後,沒想到竟然還有些進步,再來練任何東西真的…超爽,彈鋼琴真的要練視奏,不然光看新譜、練新譜上不熟的技巧,所有耐性都磨光光了,彈起來一點也不快樂也不爽只覺得煩躁而已。這真他娘親的是種吃天份、燒時間、又門檻超高的休閒娛樂啊。(<=十年多的心得)
但演奏或錄音又是一回事了。演奏是種更他媽的更吃天份和時間的事情。原本想說多練幾天再錄影上傳,但後來發現又碰到了瓶頸…(就是再練下去沒啥效果、因為每次錄音錯的地方都不一樣,這樣還練個屁啊幹)上面這個錄影我重錄了十幾遍都快吐了但還是錯音一堆就認命了,反正學琴到現在我也從沒成功彈過任何一首曲子而不出錯的,Rubinstein 說的「錯音掉滿地」應該是用在我身上。我確實沒有音樂天份,幹。
]]>In Emacs Lisp, the following function/macro are also available, but
(require 'cl)
first is necessary.
(while TEST BODY...)
1 | (let ((i 0)) |
mapcar
/mapc
/map
A list as input argument is required.
(mapcar FUNCTION SEQUENCE)(mapc FUNCTION SEQUENCE)(map TYPE FUNCTION SEQUENCE)
1 | (mapcar (lambda (x) |
SEQUENCE: may be a list/vector/bool-vector/string
mapcar
and map
collect all results (of FUNCTION) into a list and return it.map
can sqecify output SEQUENCE type but mapcar
can’t.mapc
just for side-effect, and it always return the original list. That’s to say, you have to do what you want in lambda body, e.g. (push (* x x) output-list)
.You can also use
map
/mapcar
like this:
1
2
3
4 (mapcar #'cons '(1 2 3) '(a b c))
;; => ((1 . a) (2 . b) (3 . c))
(mapcar #'list '(1 2 3) '(a b c) '("Apple" "Banana" "Citrus"))
;; => ((1 a "Apple") (2 b "Banana") (3 c "Citrus"))
Notice: In Emacs Lisp, use
mapcar*
instead; otherwise,mapcar
cannot accept multiple sequences.
A list as input argument is required.
(dolist (VAR LIST [RESULT]) BODY...)
1 | (dolist (x '(1 2 3 4 5)) |
dotimes
(dotimes (VAR COUNT [RESULT]) BODY...)
1 | (dotimes (i 5) |
(dotimes (i 5) ...)
, i= 0, 1, 2, 3, 4dolist
, Used for side-effect.do
(do ((VAR INIT [STEP])...) (END-TEST [RESULT...]) BODY...)
1 | (do ((i 0 (1+ i))) ; (VAR INIT [STEP]) |
do
.loop
“How Lisp loop macro works?” “Magic.”
loop
is the most complexe iteration macro in Lisp. It’s very powerful, but before playing with it, a lot of “keywords” and rules needed to be memorized and comprehended first. Following merely noted some most frequently used keywords and their usages:
1 | (loop for i from 0 to 5 do (princ i)) ;; "do" won't return anything; so return-value of loop itself is nil. |
in
is easy to understand, it just traverse over all elements in LIST.across
is used on ARRAY/VECTOR
1 | ;; for + in LIST |
on
is a little strange, which traverse over all cons cells of the LIST.
1 | (loop for x on '("Apple" "Banana" "Citrus") collect x) |
1 | ;; repeat n times |
do
itself won’t return anything.
usages are similiar to
collect
.
count FORM
count the times when FORM is non-nil.into
to save the value into a variable.1 | (loop for i from 1 to 100 |
1 | ;; Note: `when' is just a synonym for `if' |
finally
finally [do] FORMS...
andfinally return FORM
will execute FORM after the whole loop is done.
1 | ;; `for VAR =` to set VAR at every iterates. |
Return value of loop would be t
or nil
.
1 | (loop for size in '(12 11 14 8) |
loop
Examples1 | (let ((n 1)) |
Read code is more comprehensible than explianation in text.
1 | ;; recursive |
2014-10-06 update: Recursive way.
Use Emacs build-in package json.el
and its function (json-read-from-string JSON-STRING)
, you can get a parsed nested list like this:
1 | ((title . "了") |
Now try to get the data in it. In JS, you can get any data in JSON easily with data.key[n]....
, but json.el
seems not to provide an easy way to get data iterately from it; and a lot of duplicated (cdr (assq 'key data))
and (aref data 0)
make code hardly readable.
So let’s write a function:
1 | (defun json-getdata (data &rest args) |
Now you can get data from JSON like this:
1 | (json-getdata data 'heteronyms 0 'definitions) |
It’s nearly the equivalent of (in JS):
1 | data.heteronyms[0].definitions |
Use loop
to get n data in vector, and collect
all results as a list (like mapcar
):
1 | (loop for i from 0 to 4 collect |
At first, I tried to write this function in recursive way. However I just couldn’t done this mission which nearly made me insane. Now I found that’s because my unfamiliarity of two concepts: &rest
and apply
:
1 | ;; Recursive way |
The &rest
arguments will return as a list:
1 | (defun keys-test (data &rest keys) |
So, if you just write recursively calls like this:
1 | ...(json-get (cdr (assq (car keys) data)) (cdr keys))... |
Will goes wrong. Because it will be called (recursively) like this:
1 | (json-get DEEPTH-2-DATA ('key2 'key3)) |
instead of:
1 | (json-get DEEPTH-2-DATA 'key2 'key3) |
So apply
is needed:
1 | (apply #'+ '(1 2 3)) => 6 ;the last argument of `apply' should be a list |
Dired 代表 “DIRectory EDitor” 的縮寫,是 Emacs 內建的一個功能完整而強大的檔案管理員(自訂的彈性更是其他 FM 沒得比的)。
我想他唯一的弱點是圖片顯示以及設定麻煩,不過本篇應該能夠幫你搞定大部分必要的設定。
C-h m
一看文件指令一大堆,而且很多指令名看不出來是做什麼的,根本不知從何下手。因此現在讓我們直奔主題:怎麼開啟 Dired?
C-x C-f
後不要選檔案、還在目錄時直接按下 Enter 就是了。
1 | g: 重新整理 |
但只知道這些是不夠的。沒辦法,說實話沒設定過的 Dired 難用得連我家的貓都不想用。因此這裡整理了一些(我認為且推薦)必備的 Dired 相關設定,設定以後 Dired 立刻順手 n 倍:
請記得先去安裝 Dired+ ,他提供了 Dired 非常多的額外功能。
1 | (require 'dired) |
經過這些調校以後,現在多了這些功能:
1 | (: 隱藏/顯示詳細資訊(Emacs24.4 安裝 Dired+ 後,會自動把檔名以外的部份隱藏起來,很方便) |
現在應該順手很多了吧? ˊ・ω・ˋ
Dired 的功能還有很多很多,像是 mark 起來的檔案批次處理之類的,不過其實我最常用的也就以上這些功能,只要能夠活用,相信 Dired 應該會成為你非常重要的工具。有興趣的可以在 Dired 中按C-h m
再慢慢研究還有什麼功能。如有覺得不錯的也請不吝分享:-)。
寒假時爬了好幾趟在台中時朝思暮想的茶壺山,尤其年假初一到初三那幾天基隆/東北角竟然都沒下雨,一口氣給他爬到爽為止。
在台中過得挺煩悶,不是沒事做,而是在台中我根本不想往戶外跑,整天不是坐在書桌電腦前就是鋼琴前。都說台中是全台灣最適合人住的城市,但我又不愛看城市水泥街景,而且我看到人群就反胃。嗯…不過來了台中我也沒往中央山脈跑就是了…所以這種話可能有失公允。好像應該找機會去幾趟走走嘿?
此處的估計時間僅供參考。因為很奇怪的,跟我走過山路的人,半路都喘氣喘到面有菜色,奇怪我的體力應該算是蠻差的啊 XD
家裡離茶壺山很近,走路 15 ~ 20 分鐘就能到茶壺山山腳下的勸濟堂旁邊走一段路過去就是黃金博物園區。我個人是覺得,來金瓜石九份地區旅遊,只去逛九份老街或黃金博物園區神馬的實在可惜,因為最漂亮的都不在那裡 XD。體力不要太差而且不怕流汗的人,應該來爬爬茶壺山(不過如果你本來就喜歡逛街和人潮多的地方而且不喜歡流汗,那千萬別來茶壺山)。但是要注意從山頂開始是有一點危險性的,像是半屏山據說曾經有人摔下來過,風險自行承擔。 不過如果不爬到山頂就不用顧慮這種事。
這個地方以前有礦坑(包括燦光「寮」以前也是有礦業的地方)但現在整個沒落了。
我喜歡拍路標 ˊ・ω・ˋ 拍路標可是變態的浪漫啊~(意味不明)
從這裡開始就是前面提到的開始有點危險性的地方了,立在那裡的紅色牌子就是警告遊客不要再上去。一路都是碎石,而且頗陡峭,不抓好繩子很容易滑倒或者直接滾下去。
這張照片中心靠左上角的遠方,可以看到一個有點白色的平台,依稀還看得到幾根柱子;那個就是黃金神社,從黃金博物園區內可以爬到。好小好小的時候爬過,那時覺得好高好累,但現在就不覺得了,反而想說會蓋那麼低應該是不能讓太子爬太累(誤)。
這裡視野奇好,我認為是整個金瓜石視野最美的地方之一。這篇文章一開頭的全景照就是在這裡拍的。親眼看很震撼。
來親眼看過這裡的景色,會很驚訝的想「這裡真的是離鬼城基隆靠杯整個城市都是溝民動。那麼近的北台灣?」以及「幹拎[北|娘]的這麼美的地方旁邊竟然蓋核四」。所以我現在有機會就去爬一爬,一個垃圾渣等級的核電廠在那,誰知道茶壺山還有幾年能爬?
拎周罵、拎北就是反核反核四反溝名動啦咬我啊幹。
]]>我的文筆與中文程度很差的,如果您只是想看此次演講的內容,請直接跳到這裡,不要看我的低水準記敘文。不過他的各場演講應該內容都不會差太多就是。
小學四年級還五年級時在基隆的誠品書店基隆誠品已經變成時代的眼淚了啊 Q_Q看到有書在介紹 Linux 和自由軟體,讀了以後異常興奮,覺得開放原始碼與自由軟體的理念真是太帥了-即使根本完全不會寫程式;考慮許久後就買下了生平第一本 Linux 相關的書,回去把裡面附的 Mandrake 9.1 光碟裝來玩,也買了 Just for FunLinus Torvalds 約在 2000 年前後出的自傳。 來讀
不過那時的 Mandrake 蠻多問題我不知該如何解決,所以過了一陣子雖覺可惜但也只能放棄。而且我買的施 xx 研究室的那本書寫得超草率而品質低劣,那時沒概念,後來很後悔不該買那本的。直到國中有了 Ubuntu 6.06 我才完全拋棄 Windows。到了今天,雖然已經每天使用 GNU/Linux 和自由軟體,但那時首次了解自由軟體概念所受到的衝擊到現在還是難以忘懷。其中就一直非常崇拜 Linus Torvalds,以及自由軟體之父 Richard Stallman (RMS)。
之前 2010 時 RMS 也有來過台灣一次,不過我也不知道為何那時我竟然是漏掉了消息還是怎樣並沒有跟到,這次來台我怎麼能錯過 XD (尤其我現在每天用 GNU Emacs 生火燒水洗澡煮飯),可以見到 guru 本人真是榮幸(←完全的追星族心態)。
台北新竹南投高雄各有一場,新竹場離台中遠了點,搭車大概要兩個小時,後來評估一下還是去南投場。還好大車到暨南大學還蠻快的,一小時左右就到。暨南大學很漂亮,而且很大,大到裡面竟然有遊客服務中心是哪招(我看到笑翻),不知整個校地有多少比例是綠地,四周看過去都是山脈。光環境來說其實有點羨慕。
跑到演講會場時下午一點,已經擺好賣書攤位,離演講開始還有一個小時;原本想先逛逛校園的,卻開始下雨,只好先去校內的-4我也不想,但學校裡面禮拜日只有-4 有開。順便幹譙一點,最近全家的東西越來越貴份量也越來越少了,食品添加物好像比現在的-4 還多,反而是-4 的東西份量變很大,義大利麵不錯吃。 解決一下午餐。-4 的內外有很多人背著超大包包在那裡晃來晃去,一看就覺得是校外也是來聽演講的,而且不知怎的散發的氣場感覺也很宅,一問之下果然如此 XD,是一群台中 Linux 使用者聚會的人揪團來聽演講。
下午快兩點 guru 終於顯靈降臨現場了,超大的肚子彈彈彈地走下來。一開始主持人問現場有沒有人用 Apple 產品,很多人舉手,RMS 當然是說了:「Apple is worst!」;再來問有多少人用 GNU/Linux,現場的使用者不多。最後問有多少人用「Microsoft® Windows」,一堆人舉手,RMS 大拇指立刻朝下比了幾次一邊搖頭「Bwooooo~~」XD。
演講快開始時,RMS 鼓勵大家去後面拿貼紙:「盡量拿、並盡可能的利用它」,最多的是 GPL v3 和 GNU/Linux 的貼紙,再來是 FSF、反 DRM、反蘋果監控,可惜最想要的 GNU 牛頭貼紙只剩下一張…。
以下只是把之前沒聽過的觀點大意記錄下來。沒辦法逐字逐句紀錄,但基本的語意應該不會差太多。
「…監控是在違反最基本的民主!我們今天被政府監控的程度比蘇聯還嚴格,我們必須想辦法對抗這些監控,否則我們根本不自由也沒有民主。 但政府老是搬出『打擊犯罪』當做監控人民的理由,然而那不是藉口,而是應該要重新設計這整個監控體系。」
「…例如新加坡的道路上就有車牌辨識系統,每個經過的車輛車牌都會被記錄下來(ETC…)。一旦這種系統直接與政府連線,那就已經是不合理的監控。假如有社會運動人士要開車去參加社運,路上卻有警察把他們攔下來拘提,等到社運結束再放他們回家,不用經過審判、你也告不了警察。…這種車排辨識系統如果要作,就不該直接與政府連線。如果是合法的車輛,系統就不應該「看到」車牌,而是只能對罪犯的車牌或者贓車有反應,也就不會平白無故紀錄到一般人民的車牌號碼。」
「你不是臉書使用者,你是被臉書使用的人。」
「芬蘭這種好像是民主的國家從 2006 年開始也有類似的言論審查機制,土耳其、澳洲也都有。你可以不滿我的言論,但最糟糕的行為是限制你的言論自由。在巴基斯坦批評宗教是會處死刑的,所以這是我絕對不會去的國家。」(台下大笑)
「只有非自由軟體/專有軟體能夠箝制你的自由,一個非自由、有專利的格式,就會限制你只能在非自由軟體上使用;一旦你只能用非自由軟體,政府就能夠輕易的監控你(所以原來 libdvdcss 在某些國家違法原來是這個原因嗎?!),mp3 這種格式雖然有 opensource,但依舊有專利,所以很多軟體開發者不敢放進軟體中不然會被告。越多檔案用封閉格式流傳,就會越多人使用非自由軟體。所以我的演講請不要用 mp4 格式散布,也不要上傳到 YouTube!」
「你有沒有想過現在很多手機電池設計成不能拔出來是為什麼呢(突然想到,十年前智慧型手機還很不普及時,確實幾乎沒看過有手機這樣設計)?手機製造商可以在你關機後、偷偷連線繼續追蹤使用者;你想說,電池拔掉總可以了吧?但即使電池可以拔掉,製造商一樣有可能在其他地方藏一個小小的電池,讓手機能再撐個半小時之類,即使你拔掉電池,他們還是能夠繼續追蹤!」
「Chrome 有很多後門,會偷偷收集使用者資料,這種東西根本是病毒;串流更嚴重,client 都是非自由軟體,像 spotify 的音樂都是經過加密才播放,我們不應該用它。Amazon 則根本就是在違反人權,Amazon 可以遠端存取你的 Kindle,甚至直接刪掉你的電子書,這種就是後門……我有寫過一篇文章告訴你為何不該用 Amazon。」
「大學裡面應該要教逆向工程,我希望有更多人可以來搞這個,逆向工程對對抗專有軟體與監控很重要,而且也能成為一個很好的生涯職業。學校應該只能教學生自由軟體,才能夠培養出下一代的自由公民與自由的社會;除非有課程要教逆向工程,才能使用專有軟體。有沒有想過為什麼 MS 要一直提供學校優惠勒?就跟毒販販毒一開始都要給人一點甜頭嚐嚐一樣。」
##矛盾之處##
話才講完 IRC 上的 darkx
馬上打臉:
(15 時 32 分 32 秒) darkx: Ray:其實這就是有問題的地方了,他能活的這麼開心是因為很多人幫他做了他認為的 dirty things
(15 時 32 分 50 秒) caasih: darkx++
(15 時 33 分 00 秒) Ray: XDD
(15 時 33 分 21 秒) darkx: 有人替他把這些他不想做的事情都做掉,他才能活在他的理念當中
(15 時 33 分 36 秒) darkx: Ex. 他沒有手機,可是他身邊接送他的人都有阿 wwww
Q&A 時間還真的有人上台拿這一點打臉,不過 RMS 的說詞大意是「他們本來就有在使用網路付款,他們也都是自願很樂意的,我沒有強迫他們」
(16 時 34 分 14 秒) darkx: 推的一乾二淨,是他們自己喜歡買的 XDDD
##會後
###Q&A
Q&A 竟然有人上台說他認為應該要提倡網路實名制,「因為很多人會在網路上說一些不負責任的話」,光聽這種說法印象就奇差無比,他沒被砲轟我覺得已經是很神奇的事了,我就認為他應該趕快移民去兲朝天朝(中國)他肯定會住得很爽。RMS 的回應大意差不多是:「網路實名制會有很多問題,一個簡單的例子,如果你工作上的主管強迫你支持他的意識形態與政治立場,這種情況你該怎麼辦?你在網路上就很難說出實話;並不是每個人都跟我一樣不用看老闆臉色就能過活。」
回答另一個人的問題(記不太清楚了,大意是「專有軟體真的很方便,面對方便與自由的抉擇,我們到底該怎麼做」):「……看你要不要選擇方便而捨棄自由,如果你還是認為方便比自由重要那我會覺得你是白痴。」整個講話超毒 XD。
然後果然有人問 RMS 對台灣的印象…(捂額),說去日月潭吃了總統魚神馬的;看到有人點蚊香,以為那是殺了蚊子以後在拜牠們 wwwww
BlueT 大大上台打臉,問 GNU/Hurd 到底有沒有要繼續搞下去,總之 BlueT 最後自己得出的結論是不用再冀望 GNU/Hurd 了,把心力放在其他地方吧 XD。
###拍賣
Q&A 結束後,RMS 照慣例拿出 GNU 牛羚娃娃出來拍賣:「如果你家有企鵝玩偶,你一定需要 gnu 牛羚!這樣擺在旁邊就變成 GNU/Linux」他就一直撫摸那隻 gnu 一邊不斷講:「這個好萌好可愛(adorable)的小 gnu 正在找他的主人喔~可愛的 gnu….」一個毛茸茸的大叔今年已經六十一歲了耶@A@一直講 adorable 賣萌實在超有喜感的 XD
(16 時 31 分 10 秒) ronmi: a gnu doll filled with feromon of stallman
(16 時 31 分 24 秒) BlueT_: ronmi: what the fuck…
價錢衝得很恐怖,1000 => 1100 => 5000 => 10000….我忘記最後到底標到多少了,反正很驚人就是了後來都覺得 RMS 好像是 FSF 一個很重要的收入來源(誤)。不過突然想到,他的機票錢都怎麼來的?演講參加惹都免費,還是說其實有演講費?。
其實演講中提到的大多數概念,我想會專程來聽這個演講的人應該都早已很熟悉,不過反正這場演講最重要的本來就是能親眼看到 RMS 本人以及簽名啊 XD(<=標準追星族)。買了一本 Free Software, Free Society (NTD 400) 當作捐款給 FSF,書遞上去後趕緊問能不能也簽在筆電上?”Maybe I guess.”。之前就有聽說要請他簽在筆電上的話,得先把 Windows®貼紙撕掉,不過筆電剛買來我早就立刻灌上 Mint、什麼 For Windows 7 貼紙早也就都給撕了,於是開心的遞出筆電。RMS 拿到筆電第一個反應是問這跑什麼系統,我說 openSUSE應該用不著講成 GNU/openSUSE Linux 吧… ,然而他同時把筆電翻到背面,指著上面那精美的 Microsoft Windows® OEM 貼紙…
哈哈哈哈哈哈哈我真的完全忘記背面也有一張了啊!沒想到竟然還犯這種白痴錯誤。很好,還好要簽名的排隊隊伍不長,立馬在旁邊和熱心的工作人員一起把貼紙撕掉後再重新排隊,再次開心的遞上筆電和圓規——— 因為我真的想不出除了圓規以外到底還有什麼筆能寫在塑膠殼上而不會被輕易磨掉的,拿油性筆畫上去也是指甲摳一摳糊了抹一抹就沒了,開什麼玩笑怎麼可以!幸好他看到圓規沒有拒簽或生氣什麼的,接手筆電,默默地翻過來確認貼紙確實已經撕掉後,拿起圓規「簽」在筆電表面…終於:
……阿母啊!我拿到 RMS 的簽名惹啊啊啊啊啊啊啊啊啊 QAQ(尖叫)簽下去後 Emacs 啟動速度好像真的變快惹,在狗$冥^黨統治下的烏煙瘴氣的台灣的人生也重新充滿惹新希望 wwwwww
]]>或許人們可以覺得 RMS 偏激,但我堅信世界上就是必須要有人來推廣並堅守這種自由理念。:-)
現在最新的 Org 版本號是 8.x,但目前 Emacs 即使是最新的 stable release (24.3) 內建也都是 Org 7.x,重點是 8.x 的 export 功能改了超多,跟 7.x 會衝突,至少在我的系統上,如果直接拿 Emacs 24.3 硬裝最新版的 Org,整個 export 功能都會華麗地爆炸給你看。由於我實在很懶得去鳥這種衝突問題,最後解決的辦法是…去抓開發版的 Emacs 來編譯:
1 | git clone git://git.savannah.gnu.org/emacs.git |
整個 repo 超大, 要等好一陣子。不過編譯時到底有哪些 dependancies 我也忘記了勒,請用力看 make 訊息想辦法悲 ˊ・ω・ˋ
如果你用 openSUSE,基本上就直接打開萌萌的YaST2 或 zypper 安裝 texlive
和 texlive-cjk
,幾乎所有需要的 dependency 就都已經裝好了,包含 xelatex。
不過由於我有時會用到多行的 table cell,所以有另外安裝 texlive-multirow
,建議可以也裝一下。
至於其他 distro 的使用者,相信找找 texlive 和其看起來與中文相關的 dependencies 應該不是什麼大問題。
fc-list :lang=zh
指令能夠取得目前系統上安裝的所有中文字體名稱;但不保證能用,可能要自己測試一下。雖然 XeLaTeX 可以把系統中現有的字型用在文件中,但還是有些問題,像是不知為何 cwTeXHeiBold
不管踹幾次,只要用了他,一編譯就會爆炸給你看。但其餘的 cwTeX 字型就不會有這個問題。1 | (setq org-latex-classes |
因為有時候用 org-mode 輸出了 latex 檔後,還需要再另外編輯(例如 Org-mode 的 table 功能很有限,如果需要用到 multicols
之類的東西,就得自己手動再編輯 latex 檔)
但是在 LaTeX mode 中,按 C-c C-c
雖然可以自動呼叫 latex
指令編譯,但我們需要把他改成呼叫 xelatex
:
1 | (setq tex-compile-commands '(("xelatex %r"))) |
如果你使用 AUCTeX,需要設定的變數會不一樣,他用來 compile 的指令清單是 TeX-command-list
,我只改了 LaTeX 那個欄位,如果你有其他需求可以自己造樣造句看看。差不多是像這樣:1
2
3
4
5
6
7
8(setq TeX-command-list
'(("TeX" "%(PDF)%(tex) %`%S%(PDFout)%(mode)%' %t" TeX-run-TeX nil
(plain-tex-mode ams-tex-mode texinfo-mode)
:help "Run plain TeX")
("LaTeX" "xelatex -interaction nonstopmode %t" TeX-run-TeX nil
(latex-mode doctex-mode)
:help "Run LaTeX")
......))
搞好這些後,開個 org 文件就可以快樂地開始寫東西了,寫完按 C-c C-e
就可開啟 export 選單選擇輸出 LaTeX 或直接衝 PDF。這時也可以先按 # default
插入 template,裡面可以設定一些選項,例如toc
(table of contents)設定成 nil 或 t 可以指定要不要輸出目錄、tex
表示要不要支援 TeX 指令等。
$算式$
就可以輕鬆愉快的用標準的 LaTeX 數學公式表示法把算式直接寫在內文中;在公式或標題上按C-c C-x C-l
可以即時預覽 LaTeX 公式輸出。\\
或者使用\newline
。只要在 Org 文件中任意處加上這行:
#+LaTeX_CLASS_OPTIONS: [a4paper,twoside,twocolumn]
假設一個有六個 column 的 table,想要:
- 使用
longtable
套件讓 table 可以跨多頁(不過我發現這玩意有時會有靈異現象,沒事不要用,不過這是longtable
的問題,跟 org 無關)- 指定第三個 column 的寬度為 5cm。
- 字型大小縮小成
footnotesize
大小,超過就讓 cell 換行- 加上標題 「女僕裝最棒了」
可以這樣寫,把這行加到 table 的前一行即可:
#+ATTR_LATEX: :environment longtable :align llp{5cm}lll :font \footnotesize#+CAPTION: 女僕裝最棒了
至於有沒有辦法橫向或垂直向合併欄位呢?很抱歉,org 的 table 語法不可能辦到所以不要浪費時間了(他們的 mailing list 之前就有人問過),唯一的方法是先輸出 tex 檔再手動修改,使用
multirow
之類的。
不要浪費時間自己打\begin{center}
之類的東西,直接輸入 <c
然後按 [TAB]
自動展開即可,這是 Org-mode 專用的的置中語法。
可以用 C-u C-c C-l
插入圖片。C-c C-x C-v
可以直接在 Emacs 裡顯示。
想要給圖片加上標題,只要直接在的前一行加上:
#+ATTR_LATEX: :caption \bicaption{標題}
調整輸出後的圖片大小與 float (可用:l/c/r) 則是:
#+ATTR_LATEX: :width 5cm :float c
順便講一下輸出 HTML 的圖片縮小方法。
#+ATTR_HTML: :width "100px"
更多詳細的屬性可以參考官方的 Org manual:@LaTeX{} specific attributes - The Org Manual
我一直無法忍受 helm 和 ido-mode 的 find-file 設計,但又覺得他們有部份功能實在很方便,例如能夠按 DEL 直接刪回上個目錄的路徑,或者快速清空整個路徑再重新輸入等。這裡做了幾個符合自己需要的功能:
M-[DEL]
就可以往前刪到 parent dirC-a
只是一般的 beginning-of-line
,但按第二次 C-a
的話:M-[DEL]
都會蓋過我的剪貼簿,而且 kill-ring 也會多一條沒用的檔案路徑)1 | (defun minibuffer-beginning-of-line () |
然而 Google 下來,找到的很多其實都是舊寫法例如每個 face 除了 defface 外還要另外 defvar 一次,現在根本沒有必要這樣做。,在 Emacs 24 其實可以寫得很簡單。除非你想要支援舊版 Emacs,不然當然是能輕鬆就輕鬆。
注意
本篇介紹的 不是 在寫一個新語言的 major mode,而是寫出類似 dired 的那種 major mode。
如果你是要給一個新的語言寫 major mode 與 syntax highlight 之類的東西,請參考 coldnew 大神的「使用 Generic Mode 輕鬆建立新語言的語法上色」與用 Generic Mode 寫的 coldnew/qml-mode ;或者傳統的寫法 cataska/qml-mode
假設要寫萌典的 client 端:
moedict-mode
。moedict.el
。moedict
。首先定義一個 group,名子就叫做 moedict
,把你寫的這個 mode 所有相關的 function, variable 都全部放進去。定義 function, variable 時記得都以 prefix 當開頭。
至於 font-faces 放進一個獨立的 group moedict-faces
,然後塞進 group moedict
和 faces
(預設的 faces group 名) 作為 sub-group。1
2
3
4
5
6
7
8
9(defgroup moedict nil
"Major mode for looking up Chinese vocabulary via Moedict API."
:prefix "moedict-"
:link '(url-link "http://github.com/kuanyui/moedict.el"))
(defgroup moedict-faces nil
"Faces used in Moedict-mode"
:group 'moedict
:group 'faces)
再來定義這個 mode 的 hookHook: 在 mode 啟動完後 Emacs 會自動去讀該 mode 的 hook 並執行裡面的內容,這種機制讓使用者可以自行額外自訂這個 mode 變數:1
2
3
4(defcustom moedict-mode-hook nil
"Normal hook run when entering moedict-mode."
:type 'hook
:group 'moedict)
再來定義這個 mode 所使用的 key-map:1
2
3
4
5
6
7
8
9
10
11
12
13
14(defvar moedict-mode-map
(let ((map (make-sparse-keymap)))
;; Element insertion
(define-key map (kbd "q") 'quit-window)
(define-key map (kbd "h") 'describe-mode)
(define-key map (kbd "l") 'moedict-lookup)
(define-key map (kbd "r") 'moedict-lookup-region)
(define-key map (kbd "<tab>") 'moedict-cursor-forward-word)
(define-key map (kbd "<backtab>") 'moedict-cursor-backward-word)
(define-key map (kbd "C-c C-b") 'moedict-history-backward)
(define-key map (kbd "C-c C-f") 'moedict-history-forward)
(define-key map (kbd "C-c D") 'moedict-history-clean)
map)
"Keymap for Moedict major mode.") ;document
基本上照樣照句就對了。
最重要的地方來了,但其實很簡單,Emacs 24 只需要用 define-derived-mode
這個內建 macro 就能一次解決。1
2
3(define-derived-mode moedict-mode nil "MoeDict"
"Major mode for looking up Chinese vocabulary via Moedict API." ;major-mode 說明
(set (make-local-variable 'buffer-read-only) t)) ;這裡放啟動 mode 後要改的 local 變數
注意第一和第二個參數分別是是 child 和 parent mode,child 就是指目前的 mode 名稱。指定 parent mode 以繼承 parent mode 的設定,例如 css-mode
的 parent mode 是 fundamental-mode
只有純文字、什麼都沒有的 mode, python-mode
則是屬於 prog-mode
prog=programming
第三個參數則是會顯示在 mode-line 上的字串。
如果你的 mode 需要用到 font face也就是字體大小顏色粗細斜底線等,就需要為不同的 face 分別定義。詳細可以參考敝人曾經寫過的這篇。
這裡要注意的是,Emacs 能夠自動根據目前的背景色(深色底/淺色底)來決定該用哪一個 face,所以你可以定得像是下面這樣:1
2
3
4
5
6
7(defface moedict-title
'((((class color) (background light))
(:foreground "#ff8700" :bold t :height 1.2))
(((class color) (background dark))
(:foreground "#ffa722" :bold t :height 1.2)))
"Face for title. ex:"
:group 'moedict-faces)
light
表示淺色底所採用的 face,這時文字就建議用深色一點的才看得清楚;dark
則反之。
這篇文章已經被拋棄,因為現在我已經把所有 Hexo 相關的功能獨立出來,順便加強整個重寫成一個真正的 major-mode 並放在 kuanyui/hexo.el內了,有興趣、想使用的請自行去抓來看,以後如果有更新也會在那裡。
這篇文章不會再更新。
This article has been deprecated. Because now I have rewritten all following functions and do more & more jobs as a real major-mode in kuanyui/hexo.el. If you want to use Hexo in Emacs, please take a look of that. Any update in future will be pushed onto that repositor
This article will NOT be updated anymore.
hexo
操作更方便的 function:hexo new
M-x hexo-new
即可新增文章,不需要手動 cd 到 hexo 的根目錄。 1 | (defun hexo-new () |
*.md
的檔案開頭中的 date:
(沒有的話會爆掉) 來 touch -t
該檔案,如此一來就能在 Dired 中按照時間排序文章列表。1 | (defun hexo-touch-files-in-dir-by-time () |
head -n
還是一樣慢 orz。1 | (defun hexo-move-article () |
date:
),用這個可以幫你更新到目前時間。/2014/06/26/article.html
),就會影響到你的文章連結。1 | (defun hexo-update-current-article-date () |
Update @ 20140524: 我稍微改進了一下,現在會忽略註解,也就是註解不算在字數內。
Emacs 內建的 count-words
不太方便,只能統計英文字數。一直以來都是調用 script 來計算,但實在太龜速(跑了好幾層的 awk 跟 sed…)、設定也太麻煩。之前一直很想用 Emacs Lisp 重寫這個功能,但一直不知該怎麼做,完全找不到有文章在講中日文的這類問題,大概很少有 Emacser 需要做這種事吧…。
不過今天才突然發現其實非常容易,而且速度比我之前用的方法快很多很多。關鍵在於 rx
這個函數,詳細資訊可用 C-h f
查詢內建文檔。
1 | (defvar wc-regexp-chinese-char-and-punc |
M-x wc
即可使用
]]>[TODO] 看看能不能寫成 minor mode 即時顯示在 mode line 裡,但我不知該怎麼做。
要給文字上色或加粗,你可以直接拿內建已經有的那些 font-faces 來用(可使用 M-x list-faces-display
查看整個目前環境可用的 font-faces 列表),也可以自己使用 defface
定義自己的 font-faces。
1 | (defface test-face |
來看看複雜的例子:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16(defface highlight ;FACE
'( ;SPEC
(((class color) (min-colors 88) (background light))
:background "darkseagreen2")
(((class color) (min-colors 88) (background dark))
:background "darkolivegreen")
(((class color) (min-colors 16) (background light))
:background "darkseagreen2")
(((class color) (min-colors 16) (background dark))
:background "darkolivegreen")
(((class color) (min-colors 8))
:background "green" :foreground "black")
(t :inverse-video t)
)
"Basic face for highlighting." ;DOC
:group 'basic-faces)
一般是不用到那麼複雜。
SPEC 的格式是:1
((DISPLAY . ATTS)...)
用來定義終端機內有限顏色時如何顯示。有三種可能:default, t 或一個 list(上面的例子就是 list),我覺得這太麻煩了就沒理他,有興趣的可以看 C-h f defface
與 Defining Faces - GNU Emacs Lisp Reference Manual。
真正用來定義 text properties 的部份,截至 Emacs 24.3 為止,可用的 ATTS 有 :width
, :height
, :weight
, :slant
, :underline
, :overline
, :strike-through
, :box
, :foreground
, :background
, :stipple
, :inverse-video
, :inherit
。關於各項 ATTS 詳細說明請看 Face Attributes - GNU Emacs Lisp Reference Manual。
可以使用 :inherit
直接抓現有的 face 來套用。例如 markdown-italic-face
就直接抓了 font-lock-variable-name-face
套用上去,然後再自己加上 italic:
1 | (defface markdown-italic-face |
定義完 face 後,給 text 加上 property 有幾種作法:
以及移除 property 用的
以下所有的測試,請注意要在
fundamental-mode
(純文字)下,不然輸出的顏色可能會被目前的 mode 蓋過去而無效。
(put-text-property START END PROPERTY VALUE &optional OBJECT)
給 text 賦予單一屬性(PROPERTY)。PROPERTY
和 VALUE
,前者為屬性,後者為值。 如 'bold t
或 'face 'font-lock-preprocessor-face
START 和 END 為 position,如果輸入的 OBJECT 是 variable,position 會從 0 開始算,
如果缺乏 OBJECT 或者是 nil,會抓目前 buffer 作為 OBJECT。
(add-text-properties START END PROPERTIES &optional OBJECT)
給 text 同時賦予多種屬性(PROPERTIES)。
用 list 來表示多項目,如'(bold t italic t)
。
其餘事項同 put-text-property
。
1 | ;; GNU 文件的範例 |
注意兩者的 prop 用法差別:1
2
3
4
5
6
7
8
9;; add-text-properties
(let ((s "Shirohime Kanata"))
(add-text-properties 0 (length s) '(face font-lock-preprocessor-face) s)
(insert s))
;; put-text-property
(let ((s "Shirohime Kanata"))
(put-text-property 0 (length s) 'face 'font-lock-preprocessor-face s)
(insert s))
- 以上兩者的回傳值皆只有
t
或nil
:「成功加上了」和「沒加」兩種意義。- 是直接改 variable 的值(所以輸入必須是 variable 不能是 string,不然會爆掉),是有副作用的 function。
propertize
:1 | (propertize "String" |
- 這種方法最簡單,可以用直接用 string 作為輸入,不需要 variable。(因此他也不會改 variable 的值)。
- 直接吐給你上好了顏色的字。
- 可以同時放一堆屬性。
為了更方便地在 Emacs 裡寫 Markdown,先前有用過 url
來自動插入網頁連結的 <title>
。但寫 blog 一直有個讓我很感頭痛的事情,就是貼照片。不知為何不管是 Flickr 還是 Picasaweb,對於「取得照片的 raw link」這件事都做得非常不方便,而且常常界面一改版,連 raw link 在哪都找不到。
要在 Emacs 上使用 HTTP GET
,請看這一篇。
GET
就可以拿到你要的東西。我想稍微看看應該就知道怎麼用了,總之來個範例最快,把這行貼到瀏覽器裡試試:1
https://www.flickr.com/services/rest/?method=flickr.photos.getSizes&photo_id=11638695064&api_key=你的 API key
Private photo 是無法只靠這樣就抓到 raw link 的,好像是需要 OAuth。(不過一般也不會貼 private photo 吧?好像沒有太大必要做這個(耍懶中))總之以後再看看要怎麼做。
拿 Flickr 搭配 Emacs 和它內建的 url.el
,只需要按 C-c i f
後,貼上:1
http://www.flickr.com/photos/41522078@N05/11529799266/
就會跳出一個 minibuffer,問你要多大尺寸的 raw link (可以用 tab completion):
選好後,如果目前 major-mode 是 html-mode(或者強迫使用M-x flickr-insert-html
)就會吐給你:1
<a href="http://www.flickr.com/photos/41522078@N05/11529799266/"><img src="https://farm8.staticflickr.com/7420/11529799266_4e391575b0_z.jpg" alt="" class=""></img></a>
Org-mode 則會吐出:1
[[https://farm8.staticflickr.com/7420/11529799266_4e391575b0_z.jpg]]
Markdown-mode 則會吐出:1
![](https://farm8.staticflickr.com/7420/11529799266_4e391575b0_z.jpg)
我們在連續貼圖時,通常不會一直改圖片大小,而是希望所有圖片尺寸同個尺寸。這時你可以設定變數
flickr-default-size
的值,例如 ,就不會每次都問你要什麼尺寸。當你要的尺寸不存在時,才會再主動問你要什麼尺寸。
- 可以使用
M-x
flickr-set-default-size
來互動式地更改flickr-default-size
的值。改成 nil 代表沒有指定。
(setq flickr-api-key "YOUR_API_KEY")
。1 | ;; Flickr |
以下為純筆記。
replace-regexp-in-string
去掉。downcase
把所有字母改成小寫(方便輸入也避免混淆)。使用 list
把 size 和對應的 raw links 組成清單:
1 | (list 'a 'apple) |
再用push
把一對對的 lists 組成assoc-lists。
1 | (setq fruit '()) ;'()表示空表,就是 nil |
1 | (assoc 'a '((a apple) (b banana) (c cat))) |
範例如下:1
2
3
4(completing-read
"Complete a foo: "
'(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4))
nil t "fo")
不過這個當然還是沒有 Logdown 或 Github 的編輯器那樣方便,只要把圖片拖上去即可自動上傳,又可以用 markdown,那設計真的太帥了。不過經過這篇文章的設定,一樣可以開心的使用 markdown 貼 Flickr 圖片。
說到網路相簿,其實目前我覺得界面做得最簡單明瞭又好用的是 imgur.com,直接一鍵拷貝圖片的 raw link,但 imgur 上的圖只要半年沒人看就會砍掉…
url.el
,可以拿 Emacs 處理 URL,像是拿來抓天氣預報這類用 markdown, org-mode 寫東西很方便,但插入網頁連結就有點麻煩(例如[Title](Link)
),因為貼上 URL 後還要自己輸入標題,這裡就可以用 url.el
來自動抓網頁的標題,這樣就只需要貼 URL,就能自動吐[Title](URL)
給你。很方便的:D
Org:
[[http://www.gnu.org/][The GNU Operating System]]
Markdown:[The GNU Operating System](http://www.gnu.org/)
HTML:<a href="http://www.gnu.org/">The GNU Operating System</a>
Twittering-mode:"The GNU Operating System"( http://www.gnu.org/ ) //
這個功能需要用到html-entities-convert.el,請先安裝好再使用。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87(require 'url)
(require 'html-entities-convert)
(require 'org)
(require 'sgml-mode)
(require 'markdown-mode)
(require 'recentf)
(add-to-list 'recentf-exclude "/tmp/url-retrieve-.+")
(defun url-get-page-title (url)
(let* ((temp-file (format "%s%s" "/tmp/url-retrieve-" (random))))
(url-copy-file url temp-file)
(find-file temp-file)
(goto-char (point-min))
(re-search-forward "\<title\>\\(\\(:?.\\|\n\\)*?\\)\</title\>" nil :no-error)
(setq url-gotten-page-title (html-entities-convert (match-string 1)))
;convert html entities
(setq url-gotten-page-title (replace-regexp-in-string "\n" "" url-gotten-page-title))
; remove \n in title
(kill-buffer)
(delete-file temp-file)
(format "%s" url-gotten-page-title)
(message (format "%s" url-gotten-page-title))))
(defun insert-link-with-title ()
"Insert link along with title (grabbed via url).
Format is determined by what major mode is being used currently.
Currently support: Markdown/Org/HTML/Twittering
If in beginning of a line, insert a - prefix as a list. For example:
Markdown:
- [The GNU Operating System](http://www.gnu.org/)
Org:
- [[http://www.gnu.org/][The GNU Operating System]]
"
(interactive)
(let* ((LINK (if (boundp 'LINK)
LINK
(read-from-minibuffer "Page's URL: ")))
(TITLE (if (boundp 'TITLE)
TITLE
(url-get-page-title LINK))))
(cond ((eq major-mode 'markdown-mode)
(if (not (equal 0 (current-column))) ;if not in the beginning of line,
(insert (format "[%s](%s)" TITLE LINK)) ;insert "[title](link)"
(progn (insert (format "- [%s](%s)" TITLE LINK))
(newline)))) ;or insert "- [title](link)" and new line.
((eq major-mode 'org-mode)
(if (not (equal 0 (current-column)))
(insert (format "[[%s][%s]]" LINK TITLE))
(progn (insert (format "- [[%s][%s]]" LINK TITLE))
(newline))))
((eq major-mode 'html-mode)
(insert (format "<a href=\"%s\">%s</a>" LINK TITLE)))
((eq major-mode 'twittering-edit-mode)
(insert (format "\"%s\"( %s ) // " TITLE LINK)))
(t
(let (major-mode)
(setq major-mode (intern (concat
(completing-read "Select a format: "
'(("org")
("markdown" )
("html")
("twittering-edit"))
nil t "" )
"-mode")))
(insert-link-with-title)))
)))
(define-key markdown-mode-map (kbd "C-c i l") 'insert-link-with-title)
(define-key org-mode-map (kbd "C-c i l") 'insert-link-with-title)
(define-key html-mode-map (kbd "C-c i l") 'insert-link-with-title)
;; If twittering-mode has been installed and loaded.
(when (require 'twittering-mode nil 'no-error)
(defun twittering-share-link ()
"Share link with twittering-edit-mode buffer,
and insert page's title automatically.
If major-mode is already twittering-edit-mode, insterting
directly without opening a new buffer."
(interactive)
(if (not (equal major-mode 'twittering-edit-mode))
(twittering-update-status-interactive) nil)
(insert-link-with-title))
(define-key twittering-edit-mode-map (kbd "C-c i l") 'insert-link-with-title)
(define-key twittering-mode-map (kbd "C-c i l") 'twittering-share-link))
在 org-mode
, markdown-mode
, html-mode
或twittering-mode
任一 mode 中輸入 C-c i l
,並貼上 URL,就會自動吐出符合該 mode 的網頁標題連結。
以下是實作細節。
url retrieve 也有分 url-retrieve
和 url-retrieve-synchronously
兩種,分別就是 asynchronously 和 synchronously,請 C-h f
參考 Emacs 內建文件並看下面的範例。
(url-retrieve URL CALLBACK &optional CBARGS SILENT INHIBIT-COOKIES)
這個是 asynchronously retrieve,需要加上 CALLBACK
告訴他抓完了要作什麼事情。這裡可以定義一個函數並用 quote
表示,或直接用 lambda
匿名函數。
1 | (let ((url-request-method "GET") |
(url-retrieve-synchronously URL)
1 | (let ((url-request-method "GET") |
一開始都不知道到底該如何切換到含有
url-retrieve-synchronously
抓下的內容的 buffer,搞了很久我才發現url-retrieve-synchronously
的回傳值就是 buffer 的名稱…直接用(switch-to-buffer)
切過去就可以了。
我是沒找到有人提供類似工具,不過有了這個 HTML/XML Entities 列表,要做出來就變得很容易。
安裝 html-entities-convert.el 即可。使用方法:(require 'html-entities-convert)
後, (html-enetities-convert ">\;")
,就會吐出 >
給你。
有時 <title>...</title>
之間會被插入換行,請參考這篇。
函數名差太多很難記:1
2(line-number-at-pos) ;目前 cursor 的 line number
(current-column) ;目前 cursor 的 column number
有了這個,就可以在插入 markdown link 時,檢查是否在行首,如果在行首就多插入一個
-
。(比較符合我的使用習慣,如果你不喜歡,可以把那個 if 判斷式拿掉。)
這次是編碼問題。去抓 http://d.hatena.ne.jp/ 上的內容時,會發現日文無法正確顯示
原因似乎是 http://d.hatena.ne.jp/ 的所有內容都是 EUC-JP 編碼,而之前可以成功抓下來的都是 UTF-8,這個問題似乎無解(至少我沒找到)…。嘗試過了幾種方法:
(encode-coding-string STRING 'euc-jp)
處理。(decode-coding-string STRING 'euc-jp)
處理。(set-buffer-file-coding-system 'euc-jp)
。不過恭禧,三個都無效 XD
我對編碼沒有概念,所以之前遇到這種問題也只會
revert-buffer-with-coding-system
,只會使用但並不了解原理。Emacs 資源大多還是以處理英文為主,遇到這種 i18n 方面的問題,日文資源應該算最多的(不知為何日本好像很愛用 Emacs),但我還是沒找到此問題解決方法…
然而偶然發現一個奇怪的現象:如果把 url-retrieve
的 buffer 直接 C-x C-s
存檔、kill-buffer
後,再去開那個檔案,Emacs 竟然可以自動辨識編碼且正確顯示內容,問題是我真的不知道 Emacs 到底是用甚麼方法去辨識的,所以…目前看起來只能這樣了。
使用 url-copy-file
,直接把整個 html 檔下載到/tmp
等等,啊前面搞那麼久都在幹麻…orz 啊,這就是人蔘啊。 ,然後直接打開那個檔案做你需要的操作,結束後再用 delete-file
刪掉。
我好像一直在寫一些很沒有水準的東西(掩面)。
現在寫 Markdown 連結輕鬆多了,不過還有一個很想要但好像也沒人做的功能,就是插入 flickr 的 photo raw link。不過目前我完全不懂 API 那些東西…有空再看看能怎麼作吧?・ω・
]]>即使是用 regexp 抓文件中的 <title>...</title>
這麼單純的事情,還是會遇到例外,像是 http://code.google.com/p/ergoemacs/source/browse/packages/xfrp_find_replace_pairs.el 這個頁面的<title>...</title>
被很神經病地加上了好幾行換行,如果只寫 <title>.*</title>
就會抓不到。因為 regexp 是以「行」為處理單位,所以寫.*
只能抓到「一行裡的所有東西」。
Javascript regexp 抓多行的方法是:1
"(.|\n)*?"
Emacs regexp 大同小異,除了那多到爆炸的反斜線以外:1
"\\(?:.\\|\n\\)*?"
\\(PATTERN\\)
表示一個 group- 夾在它中間的
\\|
表示 or- 所以
\\(.\\|\n\\)
表示「任何字元或\n」\\(?:PATTERN\\)
是 group 的一種特殊形式(我不知道其他語言中的 regexp 是否有這種東西),叫做”shy group”。他是一個 group,但是不會被match-string
抓到,也就是說當你只是要「純粹使用 group」而不需要「用match-string
抓 group 內的資料」的話,就可以使用這個。- 最結尾的
?
表示 “non-greedy”,只抓最小符合結果。因為 regexp 的設計都是會抓「最長的符合結果」,可以試試看把這裡的?
去掉,他會一路抓到檔尾。通常我們要抓多行應該都是希望他抓最小符合結果。
我自己目前是用這個方法,但每次寫都覺得這根本是巫術…不過在 Emacs Wiki 上面還有看到 Emacs regexp 有一個更黑魔法的方法:
1 | "[\0-\377[:nonascii:]]*?" |
這個我就不懂為何可以表示「包含換行的所有字元」了…不過看起來反斜線比較少比較乾淨 XD。
更多詳情請看 Regexps - GNU Emacs Manual 和第二頁Regexp Backslash,裡面有完整的 Emacs Regexp 列表。
]]>我有種毛病,就是寫東西時什麼都想寫進來、超愛離題、不知取捨,結果就是寫得亂七八糟…姑且不提。
總之,還是把今年覺得比較重要、或印象深刻、值得紀錄的事情稍微排序一下:
去年(2012)的暑假的尾聲才終於搬家到金瓜石,不久就開學了,所以這是第一次好好的體驗住在這地區的感覺。當然住在這裡要半夜找宵夜這種事就辦不到了,最近的 7-11 要開車,或爬樓梯 25 分鐘 XD。
除此之外就是網路很慢又容易斷線,常常會讓人有種回到撥接時代的感覺。(現在是不是提到「撥接」也開始會透露年紀了啊…)
平時生活圈跑到瑞芳這了,不過搭車蠻方便的,下山到瑞芳車站才 15 分鐘,可能比台中方便吧 XD。走到瓜山國小搭車。話說那校門口的新招牌實在很難看。
其實挺喜歡瑞芳市區(火車站周遭)這個地方的,生活機能還不錯,而且很袖珍,對我這種看到過多人群擠在一起就反胃的人來說,是可以接受的人群密度。
在家裡總算有機會可以做些外宿沒辦法做的食物。
做了家人的生日比薩。
生平第一次參加遊行。
是因為我個性討厭賭注的關係嗎?約從小三小四開始懂點事、了解何為核電(及其事故)以來,就一直對核電抱持絕對反對的態度,且越理解越反對,尤其是核四。因我不知這世上到底有多大的理由或效益值得去這種冒險。雖然我是很喜歡 Pripyat 啦(如果可以甚至想去那裡旅遊),但我一點也不希望台灣有地方變成那樣。所以恕我直言,我真的無法理解支持核四的人到底都是抱著怎樣的心態。
不過後來發覺,反核擁核兩邊我看雙方都有「不少」謊言與扭曲的資訊,只是多寡爾,都無法完全信任啊…所以…我還是閉嘴比較好嗎?之前有大記元的人(似乎是義工)跑到學校宿舍裡,問我對大記元的看法,我回「你們常常拿一堆未經查證的資料來反共,例如馬克思的成魔之路裡的那堆資料,即使我想支持你們也沒有立場啊」。
我發現似乎只要是經由人之手,就永遠得不到真相。離你這麼近的新聞都不可信,(何況歷史?)說了什麼只是等著又有人拿出真假不明的反駁資料來被打臉,然後又打回去、再打回來;我想退出了。人只要多到某個程度,裡頭就不會有客觀且無謊言的事實陳述,那這樣對事情判斷是非再發表看法還有什麼意義?根本辦不到。有種被當白痴耍的感覺。
今年四月初開始學 Lisp,這可能是我第一個勉強能夠算是會使用的程式語言。主要原因當然是為了 Emacs(不然學 Ruby 可能用途會廣很多)。講是這樣講,只能說我根本還是不懂 Lisp,概念建立得亂七八糟,像是我到現在還是不懂 (cons 'a 'b)
=> (a . b)
中間自己冒出來的那個點是什麼鬼東西,這種概念建立對我來說很難又考驗耐性,隨隨便便五六個小時就過去了…。寒假再來繼續讀。
雖然是這種半吊子都稱不上的 Lisp 能力,至少現在要自訂 Emacs 確實比以前輕鬆多了。不過我很想知道,一個使用 Emacs 的程序猿通常要花多少時間學習 Emacs 本身,學習這類事情簡直是時間的黑洞。應該是我慧根不夠吧,學得太慢。用了快兩年,雖然現在幾乎用他完成一切文字編輯事宜,也用得很爽,但要寫個功能或找個功能我還是得常常停下來看文件,而且越看越不了解 Emacs 到底在搞啥鬼,學了以後反而覺得自己什麼都不會。寫個簡單的功能也得一直查文件,也是常常四五個小時就這樣過去了,可是就忍不住這樣做。我常常都在想,學習 Emacs/Lisp 和自訂功能的時間、與 Emacs 這個編輯器所帶來的便利與其省下的時間到底成不成比例啊…不過,根據 Wikipedia 對於興趣一詞的定義:
興趣是一種人們在空閒時享受及樂於去做的活動,通常人們不是以賺錢為目的而參與這些活動。
簡單來說,其實「設定 Emacs」這件事本身根本就已經成為興趣了嘛,即使根本就沒在拿 Emacs 寫程式。(抱頭)
學習使用 Github 和 git
。這是個只有單人操作就已經很複雜了的東西,再加上多人協作理解起來更麻煩,一邊用一邊看教學一邊問 lzh 再一邊用 org-mode 整理筆記準備以後丟上來,但到現在依舊覺得還有太多概念沒搞懂,越用越糊塗…我猜我只學會了 git 大概 1% 的功能。
而且 Emacs 裡還有一套相當變態的 git 前端叫做 magit
,操作也要另外學。然後為了可以輕鬆的讓別人用 package.el
來安裝,要放上 MELPA ,得去看 package 的格式、如何測試…。MELPA 還算很方便,他會自己抓 git repository,如果還要放到 Marmalade 的話更麻煩,要自己上傳 tarball…雖然有看到好像是可以拿來自動化的 API …泥馬,完全看不懂。HTTP 協定沒概念啊。
一個 engineer / SA / programmer 到底要花多少時間了解這麼多、這麼廣的東西…搞到後來真的只覺得這個世上要學習的東西也未免太多了吧,這只是一個編輯器耶…
順帶一題,我很喜歡 Github 的這個 commit calendar 設計,時常提醒自己日子過得有多快。一年竟然就這少少幾格而已,一轉眼就消掉了。
因為學校課程關係,七月一整個月去實習。我沒有打工過,這是第一次較深刻的體會到,工作是怎麼一回事。
我到現在還是對於自己能做什麼感到極度不安。
碰太多,什麼都不精通。
某咖啡館大老闆說:「假如 16 條閉路電視的線在關鍵時刻同時跳線這種機率你都要人民接受的話,那實在沒理由跟我們說核電很安全…」突破盲點啊!(via @ryo6)
軍、警、調查局第一個需要改革的就是學長學弟比梯次的惡習,如果是一陀大便哪有什麼資格當什麼學長?去廁所當學長吧?
一直說當兵忍一下就過去的那種人就是間接導致洪死亡的人。(via @Muser)
回想起來寒假都沒往外跑,窩在家裡當宅砲,暑假總算跑出去。
超神奇的「基督教長老教會 金瓜石佈道所」!不知什麼年代的,現在建築物看起來已經沒人在用,不過從門縫看進去,裡面似乎還不算太糟,記得裡面好像還有看到聖誕樹 XD。
太子賓館真的很漂亮。還好這裡算山區,犬螟襠的爪牙比較伸不到這,同為日治古蹟就沒有遭遇跟基隆火車站相同的毀滅命運。
去看牙醫,結束後順便去剛竣工且搞不清楚興建用意的科科館上面亂走了一圈。
欽賢國中離家裡很近,不嫌累的話走路就可以到,但一直沒有去看過,這個暑假才終於去看了。真是間很神奇的學校,位在金瓜石九份交界的山腰上,教職員大概比學生還多,視野超棒,加上老舊的建築物真是超對我胃口的。猜猜看下面這間是啥:
竟然一整棟都是校長宿舍啊 wwwww 真是太有帝王霸氣惹 wwwww
人數這麼少的學校在海邊(濱海公路往福隆方向)竟然還有「鼻頭角分校」XD,校舍內還有點 Pripyat 的感覺
濱海公路真的很美,可能是因為從小看到大所以對於這地方比較熟悉才會私心地喜歡這個地方,即使東北角老在下雨,不過我還是很愛在下雨時待在室內的感覺紈褲子弟過得太爽了是吧。在台中唸了兩年多的書,我還是無法喜歡上這個城市。雖然本身就討厭城市和人多的地方也是個原因。
暑假終於才去了解 HTML 和 CSS 的概念…真的是晚得可以。CSS 是個非常令人振奮的東西,簡單的語法就可以做出以前一直覺得很神秘而無法理解的網頁排版,真的應該早點學的,為什麼我以前這麼又懶又笨…。
Hexo 是個很恐怖的東西,台灣一位高中生做出來的靜態部落格框架…高中生!實在太厲害了,到底為什麼可以這麼厲害…,而且跟 jekyll 相較之下很好操作學習,修改好 CSS 後就沒太多需要設定的地方了,於是開心地把 Blogger 給扔了,改用 Hexo 寫部落格。可以完全使用 Markdown 跟 Emacs 寫文章真是太爽了,幾乎就不再需要把時間花在調整內文的 layout 上。。
好快又三上了…詳見此篇
蔬菜要每天澆水除草除蟲,很磨耐性。採收期其實也不是太愉快的事情,反而體驗到農夫的產銷壓力(即使只有不到二十顆),而且把植株拔起來實在很捨不得…QAQ 現在有種體會,就是在工商業為主的社會,政府的存在對於農業有多重要,沒有農業政策的話我想應該很難出現農業個體戶,光產銷壓力就很恐怖了。
看過花椰菜開花嗎?(注:我們平常吃的只是花蕾)
後來帶了十二棵花椰菜回家,還有一顆跟人交換蔬菜,兩顆留著實驗看開花長啥樣,剩下五顆自己吃掉了。
回家總算親眼看到新成員了。今年八月,從小一陪伴我們家到現在的咪寶死了(就是我一直拿來當頭像的這隻)。前陣子家人去動物收容所發現一隻毛色一樣的灰色金吉拉,決定收養,取名米豆。
(相片裡的人可不是我啊!)
因為花卉實習場離學校有一段相當的距離(單程 8KM 左右),我又不會騎機車,所以一律騎腳踏車去。去那其實也只是除草喵的以後自己種這種作物一定要蓋塑膠布防草防失水…。澆水施肥,實在有點不符時間效益 orz。
但騎過第一次只覺得台中的馬路實在很危險,橫衝直撞的摩托車跟公車讓人騎起來壓力很大。最後只好都早上三點四十起床,五十分出發,慢慢騎到那裡差不多四點三十左右。
我不喜歡台中,少數例外是凌晨沒有人也沒有車時的街道,而且可說非常喜歡。
半夜除了便利商店和藍藍路,就只剩早餐店能吃了。我說才四點這根本是賣宵夜的吧…(雖然我幾乎每趟都買)
翻了一下照片,學期初到現在騎了六趟而已。
不過我種的彩葉草長得實在慢到炸翻…
而且還被土撥鼠襲擊惹 www
安全起見,天破曉後六點前一定要啟程回去以免腳踏車變回南瓜;六點半開始是上學交通尖峰期,路況恐怖。
十一月重新學習 org-mode 這個鬼東西,之前只用了 Org-mode 的少少幾個功能就已經覺得很好用了,可是他的其他功能還多到爆炸,例如 agenda。Emacs 本身已經根本就是個 OS 了,org-mode 則是 Emacs 的殺手級套裝軟體…
Org-mode 的 agenda 實在太複雜了,我還沒完全弄清,筆記亂七八糟,為什麼可以想出這麼神奇的工具… org-mode 中有內建一種計時功能,於是我開始拿來「實踐《奇特的一生》」,感覺挺有趣而令人警惕的。目前繼續實踐中。
在社團總算認識了一位有辦法聊天聊得非常開心的人。喜歡古典的人少,有辦法聊的就更少。
系上也有遇到一個能聊的人,算是一點小收穫吧。
因為蔬菜學每天都要去澆水除草,所以也比較常跟人講講話,一邊除草一邊隨便聊。不過我想我還是那種很多人會討厭的人吧,多少能感覺到有些人並不怎麼歡迎我,搭話被無視,還是只是因為我是外系的關係?誰知道。不過人際關係大概就是這樣,倒是常常跟一位助教聊得很開心,這點也是個收穫吧。
原本學期初發下豪語說三上這整個學期要隨機抽十首貝多芬鋼琴奏鳴曲貝多芬的鋼琴奏鳴曲被譽為是鋼琴奏鳴曲的聖經。來練(視奏+技巧練習+觀摩作曲手法),最後卻只練了五首…而且一首還不是貝多芬的。
Beethoven Sonate No .6 (Op. 10 No. 2) <=早期作品,出乎意料的精彩,演奏起來好像交響樂的音色。我非常喜歡這首,可能勝過大家最愛的月光吧。月光我倒沒啥感覺。
Beethoven Sonate No. 26 (Op. 81a) <=「告別、不在、重逢」三樂章,這個真是超對我胃口的,愛死惹…QAQ
Beethoven Sonate No. 16 Op. 31 Nr. 1 <=彈了沒啥印象。順過一兩遍而已。
Beethoven Sonatine No. 25 Op. 79 <=小品挺不錯聽。
Schubert Sonate D. 960 <=亂入的舒伯特 D960(舒伯特真的是天才啊…QAQ)
以及不是奏鳴曲的:
J.S. Bach Piano Concerto No.2 BWV1053 Movement 1 <=喜好關係,只練第一樂章。一直非常喜歡這首,順利的話下學期要跟弦樂團演奏,了結一個心願。
Rachmaninoff Piano Concerto No.2 Movement 1 <=找死,完全找死,想也知道練不完。不過能夠演奏這首是我的其中一個夢想。
Alkan Piano Concerto for Piano Solo Movement 3 <=找死,當然也沒彈完。
就我的理解,練起一首曲子的過程,大概可以分成三階段:
- 大略看譜後,視奏
- 分析、了解架構外,不斷地練習到手指能夠「記住」曲子(手指「記住」了,才有可能彈得順暢)。
- 在第 2. 時除了把曲子記起來外,同時慢慢修正「詮釋」的方法。
其實以上我大概都只做了第一步而已吧…主要是記性實在太差、耗下去其他事都不用做了。現在視奏跟以往相較之下還算不錯(至少是舍妹再也無法嘲笑的程度),但要到「熟悉、記住」還是要花比正常人多出「許多」的時間…而且不管我多認真練、架構有多熟悉,可以從頭哼到尾,就是沒辦法背著彈出一整首。就跟我記人的長相的能力一樣爛,我真的不知該如何跟別人解釋這困境。我有點想去找精神科醫生…
之前還發下更白爛的豪語,要丟出一冊作品集。然而事實是,雖然應該算是有在花時間作,有時十一點開始寫就忍不住一不小心寫到天亮,但這學期依舊根本連一首新曲都沒寫出來,片段永遠接不起來。寫得又慢又少又不完整,整個跟廢物一樣。這幾天則是不斷感受到語意飽和(Semantic satiation)的現象:不懂為何人類會「覺得某段旋律很好聽」或許這就是我一直不懂的現代音樂在搞的東西?以前很討厭,但最近聽 Prokofiev Piano Concerto No.5 超讚的啊 QAQ,… 雖然早已知道自己的最大問題點了:放不開。一直擔心這樣不夠好、那樣也不夠好,搞到後來做出來的反而更沒水準,不過我從上大學到現在一直如此。到克服這點之前,沒什麼好說的。
「優柔寡斷」實在很適合拿來形容我的行為…做事不懂取捨。寫個報告都分不清哪些該寫哪些不該寫(我常常會把雜七雜八的感想寫進去),有很多方法可以達成一件事時,反而不知該怎麼做。什麼都想作,什麼都想寫、最後的結果就是寫不完。我分不出輕重,或說我無法有所取捨,到便利商店也可以猶豫老半天今天午餐要吃什麼,猶豫下一個該寫什麼音、猶豫這裡該畫什麼…誰來幫我斬斷一下魂結啊 orz
之前在 IRC 聽到某位大大講,「寫程式不可能無限的容錯」,這句話對我來說可以套用在幾乎所有事情上。
今年幾乎沒有看書,不過 RSS 倒是一樣每天看。像是劉育志醫師的文章非常棒,幽默諷刺又有省思,看了收穫良多;同樣也是醫師的 Lisa Liu 的文章也是。看了這些台灣醫師的文章也都很羞愧。自己學習並沒有他們那麼累,但我卻比他們愛抱怨和自怨自艾。
抱怨和煩惱在大多數情況下實在無法解決什麼問題,這點即使知道依舊不好做到。還是儘量帶著愉快的心情多做點事少說點話吧。
年末的這幾天不斷覺得我以往所認識的世界不斷在瓦解,而我似乎是處在種不知哪跟筋不對或哪個開關被打開了的情況下,恰巧能夠把瓦解了的認識拼回去,但是拼回去的依舊是同個世界。無限切割一顆橘子再拼回去並沒有變成兩個橘子。希望這一切並不是快瘋掉了的症狀。
我才赫然發現,我解釋不出來一首曲子為何我覺得好聽、一個人為何叫做長得好看(這個我從以前就一直沒有概念到底什麼叫長得美或帥,大家稱讚的我卻幾乎沒有共鳴,可能跟臉盲有關?)。硬要一個解釋,我大概只能回答「老子/老娘喜歡就好,為何還需要找理由?」。
解釋真的很困難。我最怕的就是「請解釋你的計畫理念」…我覺得:「我根本從來就沒有什麼計畫理念」。我開始覺得世上或許本來就沒有「客觀且合理」的計畫理念存在。聽別人講他的理念也常常搞不懂他幹麼這樣想,或者聽得全身雞皮疙瘩掉一地,但就是規定要寫。就算我難得終於能夠把計畫理念講得讓別人聽得覺得很合理又很開心,其實那些都只是我在鬼扯,只是別人以為很合理而已。
「沒有事是絕對的。」
「但是這句話就是絕對了吧?」
這種論調我個人覺得是詭辯,話裡挑骨頭無限制的探討下去的話,似乎常會變成純粹找麻煩。
「早安。」
「早是幾點到幾點?」
雖然現在講話我會很留意自己用到「絕對」判斷的地方,但說實話很累。我覺得我在自找麻煩。
最近就是有這種問題,聽到一句話我會不斷鑽牛角尖,想這句話是不是有其他意思、講出的這句判斷句是否有例外之類的蠢事,煩死自己。其實以前就會這樣,只是最近狀況特別嚴重。
我一直以來都非常討厭達達主義,因為覺得我一直覺得杜象的「下樓的裸婦」畫得真是爛透了,不過現在我也不懂為什麼我覺得它爛了。那是完全沒有意義的假藝術。現在我卻發現,我連「意義」是什麼都不知道,更講不清。開始覺得達達主義有意義了,就是在質問你何謂意義。意義只是人賦予的,意義根本就不是能夠說的東西或者存在的事實。發現這點後,有點崩壞了的世界似乎反而變得比以前更明白一些些了。
暫且記下這些意味不明的東西,看看以後的自己回頭讀會有什麼想法。
要就此打住了,花太多時間搞這篇了。
即使一個人 FB 上可能好友上千,但之前看過某篇文章只記得好像是泛科學上看到的,人能夠記住且投注心力的人據說頂多約 150 個左右。我記性差,要砍掉到剩五分之一左右吧。
我好像還沒好好地列出一個清單過,至少提醒自己,我還是活著的。
感謝所有身邊的好友與幫助或指正過我的人們。
感謝暑假實習時的辦公室裡的人們,我啥都不懂也願意撥空教導。
感謝 yoxem, iigmir 和 sntc06(還有 aso.+),推聚和你們聊天很愉快。iigmir 先前指出我的一些盲點;yoxem 大很有趣,可惜這學期明明這麼常去葡萄中心卻一直沒機會見面再聊聊。
感謝 Pingveno,網路上認識的人中認識最久且現在還有聯絡的,常常聽我講一堆奇奇怪怪的東西,還有之前送的日文練習帳和 ubuntu 貼紙 XD
說到認識很久的人,還有大肚仔,國中同學中目前唯一還有聯絡的,暑假傳給我遙仰鳳華和一堆 Galgame 的安裝檔真是損友 XD 希望有機會再聊聊。
感謝 letoh 大神在 IRC 上熱心地教我這種超肉腳寫 Lisp 和解決一堆疑惑 w。
雖然您絕對不知道我,但實在感謝 jserv 宅色夫的 tweets、文章和演講錄影尤其在趕無趣作業時一邊聽很是幸福,真是超感性的程式設計師(他真的是程式設計師嗎?我覺得根本是作家或哲學家等級了啊 XD),每次聽都有很多感觸,真的非常喜歡。如果大學裡多點這種老師就好了。
感謝 Fall Cicada 在升學以及大一時的許多指引,但最近實在太少講到話了,看來執教鞭很忙,祝快樂。
感謝 Claudia 和 Ning,看你們搭腔很有趣,祝開心。
感謝學校的 Hwan 和 Jya,以及社團的 Xing,和你們聊天吃飯聊音樂很愉快。
即使您應該對我沒啥印象,不過還是感謝 zhusee2 您先前在 Twitter 上有如醍醐灌頂的直言,讓我看見自己的無知,這是我很期待但鮮有的事情。
上面可能還有一些遺漏沒列出來的,抱歉了。
感謝小花和莉雯兩位,你們人很好也很有智慧,也願意聽我講一堆有的沒的,感謝你們願意作我的朋友。
感謝高中班導阮惠莉,怎麼會有這麼好的老師,還好在高中遇到了,即使已經畢業遇到問題還是能夠回去商量事情,實在非常非常感謝。
感謝 Timothy Lin (lzh) ,能有你這位好友是我上輩子的福氣(然後感謝你這麼不厭其煩教我 git XD),祝你去美國交換生順利。
最後,感謝我的父母,這個太多講不完了。
學無止盡。舊年快樂。
]]>發現自己正處於一灘渾水時,能夠逃離就逃離或許是比較好的方法。除了有時可以訓練自己的邏輯能力與整理自己的看法外,其餘時候往往是浪費時間(尤其是還有其他事想做時…)。有時或許就有人會用你面對白爛事時難耐的心,讓你花費大量時間在其中。
另外這絕對不是什麼警世通言、喻世明言、或書店最愛賣的「for 給 i 的 i++ 個忠告」,我沒有那種能耐,而且好幾項其實就是在說我自己。
對於其中模糊的分類標準,放輕鬆,請不要太認真。
[2013-11-09 土 18:40] 開新檔案
[2013-12-23 月 06:36] initial deploy
libchewing
蠻不順利的,一波好幾折,相當混亂,趕緊記下來以免以後又遇到類似問題又得再摸索一次…直接跳到安裝部份請按我。被據說變得非常順暢且 Bug 274931 好像已經修好了的 KDE4.11 吸引、以及 Evergreen 長期支援版的光環、且聽到都是挺不錯的口碑,於是前天動手把 openSUSE12.3 升級到 13.1,沒想到卻是個頗災難的過程,而且都是些沒有預料過的問題,例如新酷音 (chewing) 就爆掉了…。
在寫這篇之時,openSUSE 13.1 裡面的 libchewing
版本是 0.3.5,但這版本的選字似乎有問題,選字的正確率大幅下降,而且還會選出一堆沒看過的怪字:
我發現錯字剅要(都要)訓練>=3 次纔能(握靠纔能這種古用法 XD)成功逼褟選出正確的自,看起來是根本不鳥我之前的就詞庫(
~/.chewing/udash.dat
)…可是我沒有棟褟才對。…真是吐寫又再亂選字了,棟褟是啥鬼東西我應該從沒選過這種慈才對。
之前用 0.3.4 是正常的,所以看來只能手動降級了。但一開始直接抓 chewing 的原始碼下來編譯卻讓 fcitx 一直沒辦法正確啟動…完全不知該怎麼辦好。
1 | git clone https://github.com/chewing/libchewing.git |
[純筆記] 上面第四行也可以用
ccmake .
,會跳出比較友善的 editor 讓人編輯,再把CMAKE_INSTALL_PREFIX
的值手動改成/usr
。
1 | (INFO-2381 /home/abuild/rpmbuild/BUILD/fcitx-chewing-0.2.1/src/eim.c:104) Chewing storage path /home/kuanyui/.config/fcitx/chewing/ |
幸好有大神,lzh9102 的說法是:
昨天程式 crash 的錯誤訊息代表它存取到錯誤的記憶體位置,這樣的狀況經常是因為 library 和 caller 的版本不合。我昨天都假設是這個原因,但是今天我發現不是這個問題,追蹤程式碼後我發現是因為
/usr/lib64/libchewing
裡面缺了檔案,所以libchewing
根本沒初始化成功。fcitx 後來用了沒有初始化成功的 chewing,所以就 crash 了。
/usr/lib64/libchewing
應該要有ch_index_begin.dat
ch_index_phone.dat
dict.dat
fonetree.dat
ph_index.dat
pinyin.tab
swkb.dat
symbols.dat
us_freq.dat
這幾個檔案,但是從原始碼安裝的不知道為什麼只有其中 3 個檔案。
發現這裡 抓的 libchewing-0.3.4.tar.bz2
可以正常編譯安裝啟動,有夠詭異…
搞了很久,後來發現原因是 cmake
會把檔案移動到 /lib
而不是 /lib64
,而 openSUSE 的 64 bit lib 會放在 /lib64
…改用 autotools
安裝就沒有這個問題, fcitx-chewing
也能正確啟動。
總之最後成功安裝的方法是…先安裝好必要的檔案:
1 | sudo zypper in fcitx fcitx-devel |
如果套件管理員把
libchewing
也一起安裝進來,記得把它移除,而且除了fcitx-chewing
以外的酷音chewing
相關套件都不要裝。
然後 clone libchewing
的 repo,checkout 到 v0.3.4:
1 | git clone https://github.com/chewing/libchewing.git |
然後編譯安裝:
1 | ./autogen.sh |
編譯&安裝好後,fcitx -rd
重新啟動 fcitx,大功告成。
幸運的是 13.1 官方套件庫內的 fcitx-chewing
本身使用是沒有問題的,直接裝下去就可以用,惟酷音的 icon 很是難看,是醜到炸翻的紅色標楷體,所以之前做了一套比較好看的自己用(請自取): 再搭配To-aru Index或To-aru Railgun主題看起來很合適。
問題在於,這個版本的 fcitx 不知什麼原因改不了 icon …以往只需要把 /usr/share/fcitx/imicon/chewing.png
取代掉即可,但現在 fcitx 好像不吃這套,不管怎麼改,跑出來的還是那個噁心的預設 icon,完全搞不懂為什麼 orz
fcitx-chewing
會安裝的相關圖檔應該有這些:1
2
3
4
5/usr/share/fcitx/imicon/chewing.png
/usr/local/share/icons/hicolor/48x48/apps/fcitx-chewing.png
/usr/share/fcitx/skin/default/chewing.png
/usr/share/fcitx/skin/dark/chewing.png
/usr/share/fcitx/skin/classic/chewing.png
但沒有一個是紅色標楷體…用 strace
(監視 system call 用) 找 “png” 或 “chewing” 都沒看到:
1 | strace -f -e open fcitx -rd |& grep 'png' |
後來直接問 fcitx 開發者:
1 | csslayer: KDE 的話在你的圖標主題裏加個 fcitx-chewing 的圖標 |
KDE4 的 icon theme 位置是在:1
2~/.icons/
~/.kde4/share/icons/
以 KFaenza 這個 icon theme 為例,我最後是丟到這: ~/.kde4/share/icons/KFaenza/fcitx-chewing.png
最後記得要到 KDE system settings 更新一下 icons theme (application appearance > icons > apply
)的快取才會生效。
此次折騰要特別感謝好友兼大神 lzh9102 的耐心協助 (worship)
[2013-12-14 土 11:30] 動筆。
[2013-12-17 火 01:01] 發布。
[2013-12-17 火 04:54] 更新 fcitx-chewing icon 安裝方法。
GUI 版的 Emacs 好看是好看,但啟動時間比在終端機裡遲緩、GTK3 也比較吃資源。而且 KDE 的工具列總是得多一個 Emacs 佔空間,加上自己算是中重度的終端機使用者,操作時希望能不離開終端機不碰滑鼠是最好。所以我自己是用終端機版的 Emacs (啟動方式為emacs -nw
) 搭配 tmux 使用。但還有不少問題要折騰,以下有一些建議設定可以參考:
最不重要的先講(不過至少對我來說這個設定很重要):讓 Tmux 裡的 Emacs 能夠有 256-color output。一當然是因為好看,二是某些功能、例如寫 CSS 必備的 rainbow-mode
需要至少 256 色才能用。
把 TERM
指定成 xterm-256color
。以 Konsole 為例:Edit Current Profile > General > Environment > Edit
後,改成下面這行:
1 | TERM=xterm-256color |
~/.tmux.conf
也需要做好對應設定(~/
裡沒有這個檔案請自行新增),加上:
1 | set -g default-terminal "screen-256color" |
沒意外的化應該已經可以在 Tmux + Emacs 裡顯示 256 色了,可以 M-x list-colors-display
測試一下。
不過在 256color 下,有很多有名的 theme 像是 Solarized 那種 low-contrast 的配色是很難看的(因為很多該顯示的顏色在 256color 下只能顯示近似值,結果有些顏色實際顯示出來根本就一樣…)。如果煩惱不知 256 色下有什麼 theme 能用的話,可以參考一下不才在下做的 moe-theme
,專為 256 色終端機設計 XD。
只有 256-color 一樣可以使用
rainbow-mode
,雖然顏色不準確,但在程式碼中還是會變得非常好辨認,起碼不會讓你覺得那堆色碼是 magic number。
修改~/.zshrc
或~/.bashrc
,加上兩個 alias:
1 | alias emacs='emacs -nw' |
第一行作用是以後只要輸入 emacs
就能開啟 CLI(文字界面)版本的 Emacs。
第二行的作用是「一開終端機只要輸入 ta
就能開 tmux,而且當已經有 session 存在的話直接 attach 進去」,會這樣做是因為如果只是平常使用,通常應該不會在 Tmux 裡開到一個以上的 session(至少我從沒有這種需要…),而且每次 detach 掉還要打一長串 tmux attach-session -t [number]
掛回來很麻煩。
(如果您已經自訂過 tmux,可以跳過這一段)
編輯~/.tmux.conf
,不存在請自行建立。
1 | unbind C-b |
因為 Tmux 預設的 prefix (C-b
)會跟 Emacs 相衝,最後找來找去發現大概只有 M-C-b
這個 binding 比較沒有相衝問題,而且在其他主機上用 Tmux 也不會太難以習慣。
然後 kill-window 我改成 prefix + k
,比較符合 Emacs 在 kill buffer (C-x k
) 時的使用習慣。
編輯.emacs,加入
1 | ;;解決 tmux 下無法切換 buffer 以及一些 key-binding 的問題 |
如此問題會少一點(苦笑)
去 Emacs Wiki 下載 xclip-mode,丟到~/.emacs.d/lisps/
裡後,~/.emacs
加上:
1 | ;; xclip-mode |
可以解決 X11 與 Emacs 剪貼簿共用的問題。
不過貼上的速度變得有點遲緩,如果不用C-y
而用滑鼠中間鍵貼上的話會超級遲緩。這我也不知該怎麼辦。如您知道解法請不吝賜教。
換到文字界面的 Emacs 後,會發現有部份原本可以使用的 key-binding 突然變得不能用了,尤其是最複雜的 Org-mode(例如 Shift+[Arrow]
、Ctrl+[0-9]
),因為這些按鍵終端機是抓不到的。
Org-mode 在設計時有考慮到這問題,所以有作了一些在終端機裡也能用的替代按鍵,可以參考 TTY-Keys。
Super
鍵(就是常說的Win
鍵)是在 X11 裡定義的,除非經過一些特殊設定,不然 tty 或 terminal 都無法辨識這個鍵,我自己是沒去折騰這個,因為太麻煩。如果你堅持要用,詳情可以查一下 StackOverflow,有人問過。
遇到其他之前在 GUI 版可以使用、但終端機抓不到的 key-binding 時,基本上你有幾種選擇:
- 開 GUI 版,
C-h k
查詢你平常按的那個 key-binding 是綁到哪個 function,再自己自訂一個 CLI 版下能用的 key-binding。C-h f
直接查那個 function 是否本來就還有其他按法。- 土法煉鋼
M-x
這一定要特別提出來講:改用 CLI 版的 Emacs 我最無法接受的就是 undo-tree
的 redo 竟然沒辦法按 C-?
,因為 terminal 抓不到 Ctrl-Shift-
開頭的按鍵。雖然 undo-tree
提供的幾個替代按法中M-_
是可用的,但 undo 按 C-/
、redo 按 M-_
實在有點讓人精神錯亂…
其實也是可以自己改成其他 key-binding,但這種很常用的東西我是盡量不改,最重要的原因是
- 在不得已的情況下,沒有慣用的~/.emacs 也不會感到有太大不便。
- Un*x 界很多地方都是可以用 Emacs-style 的 key-binding 的,例如 Bash/Zsh, less,習慣標準的 key-binding 有利無弊。(Emacs 使用者操作 Bash/Zsh 基本上跟操作 Emacs 的感覺幾乎一樣,例如我發現最扯的是竟然可以在 Bash/Zsh 裡用 kill-ring…)
所以我最後想辦法習慣了 undo 按 C-_
,redo 按 M-_
這種機車的 key-binding…(一位 Vim 使用者誠摯地表示:「怎麼這麼麻煩」)
認命吧~當你決定學 Emacs 的那天開始,就別指望你面臨的是條正常典型又合理的學習曲線 XD
改用 CLI 版的 Emacs 搭配 tmux 是有好處,但說實話真的很麻煩。不過如果你是終端機重度使用者,或者有連工作站的需求,還是得折騰一下 XD
要不…就是盡早跳到 Vim…
nav
大家都一定用 list ul
+ li
來作(我還沒看過例外),問題是我覺得根本沒有必要,不是只要顯示得出來就好?像是這樣:1 | <nav> |
用 ul 跟 li 來寫的話則是:
1 | <nav> |
其實也沒麻煩多少,但就是覺得 list 這個結構沒有必要,省略它一樣可以做到你想做的東西(例如本 blog 的 nav
部份),看這個多餘的東西感覺有點礙眼。而且用 list 寫,CSS 還要另外為 list 多寫 style 之類的東西,所以我之前都把他移掉。
不過有次需要給它加上浮動選單時就出問題了:
1 | <nav> |
然後搭配
1 | nav ul ul{ |
這兩條關鍵的 CSS 使滑鼠移上去時跑出選單。
(方便起見,我只寫了關鍵的 display,上面這些要實際使用的話還需要自行視情況調整ul
與li
的位置與外觀,例如position:absolute;width:200px;left:-10px;z-index:999;background-color:#eee;color:#333;
)
但是由於我之前自作聰明把ul
和li
移掉,要寫選單時寫不出來(沒辦法觸發:hover,或者觸發得亂七八糟),a
裡面也不能再包多層標籤,只好硬是拿div
加上去,現在變成這附德性:
1 | <nav> |
1 | .sublevel{ |
繞了一大圈,做的事情根本一樣…而且更難寫了,唯一的優點是少了一層ul
orz 所以為了易讀性與可維護性考量,以後做 nav
時還是乖乖用 ul
跟 li
吧(掩面)
還有一個使用 list 可能原因,或許是在沒有 CSS 的狀況下,HTML 文件本身的可讀性?
不過如果nav
不需要用到選單只是純連結的話,不用 list 還是可以的…(<=不知悔改)
Twittering-mode 就是個非常好的東西,opensource、以上的事情當然也都做得到,目前我還不知道還有哪個 Twitter client 自由度可以像 Twittering-mode 這樣大到讓所有高興的人亂搞的(而且必須要很容易拿來亂搞)。類似應用還有像是可以輕易地拿來產生這種頁面。
之前 Emacswiki 上有人有寫 filter 功能(不過這功能一直沒被 merge,不知道為什麼),但如果要過濾 URL 就會有問題,因為 Twitter API 抓下來所有網址都會被 t.co
再縮一次,不過回報一下就有大神改好了(詳細內容),自由軟體真是美妙。
(此程式碼為 Emacs 搭配 Twittering-mode 使用)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23;;;; Filtering.
(defvar twittering-filter-users '()
"*List of strings containing usernames (without '@' prefix) whose tweets should not be displayed in timeline.")
(defvar twittering-filter-tweets '()
"*List of strings containing phrases which will prevent a tweet containing one of those phrases from being displayed in timeline.")
(defun twittering-filters-apply ()
(setq non-matching-statuses '())
(dolist (status twittering-new-tweets-statuses)
(setq matched-tweets 0)
(dolist (pat twittering-filter-users)
(if (string-match pat (cdr (assoc 'user-screen-name status)))
(setq matched-tweets (+ 1 matched-tweets))))
(dolist (pat twittering-filter-tweets)
(if (string-match pat (twittering-make-fontified-tweet-text-with-entity status))
(setq matched-tweets (+ 1 matched-tweets))))
(if (= 0 matched-tweets)
(setq non-matching-statuses (append non-matching-statuses `(,status)))))
(setq new-statuses non-matching-statuses))
(add-hook 'twittering-new-tweets-hook 'twittering-filters-apply)
(setq twittering-filter-tweets '("http://4sq.com/.*" "http://adf.ly/.*" "I liked a @YouTube video" "我喜歡一部.* @YouTube 影片"))
注意可以使用 Emacs Regexp。
我跟一些推友在貼含有政治內容的 tweet 時會習慣在內容加上一個 [政治慎入]
或[政治滲入]
,其實這標籤不是要給人看,而是讓不喜歡政治內容的推友可以用類似方法過濾。其餘還有[R-15]
[R-18]
之類的。
看到很多人在嫌 Twitter 的 web 界面越做越奇怪,反正我全用 3rd client 用得很開心。=w=
]]>大學竟然就這樣過一半了,這篇寫得有點晚,不過勉強還算是學期初,趕快趕鴨子上架。
這學期開始最特別的事情大概就是「不用再修恐怖的必修」了吧,總算、萬幸、萬歲把連續兩年夭壽至極的某門必修課都修完,沒有小確幸一個莫名其妙的詞彙,意指生活中「微小但確切的幸福」。,只有滿滿的大幹八壓力很大只想罵幹你娘的機八人事物,簡稱「大幹八」。語出@vinta,不過幸好都過去了。
然後,很開心的輔了園藝系。由於終於沒有夭壽必修佔時段,於是這學期就一口氣把果樹+蔬菜+花卉學外加九堂課實習全部修一修。還蠻慶幸進的是興大這種農學院超強的學校,否則真不知還有什麼機會能學到這些有趣的事情。很累不過很爽,比每天連續幾個小時窩在書桌前做煩死人的模型好多了。不過有個麻煩是,等作物都種下去以後,接下來除了校內蔬菜實習場要天天澆水外,似乎還得需要常常找時間想辦法去北溝的園藝實習場澆水除草之類的,可是我不會騎機車…。
騎腳踏車去其實距離不長,單程只有 8 公里左右,而且都是平地不像基隆到處都是山,問題是一路上的汽機車超多,尤其是下班時間,一輛輛趕投胎的機車不斷從旁邊衝過去的壓力很大(光這一點我就無法喜歡上台灣的任何一個城市),加上超多的都市特產紅綠燈,騎起來非常不爽又危險。目前不知該怎麼辦,大概只能戴安全帽慢慢騎吧。
大二開始慢慢地試著作曲,但是進度非常不順利,動機越積越多,結果全都串不起來,結構零散…沒有聽寫/和聲/對位/曲式基礎還玩這個,真是自找麻煩。這時就會很佩服 Alkan 作品中的一堆驚人的結構。
所以前陣子在 Twitter 發了很白痴的豪語,這學期結束前要練至少十首貝多芬奏鳴曲奏鳴曲,一種古典音樂形式,一首奏鳴曲通常包含三個樂章。,選曲標準是「之前沒聽過就好」,差不多就是十天一首,三天一個樂章。不用熟練沒關係,反正我記性差又沒天份也不可能短時間熟練。但每一首的曲式結構必須清楚,希望可以藉此加強組織能力,不過這好像更難…。
然後再來殘害自己的神經一下,學期末前也要丟出一本至少 12 首的作品集。來看看我會不會富奸或馬英九吧(罵髒話自己掌嘴 x 3)。
雖然很清楚這目標的鴨梨有點大顆,但不這樣好像不行,不然東西永遠生不出來。常常看著 zhusee2 或 zespia 這些同年齡卻一直有許多作品的的強者都好佩服又自卑啊。不過反正,沒有了系上的某夭壽必修後,兩年來的最大壓力來源瞬間消失,可以放心搞想搞的東西了,超開心。
最近把暑假實習拿到的一點薪水拿去買了 Sharp PW-AC30-W 電子字典,查奇怪的漢字方便多了,順便繼續督促自己多唸日文。雖然跟手機相機一起攜帶起來有點麻煩,不過個人還是比較偏好每種東西的功能分開、好好各司其職。Android 前陣子也壞掉,剛好回去用傳統無照相手機。
大學日子只剩一半了,六百多天內再不把想做的事情做一做,以後不知還有沒有機會。
]]>Google 的服務也用很久了,從以前 GMail beta 剛出來在到現在,這之間 Google 帶給大家許多驚喜,但已經不得不說,我開始不懂 Google 現在到底在做什麼了。以前簡直把 Google 當神在拜,但現在的 Google 除了把好用的服務關掉外,也開始把原本很好用的 UI 改得越來越難用。尤其要恭喜 Google+ 的 UI 現在已經成為我所用過體驗最差勁的網路服務之一。別再嘲笑 Facebook,雖然沒 G+ 好看但它比 G+ 好用很多。
我現在已經很不喜歡再做批評這種事情,因為批評永遠比創造容易,只會批評不會做事表示不負責任又無能。在做園藝設計時,任何設計都會被質問說「為何要這樣做」,如果沒有合理理由,就有可能會被狂砲。所以既然要批評,那就得明確指出:
1.問題出在哪?2.為什麼?3.怎樣做會比較好?為什麼?
於是我決定來細數一下 Google 自從改版開始(navbar 改成黑底後),搞出的一堆令人狂飆髒話的 UI 設計:
這是個很方便的設計,不過也沒那麼單純。
當你在通知欄的懸浮框裡打了一堆字,突然想到什麼,滑鼠一不小心點旁邊,剛打好的上百字回覆瞬間消失完全救不回來, 我已經被這樣耍超過三次了 ,人家 facebook 至少也會提醒你「文字框裡有東西,確定要離開嗎?」,明明只要加上這個提醒就沒問題了。G+ 最令人抓狂的設計之一。
舊搜尋界面中的搜尋選項(e.g. 日期範圍)放在左側直接攤開可以直接點下去,改版後下拉式選單。
很好看沒錯,但一次就可以點完為何要改成點好幾次?而且還常常點錯:
原本的滑鼠動線:
現在搞成這樣:
除了滑鼠要連續瞄準好幾次外,注意黃色圈圈部份,這個 navbar 位置放的也不是在螢幕邊緣,滑鼠軌跡很容易超出去,而原本的是在螢幕邊緣就很好按。新設計簡直是拿來惡整使用者的。
G+的選單從原本的也是攤開來一條,要點什麼都很快:
結果現在變成這附德性,把滑鼠移到畫面左上角的小按鈕,選單才會拖拖拉拉的滑出來(而且這種這麼常使用的按鈕,滑鼠移上去時竟然還有設 delay 時間,找使用者麻煩還真是不遺餘力呢。),等那有著華麗特效的笨選單終於滑出來後,還得往下滑到自己要的項目。
跟搜尋選項一樣,以前瞬間可以按到的東西,現在得花令人發火的三到四秒,在考驗使用者玩 FPS 的滑鼠精準度嗎?現在的螢幕也沒必要這樣省左右兩側的空間。
加上我還有使用 KDE 的甩四角功能(滑鼠移動到螢幕角落時會執行特定功能 MacOSX 使用者應該很清楚這是什麼),這種設計更加討厭。
很多人罵過的 Facebook 動態時報(動態單欄變成雙欄,視覺動線搞得很複雜),G+也不遺餘力的跟進了這股風潮:
當然可以改回單欄,但兩邊留那麼大的空白是有什麼意義?除了難看外,左側 sidebar 連「省空間」這個勉強的優點也沒了…難看又難用。
我完全不能明白為何現在 Google 搜尋時,搜尋界面會出現兩條功能重疊的 navbar?
兩條都包含著「網頁、圖片、地圖」,點下去的功能一模一樣,如果只是功能重複這樣那還好,詭異的是有時行為還不一樣,有時點下面的「圖片」會是「一樣的關鍵字,改成搜尋圖片」,點上面的「圖片」卻會回到 Google 圖片搜尋首頁(不過這可能是改版時沒改好,現在好像比較沒遇到了)。
每隔一段時間打開 G+,會跳出「好友推薦」視窗強迫你看,而且不按「繼續」就無法使用,也不知怎麼關掉。
- 我打開 G+目的是要看訊息而不是一直加好友,為何要一直強迫使用者加更多好友(尤其在網路環境很差的地方,載入老半天卻跳出這個視窗)。
類似例子像是某些軟體開啟時會先跳出「新版出來了,是否要更新」一樣,使用者開程式就是要使用,而不會想等他更新完。有些軟體甚至會設計成關閉時才會問你要不要更新。- 即使有地方可以關,依舊缺乏「下次不要再顯示」的 checkbox。這點 Virtualbox 的設計就很好用。
我真的很懷疑 Andy Hertzfeld初代 Macintosh 開發者之一,現在人在 Google。 真的有參與這些設計嗎…
UI 好看,難用也枉然。
(其實我覺得軟體或網頁的 UI 設計還蠻有趣的,而且他比環境規劃單純很多)
個人覺得學 Emacs Lisp 其實不一定要靠 GNU 提供的那厚厚一堆文件,對我來說我就沒啥耐心看那個…下面整理了一些 Emacs Lisp 的學習資源,不多但都非常值得參考。
##聖經
–適合慢慢當書來翻
ANSI Common Lisp 中文版 : Paul Graham 大神!這本是我心中 Lisp 入門的聖經,因為他真的成功讓我這種沒有程式基礎的傢伙看懂了…(<=這人到現在只看到第二章就在寫東西了,可見 code 品質…) ,裡面非常多範例,很合我的胃口。雖然是 Common Lisp,但這些 Lisp 概念對於學習 Emacs Lisp 依舊是非常好的入門方式。非常推薦!
Xah Emacs Tutorial 與 Xah Emacs Lisp Tutorial : Xah Lee 的 Emacs 教學,應該已經成為很多初學者的學習指南。我主要是看他的 Lisp 部份,整理了超多 Emacs Lisp 的範例與實戰經驗,例如要怎麼用 elisp 把一個網站中的 HTML 標籤替換掉。
##搜尋用
save-excursion
),GNU 文件就非常非常有用。match-string
跟string-match
的差別)。可以再搭配這個 function 服用會更方便。##問問題
irc.freenode.org
,聊天室是#emacs
。也有一個台灣的社群,人少但也有熱心的大神;一樣是在 freenode 上,聊天室是#emacs.tw
。1 | for i in *;do mplayer $i;done |
用這種方法可以一口氣看完一整部動畫手都不用動,但不夠好用。不過現在我們有 Emacs 跟 Dired。
在 Emacs 上要看影片聽音樂有 EMMS 這個選擇,但個人覺得這個做得太複雜,當初設定我也弄不太起來,所以乾脆自己搞一個剛好夠用、設定又簡易的函數。
我平常是偏好使用 SMPlayer 作為影片播放器,功能完整自訂性高,而且他有提供把檔案直接加入 playlist 的參數-add-to-playlist
,於是搭配Dired
就很好實作了:
###程式碼###1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25(defun dired-add-to-smplayer-playlist ()
"Add a multimedia file or all multimedia files under a directory into SMPlayer's playlist via Dired."
(interactive)
(require 'cl)
(let* (PATTERN FILE full-path-FILE n)
(setq PATTERN "\\(\\.mp4\\|\\.flv\\|\\.rmvb\\|\\.mkv\\|\\.avi\\|\\.rm\\|\\.mp3\\|\\.wav\\|\\.wma\\|\\.m4a\\|\\.mpeg\\|\\.aac\\|\\.ogg\\|\\.flac\\|\\.ape\\|\\.mp2\\|\\.wmv\\)$")
(setq FILE (dired-get-filename nil t))
(setq n 0)
(if (file-directory-p FILE);if it's a dir.
(progn
(setq full-path-FILE (directory-files FILE t PATTERN))
(message "Opening %s files..." (list-length full-path-FILE))
(cl-loop for i in full-path-FILE
do (call-process "smplayer" nil 0 nil "-add-to-playlist" i)
(sit-for 0.1));Or playlist will be not in order.
(dired-next-line 1)
)
(if (string-match PATTERN FILE);if it's a file
(progn
(call-process "smplayer" nil 0 nil "-add-to-playlist" FILE)
(dired-next-line 1))
(progn
(message "This is not a supported audio or video file.")
(dired-next-line 1))))))
(define-key dired-mode-map (kbd "M-a") 'dired-add-to-smplayer-playlist)
###使用方法###
C-x C-f
用 Dired 進入你存影片的目錄,移動到想要播放的檔案後按下M-a
即可。M-a
。用用看就知道了,很方便的~ =w=+
只是這有個問題…就是呼叫外部程式我只在 Linux 下測過,MacOS 我沒測過不知道…或許可以用吧,Windows 的話則是根本不知該怎麼做也不打算知道(被拖走)。
##[2014-01-08 水] 更新
後來 Timothy Lin 提醒,SMPlayer 自己就會偵測輸入路徑是否為一個目錄,是目錄的話就會自己把目錄內的所有檔案加入 playlist,所以好像不用用到cl-loop
…
1 | (defun dired-add-to-smplayer-playlist () |
然而發現一個好像是 smplayer 的問題,就是當 playlist 裡面已經有項目時,再加目錄的路徑進去會無效(會變成加入無法播放的奇怪項目),所以還是得一項項加進去…。
]]>Emacs 用一用,為了實現一些自己要的功能,好像還是一定得去學 Emacs Lisp。學了 Lisp 以後真的方便很多很多,也才開始開始實際掌握到 Emacs 的威力。
這篇不是教學,只是一些瑣碎筆記。當初不知道這種問題該怎麼問人或問誰(IRC 其實是個非常棒的發問管道,即時又有效,在 freenode 上的#emacs
,還有中文的#emacs.tw
),所以一開始寫時覺得很痛苦。
在這裡記下一些能讓入門 Emacs Lisp 更輕鬆方便的小技巧,需要的人許可以參考。
在任何 mode 下,C-x C-e
可以將游標之前的 S-expression(就是 Lisp 運算式,常簡寫成 sexp)eval (求值) 並輸出結果到 minibuffer 中。
C-u
的話會把結果插入目前游標位置。(所以高興的話可以在 Emacs 裡任何地方寫 Lisp 式子來當計算機。)C-M-x
(eval-defun
) 則能夠 eval 目前的 defun
。C-u
prefix 就是先按 C-u 再按 key-binding。=>
再插入 eval 結果。例如(+ 1 5) => 6
。1 | ;; Makes eval elisp sexp more convenient |
在 lisp-interaction-mode 中 (例如 *Scratch*
) ,可以在一個運算式的最後一個括弧後面按下 C-j
直接 eval 並直接將 eval 結果插入當前游標後面。
eval-buffer
設定一個快速鍵,可以直接 eval 整個 buffer 方便測試。如1 | (global-set-key (kbd "C-c C-e") 'eval-buffer) |
C-j
(newline-and-indent
)可以換行並自動縮排(但 lisp-interaction-mode
中除外,因為會被解釋成 eval 並輸出結果)。M-C-\
可以將整個運算式自動縮排。auto-indent-mode
可以很方便的自動縮排就不用手動縮,只是我用起來問題很多就移掉了…想試試看的可以從 MELPA 安裝。1 | (show-paren-mode t) |
rainbow-delimiters-mode
,能夠把位在同一層的括號上相同的顏色,再也不會覺得括號很難對齊。(縮排不正確時括弧顏色會出錯,記得C-M-\
。)M-x check-parens
可以找到漏掉的地方(前兩者有設定的話,遇到這種事的機率會下降非常多)。paredit
,需另外安裝,熟悉的話可以使編輯括號變得更有效率,操作起來就跟變魔術一樣。似乎有很多人喜歡用這個,只是不好學。我自己是沒在用到目前為止嘗試了不少 Emacs 外掛,我發現我自己是不太偏好「聰明過頭」了的設計…(re-search-forward "PATTERN")
,會發現 "PATTERN"
裡反斜線看起來好像無法正常運作。這是因為在 eval 時,裡面整個 "PATTERN"
因為被 double quote 包起來了,裡面的 regexp 會被當成是 string 而先解析過一次。所以平常只需要一個反斜的話,在 Lisp code 裡要寫兩個反斜…(之前就是不知道這點,浪費了很多時間和腦細胞)M-x re-builder
,即時比對 pattern 非常方便。C-h f
。要查詢 variable 定義與文件,請按C-h v
。注意,如果目前游標下剛好有一串字串符合 function/variable 名稱,會以該字串為預設值,這時只要按 Enter 就可以直接查詢了。
C-x C-c
,所有開啟的檔案全被關掉很很囧的話,請服用:1 | ;;確認後再關掉 Emacs 啦 |