admin

admin

0
Essay

成功的 8 個祕訣

今天看了一段三分鐘的 TED 小短片,雖然只有三分鐘,但是資訊密度極高,真的是一場很棒的演講,非常值得放下手邊的工作花個三分鐘來聽聽「Richard St. John’s 8 secrets of success」。 1. Passion:不要為錢工作,為熱情。找出你願意付錢而工作的工作。(Doing for love, money comes from anyway) 2. Work:努力工作!但別忘了你是在享受工作。 3. Focus:專注在一件事情上,全力以赴。 4. Persist:成功的必要因素,要有毅力熬過 CRAP (Criticism, Rejection, Assholes, Pressure)。 5. Ideas:創意靈感的產生沒有捷徑:Listen ->
1 min read
Windows

找出引發 Windows BSOD (藍屏死機) 當機原因

大家應該都有過這個經驗,螢幕上出現藍底白字,也就是所謂的藍屏死機畫面(Blue Screen Of Death)。這種情況通常都不是因為我們自身操作錯誤而引起的,因為這種錯誤通常都是 Kernel-mode component 或是硬體錯誤才會引起的。 硬體錯誤的話沒轍,不是找出錯誤來源換新的就是只好買台新電腦。但是 Kernel-mode component 指得是什麼呢?最常見的就是 driver 了。在這篇文章裡分享一下前幾天發生 BSOD 的解決方法: 其實 Windows 7 的確是目前最穩定的版本,從發行至今,這是我第一次看過 BSOD,而且還是發生在我剛灌完作業系統不久的新電腦上!這種情況,十之八九會是驅動程式惹得禍,因為驅動程式一定得跑在 Kernel-mode,只要程式本身有 bug 沒有發現,很容易導致 BSOD 的狀況發生(而這類 bug 又屬非法記憶體存取最多)。 回到正題來,該如何知道是哪裡出錯呢?發生 BSOD 的時候,
4 min read
Programming

物件導向程式設計五大原則:SOLID

前幾天看到一篇非常有趣的文章,因為作者的老婆生產完要回到軟體開發的工作,作者就藉由生活上的比喻讓他瞭解何謂物件導向設計。很推薦大家有空的話可以看一下,作者在文中用很有趣的方式解釋了 SOLID 原則: S: Single Responsibility Principle 單一責任原則,一個類別只負責一件事。當然,我們甚至可以把所有的程式都放在同一個原始檔中,但是這樣就會造成耦合度過高,導致維護成本高、可用性低。(就如同我們在前篇文章所提) 來看個例子,在 Rectangle 底下這兩個成員函式都是非常直觀的:畫矩形、算面積。問題出在什麼地方呢?問題就在於 draw() 與 area() 根本就是兩件獨立的事情,即使都與 Rectangle 有關。draw() 只會在圖形化應用被使用,而 area() 則是在地理計算應用中使用。 「但是,draw() 跟 area() 還是分開的啊,至少這作法直觀」,你可能會這樣想,這樣會有什麼缺點呢? * 明明不需要的,卻依舊被引用進去了,多出冗餘的程式。
5 min read
C

重新認識標頭檔(C/C++ Header Files)

讓我們來複習一下標頭檔的用途:對小型程式而言,基本上我們只需要把所有的原始檔一起編譯,就可以產生出所要的執行檔。但是如果到了大型的專案呢?很多程式勢必是朝向模組化並且講究可再使用性高的方向去設計。其中最關鍵的就是可再使用性(Reusability),但別人要怎重複使用這段程式呢? 首先,回想一下我們如果完全不使用標頭檔又要把一個程式切成好幾個原始檔完成,勢必得在各個原始檔前面加上必要的「事先宣告(Forware Declaration)」,這些東西對我們來說是相依性高的,因為這些事先宣告可能跟原始碼本身的實作沒有關係。所以為了可再使用性,我們把這些事先宣告都放進了標頭檔,如此一來,不論是動態函式庫或是靜態鏈結,我們都可以透過引用這個標頭檔而再用該函式庫。 但是也不是每種語言都有標頭檔的設計,例如 Java,就透過 package 的命名機制(有興趣可以詳讀這篇文章),避免歧義,讓編譯器可以直接找到所需要的 Symbol。 標頭檔的概念很容易理解,要照著做也只是把變數拉出去而已。那麼到底還有什麼值得寫出一篇文章的地方呢? 不要把標頭檔當垃圾桶 有些人可能會為了方
4 min read
Programming

如何在 Windows 中寫程式如同於 Linux 一般?

最近因為工作的需要,很多程式都得在 Windows 底下編譯、執行。這對於大二之後就再也沒有寫過任何 Windows 程式的我真的是綁手綁腳,怎麼用都不習慣。雖然我認為 Visual Studio 真的很強大很好用,但是很多時候我們並不需要這麼龐大的 IDE,殺雞焉用牛刀呢?這時候就會開始懷念起 Linux 底下的 Vim 與 GCC 了… 之前就知道 cygwin 可以在 Windows 底下創造出一個符合 POSIX 的系統(另外一套是 MinGW),但是一直沒有去使用,畢竟自己手邊的電腦不是 Mac 就是 Ubuntu。也因為沒有真正去使用的經驗,所以我一開始是以為他的功能並不是很完整,頂多就是堪用罷了。直到我把我在 Linux 的程式丟到 cygwin 執行後,才驚覺它的強大!因為我幾乎不用任何程式碼,就可以直接產生執行檔,除了可以在 cygwin
5 min read

解決 Mac OS X 升級 Lion 之後不相容的情況

在美國時間 7/20 號,眾所期待的 Lion 終於出現在 App Store 上了,這也是 Steve Jobs 自豪的 Delta update,4GB 的 OS 升級檔完全透過 App Store 這單一管道取得。有著 SSD 的加持,下載+安裝大概花不到我兩個小時,而且整個系統出現的衝突比我預期的低非常之多,反而在我身上出現的問題竟是「文字編輯」與「預覽程式」!這也是我寫這篇文章的原因,就怕哪天重灌 Lion 又遇到相同的狀況…(希望不要),至於新系統的習慣問題,則可以參考這篇文章。 普遍都會遇到的相容性問題 在安裝過程之中,所有不相容的都會被丟到根目錄「不相容的軟體」之中,而在這一個版本,正是終結的 PowerPC 以及所有 PPC
6 min read
Android

為什麼同一台電腦上 iPhone Simulator 比 Android Emulator 快這麼多?!

答案其實就在字面上的意義,首先讓我們瞭解一下 Simulator 跟 Emulator 各代表什麼意思?大家中文上雖然都通稱模擬器,但是實際上是略有不同的: [image source] Emulator 中文翻譯為「仿真器」。那麼仿真器的定義是什麼呢?讓我們來看看 Wiki 怎麼說: An emulator in computing duplicates (provides an emulation of) the functions of one system using a different system, so that the second system behaves like (and appears to be) the first system. This
4 min read
Linux

為 Ubuntu 設置 Mac OS-like 的佈景主題

因為即將口試的原因,久久沒有發文。今天玩了一下之前就想安裝的佈景主題,在這篇文章簡單的紀錄一下安裝過程: 安裝環境 1. Ubuntu 10.10 2. Gnome 2.32如果是使用 Ubuntu 11.04 或者是 Gnome 3,因為兩者都是重大更新,可能就無法安裝此佈景主題。 佈景主題 首先,我們要先替換掉佈景主題,也就是把視窗控制按鈕移到左上變成紅綠燈,而佈景主題可以到 Gnome-look 下載。 Cairo Dock 換完主題之後,一定會覺得還少了些什麼,沒錯,就是最重要的 Dock! 原本以為 Ubuntu 上要模擬 Mac 的 Dock 可能會變成四不像,稍微瞭解了一下才發現自己太孤陋寡聞了XD,原來已經有個大名鼎鼎的 Cairo Dock! 至於怎麼安裝,這裡有非常詳細的圖文說明,如果不喜歡看英文的話,這裡也有中文的教學。
2 min read
Others

你還在乖乖的為「讚騙」網站按讚嗎?

因為 Facebook API 的開放以及龐大的使用人數,越來越多網站濫用按讚分享的機制(like),不顧長期的發展只求衝高點閱率。相關報導可以參考這裡。 在天空之城開創先例被罵翻之後,這類網站不但沒有變少,更是直接如法炮製。 為了抑制這種狀況,跟學弟們合力的推出了 Chrome 瀏覽器專用擴充套件,「I don’t like.」,詳細請參考介紹網頁。 套件的使用方式接近無腦般地直覺,在讀取網頁的同時就直接預載隱藏內容,可能也是因為簡單好用的關係,在 Facebook 一傳十、十傳百,擴充套件網頁的瀏覽次數在短短三天就到達了 4000 次!其中有 65% 的瀏覽次數都是因為點擊被分享在 Facebook 的連結而來,也難怪現在大家都是一頭熱的想辦法利用 Facebook 來行銷自家的產品,因為真的很有效啊! 話說三天的頁面瀏覽次數就幾乎接近本網誌開站七個月累積的總次數四倍之多呢…(苦笑) [更新 2011-04-21] 八天後 Pageviews 破萬: 相關文章: 1. [inside] 如何在一個月內衝進Alexa台灣百大網站第
2 min read
LaTeX

將使用 CJK 的範本無痛轉移到 XeTeX

在上一篇文章中,簡單的介紹了 XeTeX 使用中文字型的優點,但是它也不是沒有缺點的,在這篇文章中有提到,不過目前已經有套件可以彌補這些不足了,也就是這篇文章要介紹的 xeCJK。 透過 xeCJK 處理原本 CJK 的部份 簡單來說,xeCJK 就是加強版的 xCJK (相關介紹),透過這個套件,我們可以幾乎不用去更動之前用 CJK 寫的程式碼,只要在內文之前宣告好你要的字型,其餘的全部都交給它幫你搞定! 現在讓我們以台大論文範本為例,範本可以從這裡下載到,同時也有環境設定的教學。 1. 編碼問題 必須確保編輯器是使用 UTF8 without BOM 的編碼,並且在 thesis.tex 的開頭前兩行宣告這是 XeLatex 的程式以及使用 UTF8 編碼: %!TEX TS-program = xelatex %!TEX encoding = UTF-8 Unicode#
3 min read
LaTeX

XeTeX:解決 LaTeX 惱人的中文字型問題

相信大家或多或少都有聽過有名的排版軟體 LaTeX ,除了學習曲線比較陡以外,其實我一直以來都還算用得愉快,畢竟沒使用到中文。直到最近研究一下畢業論文的格式,在某些頁面必須用中文來寫,沒想到開始研究之後,才發現比想像中還困難… 簡單 LaTeX 環境設定 以前光是要安裝 LaTeX 的環境就是非常艱難的步驟,所以如果你對 LaTeX 完全不瞭解而隨意 Google 的話,到最後可能就是亂裝一通(光是 teTeX, xeTeX, chiTeX, gwTeX, *TeX, vim-latex, etc. 就夠你頭痛了)。其實隨著時間發展至今,LaTeX 的安裝已經非常簡單了,我們現在只需要: 1. 執行環境:Tex Live 2010 (幾乎支援各種主流作業系統) 2. 編輯器:Textshop, Textmate, VIM, etc. (只要可以編輯文字的都可) 如果是 Mac 使用者,
4 min read
iPhone

從 XCode 3.26 轉換到 XCode 4 所會遇到的問題

XCode 4 推出一陣子了,不知道有多少人改用 XCode 4 ?就我自己覺得,XCode 4 嘗試的改變與進步太多了,連帶而來就會產生在 XCode 3 所不會遇到的問題,關於 XCode 4 的使用與介紹我會留待以後講,今天這篇主要是記錄我轉換到 XCode 4 的痛苦歷程XD。 XCode 4 相關的 bugs 不只我以下列出的這些,更多的 Bugs:這裡。 一、無法切換 Provisioning Profile 在 XCode 3 之中,當我們遇到 Provisioning Profile 過期的時候,只要到 ADC 下載一個新的並且拖回 Organizer 覆蓋掉舊的即可從 Project Setting 中選擇新的
2 min read
Essay

我們真的有必要這麼懼怕核洩漏嗎?

因為日本福島大地震而引發海嘯,間接導致核心反應爐無法進行冷卻,而有核洩漏的風險。也因為這樣,導致全世界人人自危,開始討論核電廠的存廢問題,尤其接近 2012 總統大選,一堆政治人物就趁機操弄這個議題…,隨便列列就有一大串: 1. 非核家園 蘇貞昌:要有共識 2. 謝長廷嘆台日反核失敗 吹奏陶笛祈禱 3. 反核大遊行 蘇謝現身挺 3. 謝長廷:非核家園 節節敗退 4. 反核大遊行 籲加速廢核 5. 蔡提廢核時間表 蘇:應專業評估 幸虧不是每個人都隨雞起舞,看一下反對廢核的新聞: 1. 廢核路迢迢 全國省1年電 不夠台積電用1年 2. 2025廢核?台電:不切實際 當然,我不是說廢核不好,但這議題不應該是被政治人物所操弄,底下的有一些比較有意義的討論: 1. [mobile01] 哪一個國家是不採用核能發電的? 2.
4 min read

如何在 Mac OS X 10.6.7 中啟用 TRIM?

最近因為買了一顆 Intel 320 G3 SSD 120GB 的硬碟,稍微研究了一下,發現如果沒有 TRIM 指令的支援,隨著使用的時間,效能也會大幅度的衰退,於是開始尋找在 Mac 中支援 TRIM 指令的方式,首先先來瞭解到底什麼是 TRIM 指令? 傳統硬碟與 SSD 的差別 解釋 TRIM 以前,得先從硬碟說起,傳統的硬碟,在你刪除資料時,其實並沒有真的做出刪除的動作,而只是做出了一個垃圾標記並且視為可用空間。假設刪除動作之前,磁碟已經塞滿了,做完刪除動作之後,實際上還是滿的。但是因為傳統硬碟的特性,當你下一個寫入進來,硬碟會去尋找那些有標記為垃圾的磁區並且"直接"做覆寫動作。 那麼當現在主流硬碟逐漸轉變為 SSD 的情況下,會發生什麼事呢?其實對 OS 來說,
5 min read
Android

CyanogenMod 的統計數據

關於 CyanogenMod 的介紹以及如何使用可以參考官方的 wiki,簡單的來說,CM 就是負責提供客製化 Android ROM 的開源社群,而這些客製化過的 ROM 通常都會改善一些原廠 ROM 所不足的地方。 而在 CM 之中呢,如果你願意提供裝置資訊的話,CM 會把這些數據統計起來,然後呈現到 http://stats.cyanogenmod.com/。通常一般的使用者都不會去自己刷 CM,加上願意提供數據的也不多,所以參考數據總共也才快兩萬而已,但是我們還是可以來看看這有趣的數據: 第一名:HTC Bravo 第二名:HTC EVO 4G 第三名:HTC Desire/Nexus One 第四名:HTC Vision 第五名:HTC Desire HD
1 min read
Android

RenderScript: 不只繪圖,還有計算!

跟上一篇文章一樣,整理自 Android Developer Blog 。這次主要介紹的是「Compute」以及當初設計上的考量,而會使用 RenderScript 來做計算的原因是因為透過 RS 寫成的程式可以直接在多個處理器執行,替 Dalvik 減輕負擔。 讓我們一起來看看: RenderScript 的三大設計目標: 1. Portability: 應用程式不能因為硬體的不同就無法執行。光是現今的 ARM 規格就非常多變,例如說:有的有 VFP、有的沒有 NEON,或是不同的暫存器數量。更何況除了 ARM 之外還有許多不同的 CPU 架構(如: x86)、GPU、以及 DSP。 2. Performance:第二個目標就是在伴隨著 Portability 的限制之下,追求最大的效能。RS 一定要比現存的解決方案(如:
5 min read
clang

Clang 入門教程 - 解析 C 語言程式

在前幾天的文章中有稍微提到 LLVM ,今天則是要介紹從 LLVM 延伸出來的子計畫(subproject):Clang。 這個教程其實是參考"How to parse C programs with clang: A tutorial in 9 parts.“,那你可能會好奇說我這樣做不就是把它翻譯過來而已?不是的,因為 Clang API 快速的更動,兩年多前的程式碼早已不敷使用,所以範例程式的參考價值已經大不如前,於是我決定把範例程式重寫,這也就是此篇文章誕生的原因。 開始之前 你必須先編譯好所需要的 LLVM & Clang 函式庫,步驟可以參考這裡。因為此篇文章所用到了 LLVM 以及 Clang 版本為 r124522,如果讓程式保證可以執行,請在所有 svn checkout 的網址後面加上"
7 min read
iPhone

新手上路:上傳 iPhone 應用程式

最近寫了一個小程式,嘗試自己把它上傳到 App Store,經過了大概一個禮拜的 Review 過後,當然是 Failed。 蘋果果然是龜毛出名,但是也就是因為這樣才保證了程式的品質,幾點原因與經驗歸納如下: * 如果程式對硬體裝置有特殊要求,一定要在 plist 中嚴格設定 UIRequiredDeviceCapabilities * 小圖57×57跟大圖512×512要一致(或相近) ,不然會混淆使用者 * 不可以使用有 Apple 產品的照片 * 如果程式沒有要用到最新的功能,千萬不要手癢去更新最新的 SDK ,這樣會導致你編出來的程式沒辦法上傳,像我現在就得重新安裝 XCode。至少我沒有找到可以切換的方式…
1 min read
Android

RenderScript: Android 3.0 中使繪圖效能提升的祕密武器

Android 在繪圖的性能表現在差不多等級的硬體規格上,跟 iPhone 比起來一直都不怎麼令人滿意,就算是 NDK ,頂多就是與 iPhone 打平而已。於是 Google 從 2.0 在原始碼中就開始出現了 RenderScript ,也陸續看到使用 RenderScript API 的 Live Wallpaper 範例。 終於,經過大幅度的改進後,在 Honeycomb 中正式的發佈了這個量身打造的殺手級 Framework! 說了這麼多,讓我們從上面引用的官方部落格文章一起來看看到底有多厲害? 一、 專門設計來處理 3D Rendering,提供一個低階操作而高效能的 APIs 其實大家對新東西的出現會有排斥是難免的,所以 Google 也不是打算推出 RenderScript 來取代任何東西,而是給開發者多一個選擇。而推出這個的最主要目的就是給那些想儘可能提升自己應用程式效能的開發者族群使用。(或是將之使用在效能表現特別重要的部分程式區段) 二、 不只繪圖、還可以計算
3 min read
iPhone

usbmuxd: 用類似 ADB 的方式來存取 iPhone

開發 Android 的時候,我們可以透過 ADB (Android Debug Bridge) 進入 Android shell 來除錯。 而在 iPhone 通常只能透過 OpenSSH 來達到這件事,雖然也沒有多麻煩,但是網路多少還是會造成延遲。 只要透過 usbmuxd 就可以解決這個問題了! 1. 下載 libusb、CMake、usbmuxd (版本依該網站為主) 2. 在 usbmuxd 底下的 python-client 資料夾中有個 tcprelay.py,將權限更改為可執行 3. $ ./tcprelay.py -t 22:2222 ,其中 -t 的參數是透過多執行緒處理多重連線,而 22 是你 iPhone
1 min read
Programming

簡單而有趣的雙執行緒同步問題

今天看到一系列有趣的文章:1, 2, 3 主要是這樣的,作者聽到有人說像是 int, float 這些基本的形態都是 atomic ,也就是說只要是 int 的變數就不能能同時有兩個以上的執行入對他做寫入/讀取動作(至少一個操作是寫入)。所以作者寫了以下的程式來驗證這個說法:(篇幅關係,我刪減了一些程式中錯誤檢查部分) include #include #include #include #include #include #include #include #define INC_TO 1000000 // one million... int global_int = 0; pid_t gettid( void ) { return syscall( __NR_gettid ); } void *thread_routine( void *arg ) { int
4 min read
C

序:平行化程式設計(多核心編程)

平行化程式設計會越來越重要的這件事情,我想也不必我多說(因為從很早就開始被提倡了),早在幾年前,大家就注意到單核心高頻率的 CPU 是不可行的,為什麼呢? 1. Power:當 CPU 的時脈頻率一直提高,所耗費的功率也會呈指數上升,為了省電,只好放棄了繼續提高時脈的想法。 2. ILP (Instruction-Level Parallelism):不是每道指令都可以拿來管線化的,所以時脈再高也無用武之地。 3. Memory Wall:當記憶體頻寬跟不上 CPU 處理速度時,時脈再高的 CPU 也只是增加閒置時間。 因此,就演變成現在大家所熟悉的多核心處理器,隨著硬體的進步,軟體當然也要配合才可以發揮最大的效能。這就是此篇文章的目的,從抽象的角度先跟大家分享平行程式設計所應該注意的,有什麼工具、函式庫可以用?接著,會開啟一系列的文章來討論相關的議題。 回到主題,在寫平行化程式的時候,基本上我們應該要注意幾點: 1. Scalability:寫程式的時候,你絕對不可以因為這只跑在你的雙核心電腦上,就只用兩個執行緒(舉例)
9 min read
Python

Type System

Type System 往往是設計新程式語言時,最先考量的一個重要關鍵。 以下就來針對一般常見四種 Type System 用簡單的範例來介紹,避免混淆: 1. Static Typing 2. Dynamic Typing 3. Structual Typing 4. Duck Typing Static Typing 使用 Static Typing 的語言中,最常見的自然就是大家所知的 C/C++ ,也就是所有的型態都是靜態宣告,而且要明確的指出每個變數的型態,程式範例如下: void foo() { int a =1; int b =2; int c = a + b; } Dynamic Typing 而對於 Dynamic Typing
3 min read