星球
Blog:Jserv's blog
最後更新: 2010/8/27 16:50:00
為 mupdf 加上全螢幕切換功能
2010/8/27 16:50:00 | Jserv's blog
昨天受邀去內湖某公司作簡報,因為 OpenOffice 產生的 PDF 檔案稍大,用 evince 播放時,略為停頓一下,致使跟不上預定的節奏,有些細節就不慎忽略。回辦公室後,認真思考改良 PDF 簡報放映的方式,歸納以下軟體需求: 避免太多相依性或執行時期的檔案 -- 讓任何一台裝有 GNU/Linux 的電腦都能作簡報與程式展示 快速 -- 就算播放幾十 MBytes 的 PDF 檔案也順暢 流暢鍵盤操作 -- 快速 zooming, 切換視角, 切換頁面,標注重點等等 open source -- 這還要說嗎?這年頭好多 closed source PDF viewer 根本就是 spy/ad-ware [MuPDF] 是目前最符合上述需求的軟體,輕薄短小,而且相當快速,但缺乏最重要的功能,也就是全螢幕播放,只好自己動手改。初步的 patch...
演講:沒有政府補助,照樣寫自己的作業系統 -- 如何善用開放原始碼工具,加速作業系統的開發
2010/8/18 11:34:00 | Jserv's blog
應 ICOS 2010 之邀,小弟將在該研討會在九月 18 日 (週六) 的議程中,以「沒有政府補助,照樣寫自己的作業系統 -- 如何善用開放原始碼工具,加速作業系統的開發」之名,作為演說分享。詳情可參考 [ICOS 2010 網站] 與 [議程資訊]。 最為一位沒受過高等教育、社會最低階的軟體開發者,小弟每年練習寫一套不同的作業系統,期許自己能提昇資訊素養,雖稱不上有什麼成果,但這段歷程著實讓我體驗到開放原始碼工具的重要性,於是藉這個議程,野人獻曝一番。一如往常,每年都要發表一個 (玩具) 作業系統,今年則是將 [Orz Microkernel] 用 C 語言重寫,同樣是具體而微的系統,可作為教學研究使用。在 ICOS 2010 的議程中,小弟會探討發展這樣一個 microkernel,如何在相當有限的開發資源,善用 GNU Toolchain 搭配如 QEMU 這類強悍的工具,快速從 prototyping 到系統驗證,即便只用下班後寶貴的時間,還是能搭建一個小而美的 microkernel。 以往,我們總能以既有的資源去解決軟硬體問題,但今日我們面對五花八門的技術、日新月異的技術,許多人都亂了方寸,一味盲從,卻忘了資訊技術的提出,就是要解決既有的問題。我一直認為,唯有親身體驗一個完整系統的設計,才得以獲得成長,也才可創造更廣泛且深入的應用,無論是奠基於既有的架構抑或是重起爐灶皆是,這就是小弟這幾年多場技術演講的核心概念。期待您的參與指教,謝謝!...
演講:打造特製的 Android Toolchain
2010/8/4 22:24:00 | Jserv's blog
很榮幸能連續五年,在台灣的年度盛會 [COSCUP] 研討會上,作心得分享。今年的演講議程,題目定為「打造特製的 Android Toolchain」,主要分享小弟在 [0xlab] 所作的實驗,從修改 Android 的 GNU Toolchain 到提供 source-to-source compiler,提出若干基於特定需求,從而發展的編譯器技術的新應用。時間是 Aug 15 (週日) 下午,詳細議程資訊,請參考 COSCUP 網站。 我們可發現,ARM 陣營籌組了 [Linaro] 組織,不僅有系統整合層面的 Ubuntu / Canonical,還包含像是 CodeSourcery 這樣專精於編譯器技術領域的公司投入。近期內,已建構於開放原始碼的技術上,由 CodeSourcery 與 ARM 工程師主導,由 GCC 搭配 CodeSourcery G++ 的基礎,搭建 Linaro 的...
ptrace / SIGTRAP / int3 的關聯
2010/8/2 2:30:00 | Jserv's blog
最近的時間大部分投入於某個產品的研發,自然得考慮到一些議題,其中包含了 anti-hacking,順便就複習 ptrace 一類的操作,本文可視為 [以 ptrace 系統呼叫來追蹤/修改行程] 的補充,以實驗方式,觀察這些底層機制。 在 UNIX 的世界裡,作業系統提供 ptrace 系統呼叫,允許我們優雅地進行「攔截」或「追蹤」其他行程的動作,這也是 gdb 與 strace 一類系統工具背後的原理,比方說 Evan Teran 就依據如此的機制,撰寫一個 [Qt4/ptrace-based Binary Debugger]。無論是如何操作,大抵依循以下三個步驟: 調用 ptrace 系統呼叫 判斷 SIGTRAP 是否為監看的程式 (如 GDB) 所攔截 透過硬體平台的指令,去觸發 breakpoint / SIGTRAP,進而執行特定的追蹤動作。以 x86 為例,就是 "int3" 指令...
GCC 的 nested function 與 trampoline
2010/7/29 17:54:00 | Jserv's blog
GCC 提供特有的 C 語言 extension,允許像 Pascal 一般,定義 nested function,詳情可參考 GCC 手冊 [Nested Functions],注意,由於程式語言設計的一致性考量,此機制不在 GNU C++ 支援。nested function 的形式很明顯,就是在定義於另一個函式內部的函式,以下引用 GCC 手冊的範例: 由上可見,函式 bar() 的程式碼實做中有個 nested functon -- accss(),後者可存取到前者的變數 offset,符合 lexical scoping 的規範。乍看 nested function 只是一種語法上的 syntax sugar?非也,事實上,可在 nested funtion 的 scope...
爸,我想寫軟體程式
2010/7/26 21:06:00 | Jserv's blog
之前身體狀況不佳,回苗栗老家休息一段時間,除了家務事外,談了台灣的資訊產業,本應興致勃勃,但家母道出的一席話後,頓時陷入無議無論的噤聲:「寫程式這麼累,就別做了吧」。捫心自問,從業數年,除了偶爾聽聞他人基於禮貌給予的讚揚外,的確是一事無成的狀態,儘管我的工作內容之一,就是說服他人採用敝單位的資訊系統,但我卻沒辦法說服家人,同意我繼續寫程式。 因緣際會,能在國小三、四年級時,就動手寫電腦程式,其動機僅是怕放在客廳的 80386 個人電腦受潮而無法再開機 (靠海的通霄,常吹濕氣頗重的南風,電腦購入不消四年,扣除硬碟的週邊,幾乎都更換過)。至今回憶,那 MS-DOS 命令列提示與 BASIC 直譯器的畫面,仍是最美麗的景緻之一,得以透過螢光幕,瞥見當時工藝的極致,何其幸運?直到高中畢業前夕,從未想過以資訊技術作為己志,畢竟僅是興趣,雖然中學時代,頗受 Bill Gates 的激勵,但家人總冷冷地說,軟體隨便 copy 就拿走了,怎麼賣錢?而且,將興趣轉換為工作,註定要大打折扣的。中學時,自小即相當照顧我的姑姑,因急性白血症病逝,走的那日正是 [六月六日斷腸時],對此,下了心願要考醫科,試著為醫療科技貢獻一份力量... 但最後,我的意志動搖,雖然成績不惡的我,分數能考上醫科,但始終沒有就讀的勇氣。在通霄國小就學時期,有幸作為知名雕塑家朱銘的學弟,在台灣最有藝術氣息的小學,觀賞著這些由朱銘捐贈的大作,無論是太極系統,抑或人間造型,都反映從自然生命中所領悟出的創作態度,一股自由無拘束的壯闊氣概,最愛徜徉在虎頭山腰,靜靜凝視雕塑與遠方的鐵路,那時,曾不只一次的幻想自己是融合藝術與工程的土木技師。小時過年跟隨母親回娘家,常見到抱著厚重設計圖、不時潛心作設計的舅舅,雖不甚理解土木工程,但那娟麗的字跡穿越著密密麻麻的線條,深深吸引著我,後來我才知道,北二高有一大段工程就是出於舅舅之手,曾有一度想追隨任教於台大土木系的舅舅,用雙手牽起人與人的關聯。 可惜,浪漫的幻想,總是極易戳破,高一的工藝課,無論如何嘗試,就是無法徒手繪出筆直的線條,而三視圖總是充滿瑕疵,「我可能不是作土木建築的料」,默默地承認這個事實。高二選擇第三類組後,則在生物解剖課,徹底粉碎擔任醫療人員的念頭。我還記得,暑假為了提高膽量,逼迫自己切魚的往事,只見雙手的血跡與淚水融為一體,「我真的不是唸醫科的料」,再次接受了真相。當這些選擇一一從志願表刪去時,「資訊工程系」這個倒數第二個選項就浮現了 (最後一個志願是電機系,因為與家父賭氣,不想唸電子電機科系),在沒有選擇餘地的情況下,懵懵懂懂做出選擇。記得三年前應邀去中正大學演講時,資訊系的老師說:「這裡的學生不像你很早就決定自己的志業,請你就業界從業人員的角度,跟學生分享經驗...」,真不知該如何回應,老實說,我的處境跟該校的學生沒太大的分野,也是先考進資訊工程學系,才開始規劃人生的,只是遇到貴人的時間早了些,挑了些較易有成效的項目來作。 魯迅說過:「哪裡有天才,我是把別人喝咖啡的工夫都用在了工作上了」,堅信此道的我,每每保持同樣是魯迅的名言,人生的旅途上遲緩地踏出步伐:「人類總不會寂寞,以為生命是進步的,是天生的」,雖然,至今仍打零工度日,有什麼立場說自己在實踐志業呢?記得 Romain Rolland 說過: 「一個人的性格決定他的際遇。如果你喜歡保持你的性格,那麼,你就無權拒絕你的際遇」 大概是當初太短視,唯有在跌跌撞撞幾年後,才能體會這句話。決定離開成功大學時 (家中永遠都有重考唸醫科或其他科系的聲音,也因此,沒能把資訊系唸完,可能也是註定的事),找當時的導師蘇文鈺教授談過,老師說,只要想清楚, 自己做了選擇, 就不要後悔, 還要注意身體健康。事隔多年,老師來信提到: 「也許你不相信,我時常跟現在的學生提到你,一年至少一次, 我回憶起你的程式功力與執著,當然還有比賽前被送進醫院那件事,我一直相信走自己的路與願意走人煙稀少的路的人,成就的機會比較大」 這番話,讓我在讀信的當下,控制不住情緒,就在辦公室啜泣起來,是想到這幾年受到的委屈與不平的待遇,無論肇因於學歷、經歷,或者所謂的「大環境」... 只能怪說自己太叛逆,又狂妄地想做些改變現狀的事,這包含在台灣繼續寫作軟體。 「寫作對於我而言,是在漫長旅程上有一個溫暖的春夢做著,路寬夢窄,並且一直大夢未醒。一個人在世上,總得找一個屬於自己的夢做著,不然,這黑夜就顯得太長。」 這是大陸作家馮傑的話語,用來描寫此刻我的心境,也相當契合,儘管兩者所謂的「寫作」,還要視真實的「讀者」而定。作家馮傑用「文字還願」,寫作給一塊無言的土地,對那些逝去的親人;愚昧的我用「程式碼許願」,寫給這塊立足的土地,對那些相信臺灣軟體發展機會的人。就這個角度來說,我的寫作才剛開始。不期望能在商業行為之外,說服任何人,只願能堅持下去。「爸,我想寫軟體程式」這句,語出於升國小四年級的暑假,當時家父指向書櫃裡頭的技術書籍,而,近二十年後,抱著滿滿電腦資訊圖書的我,又說了一聲。...
dissy -- 好用的 objdump 圖形前端工具
2010/7/5 23:40:00 | Jserv's blog
最近利用閒暇的時間,準備新的系列課程,目標就是嘗試體驗 "Eat Our Own Dog Food",實現資訊人多少會有的浪漫夢想:用自己撰寫的編譯器,編譯自己設計的作業系統,跑在自己設計的 CPU 與硬體上。雖然自己恰好作過前述三者,不過要連貫起來,並改成系列的課程,仍是新挑戰。這過程要涉及到許多工具程式的開發,特別是視覺化的處理,才能讓學員更快進入狀況,而 [dissy] 就是個非常優秀的 objdump 圖形前端工具。 用 objdump / readelf,可窺探 ELF 格式執行檔案的許多細節,也能靜態分析,但往往得在大量的輸出打轉,著實不方便,[dissy] 這個工具可帶來頗大的便利,直接看底下的執行時期的圖片吧: 上方視窗為 ELF 執行檔中的符號 (symbol) 列表,一旦點選進去後,會得到下方的兩個視窗:左側是反組譯的輸出 (含原始程式碼除錯訊息),右側是點選的機械碼指令的解釋。這也表示說,dissy 需要 non-stripped ELF 執行檔的輸入,否則無法符合預期的運作。另外,dissy 也能作簡單的流程分析,比方說上圖左下方的紅色箭頭,就表示有 branch (跳躍) 的動作,搭配原始程式碼的列表,一目了然編譯器與組譯器所進行的操作。...
透過 libtcc 來擴充 C 語言
2010/6/17 2:05:00 | Jserv's blog
在「libacc : Android 2.0 內建的輕量級 C Compiler」一文,筆者提過 Fabrice Bellard 的大作 [OTCC] (Obfuscated Tiny C Compiler),而 OTCC 進一步開發則成為 [TCC] (Tiny C Compiler),這是世上最完整的迷你 C compiler 實做。如同 Fabrice Bellard 的其他作品,TCC 也提供一個驚喜,可參見 TCC 網頁的特徵描述,其中有一項: "With libtcc, you can use TCC as a backend for...
在 GDB 透視 C 語言的字串表示法
2010/6/17 0:34:00 | Jserv's blog
最近從「快快樂樂學 GDB」到一系列與 C 程式語言相關的 [演講議程],探討了在執行時期,透過 GDB 一窺系統全貌的途徑。筆者的觀點是,C 程式語言就是設計來開發作業系統的用途,務必確認每個環節。UNIX 之父 Ken Thompson,不僅開創了 UNIX 若干經典的設計,也持續維護 C compiler,甚至在 Plan9 研發時,還重新翻修過整個編譯系統的設計,可參考 [A New C Compiler by Ken Thompson],顯然就是不放過任何一個技術細節。身處於 21 世紀的我們,幸福多了,有強大的 GDB 搭配開放的 GNU/Linux,而本文就在這些基礎上,談談在 GDB 透視 C 語言的字串表示法。 前文 [C-style 字串的最佳化] 提過 C 語言字串的形式,其實不過是一段保存於連續記憶體的資料,那面對稍微複雜一些的形式,我們不免會亂了方寸,這時候當然要祭出 GNU...
意義是三小,我只知道義氣
2010/6/16 13:54:00 | Jserv's blog
在思念某個人的時候,我總會來到那間兩人曾多次觀賞的二輪片戲院,不論究竟播映什麼,只想靜靜的沉溺在過往。只是沒想到,原本只是思念一人,在觀賞《艋舺》後,又多思念一位朋友。 時間回到 2002 年,當我決定離開成功大學後,先服兵役,為日後規劃作準備。體力狀況不好的我,新訓入營第一天就在集合場昏倒 (入伍前一日還在趕專案,徹夜沒睡),第二天則是上吐下瀉,反正一連串的事故,到了懇親會,滿頭茂密的頭髮,絲毫沒有修整過,甚至被當作女兵。在軍中休養與閒置時,拿起隨身攜帶的兩本書翻閱:老子《道德經》與家父用過的袖珍英漢辭典。當時的目標是「如果能在他人認為是浪費時間的軍旅生涯中,想辦法能做出一點事,就是很大的突破」,於是,一邊在這「夏令營」鍊體能、認識朋友外,就是用力背單字、思考老子的智慧,並且探索人生存在的策略。或許是註定要這麼另類,舉凡絕食抗議以爭取軍中改善伙食、當著長官視察的機會,反映新訓單位的諸多缺失,或者直接跟連長商量新訓的執行方式等等,總之,一開始只是想知道,到底能惡搞到什麼程度,但竟然讓人誤會我有什麼背景,而連上原本的小混混,也用不同的態度對待我。 成為中輟生以前,在某些觀點來說,我被當作「乖乖牌」,大抵是維持夠好的學業成績、擔任學校的班級幹部、獲選為模範學生,偶爾參加一些競賽,而精英教育更是讓視野狹隘,好似一定要把自己想得很偉大,才能稱上一個完整的人。還好我有機會服兵役,得以貼近這個世界的真實一面,這在前文「服兵役,作為一個轉折點] 大致提過。也不知道從什麼時候開始,那些身上滿滿刺青的鄰兵,不約而同稱呼我為「群哥」,炎炎夏日還會主動買涼水,除了偶爾去擺平一些雜事外,跟他們的交集不多。下部隊後,與弟兄的生活更密切,在極機密的單位服務,免不了無止盡的演習,輪班制度更是讓人心生絕望,當初立下「做出一點事」的心願,該如何履行呢?還好,逐漸習慣日夜交錯的排班、與聯隊同袍的感情更密切後,每天還是能挪出至少一小時可讀書、寫信,與 (紙上) 程式設計,重溫「乖乖牌」的生活。 跟一群原住民學長一同服役,是幸福的,沒有比這樣更能貼近不同的文化。值班時精力旺盛,下班後的活動,一樣都不少,在苦悶的營區中,依然能夜夜笙歌 (不過只有酒肉與吟唱)。過去不免對職業軍人有些陳見,而在深入了解他們後,不過只是機運不同罷了,每個人都有過去,如今我們都在同一條船上。原本滴酒不沾的我 (國中時,某次除夕沾了一口葡萄酒,立刻昏睡,自此對酒精拒絕往來),在學長密集的訓練下,竟然也培養了一點酒量,話匣子打開了,自然是無所不談,也對「兄弟」有更深入的理解。 「如果你有選擇,當初會這樣作嗎?」 面對嫌疑犯,我們往往會有如此的疑惑,而,涉世未深的我,很難想像身邊的弟兄,幾年前曾過失殺人,為逃避那打打殺殺的環境,在軍中尋求一個相對的隔離。意義?我在他的談吐,逐漸知曉所謂的義氣。年紀與我相仿,但江湖硬是在他身上,烙印著顯著的痕跡。在服務的單位中,先後傳出三位義務役士兵自殺的消息,但我僥倖在這不甚人性化的工作環境,取得還不錯的「位置」,多少也與學長相挺有關。在有限的記憶中,下部隊一年半載,所有的酒錢、下酒菜,甚至外出的「餘興節目」(有女侍/女士陪伴的那種) 費用,其實我一毛錢都沒出過,每日的酒肉交際,成為軍旅生涯一項「功課」,大概可歸類為「群哥」時期。 喜愛職夜班,儘管要從晚上七點,一口氣值勤到早上六點,但除了夜航外,沒有太多急迫的任務,取而代之的,就是可以慢慢做的勤務與訓練。只要本職學能充分的話,夜班可以挪出可觀的空檔,令人欣慰的是,用這些空檔,陸續讀完三十多本書,包含大學沒有學習的課目。除了利用大夜班進修外,其他的時間可說是一面值勤,一面交際。一旦覺得精神不支時,就趕快跟弟兄談天,話題廣泛從風花雪月,到每個人的過往。每道刀痕的背後,都有獨特的意義,喔,更精確的說,那是義氣的見證。有時,在難得的休假中,這些弟兄還得結伴去幫忙討債,不免落得新舊傷痕並陳。 「那未來呢?你要怎麼走人生的旅程?」 我們談論了未來,有如在漫漫長夜中,螢光幕上細微的雷達回波般,想法短暫的存在,又在轉眼間消逝。時間允許時,曾幫他們補習英文,或許退伍後能有用處,而以更多的故事見聞分享,作為回報。一直到那個時候,我才真心地,傾聽這世界上與自己設想不同的聲音。沉默是一種處世哲學,用得好時,又是一種藝術。多半,我隨著這些片段的故事,心境起伏著,儘管表面是沉默的,金庸不也借狐沖之口,說道:「有些事情本身我們無法控制,只好控制自己」? 能沖刷一切者,除了眼淚,就是時間。退伍後各奔東西,除了偶爾接到來電,要求協助處理經濟上的缺口外,頂多就是談談共同的兵役趣聞,隨著我在電子產業的消磨,彼此的聯繫越來越淡。後來輾轉得知,我這位「兄弟」涉入某個火拼,隨後消沉度日,幾度嘗試聯繫,至今沒有下文,只能盼望一切安好。你教了我一個顯見的道理:人生短短幾十年,不該給自己留下了什麼遺憾,應當想笑就笑、想哭就哭,該愛的時候就去愛,無謂自我壓抑,得以率性的活著,還有什麼比得上呢?又夢見了你,幾分陌生,又莫名的熟悉,拍著我的肩膀,稱兄道弟地豪邁把酒言歡。...
