Pages

Subscribe:

Ads 468x60px

Labels

2011年12月13日 星期二

Adobe放棄行動版Flash,轉進HTML 5

Adobe互動開發部門總經理Danny Winokur在官方部落格宣布這項產品調整策略,他表示,未來只提供安全更新,不再針對個別裝置推出新版Flash Player。



Adobe將停止開發行動版Flash Player,將資源轉投入HTML 5工具的研發。Adobe互動開發部門總經理Danny Winokur在官方部落格宣布這項產品調整策略,他表示,未來只提供安全更新,不再針對個別裝置推出新版Flash Player。

Adobe首席產品經理Mike Chambers也在部落格上坦言,Flash未獲主流行動平臺蘋果iOS的支援,導致Flash在行動裝置的普及率遠低於桌面裝置,因此,Adobe改將研發資源投入目前獲得行動裝置普遍支援的HTML 5技術。

不過,Adobe並未撤出行動市場,Danny Winokur表示,未來將集中資源來協助開發者,運用Adobe AIR技術封裝Flash應用,以發布成行動裝置上的原生應用程式。另外,Adobe也已投入Flash Player 12的開發,現已完成CSS著色功能,未來也會推出Flash和HTML 5的轉換機制。文⊙王宏仁
2011-11-21

詳見

紅陽科技線上金流平台交易資料外洩!

包括交易店家、消費者姓名、電話、訂單編號、交易金額、交易時間、IP位置,以及信用卡部份號碼等即時的交易資料,都可在網路上查詢得到。



提供第三方線上支付服務的紅陽科技線上交易平台傳出資料外洩,包括交易店家、消費者姓名、電話、訂單編號、交易金額、交易時間、IP位置,以及信用卡部份號碼等即時的交易資料,都可在網路上查詢得到。紅陽科技已經緊急修補網站漏洞,並預計在周三發佈新聞稿對外說明。

周日(12/4)晚十點鐘左右在Mobile 01論壇上出現一篇以「<01獨家新聞>線上交易平台漏洞,洩漏個人購買資料~」為題的文章,文章以網路截圖指證歷歷表示,此漏洞資料是即時更新的,作者並表示之前買完東西馬上就有人(暗指詐騙集團)來電說繳款失敗!

紅陽科技協理李宏鑫表示,早上在得知此事後,發現是Windows伺服器的安全漏洞所致,因此已立即進行修補;另外也已經請Google刪除搜尋的頁庫存檔資料。對於漏洞詳情李宏鑫未多所說明,但他坦承,此事件讓公司可能評估改用Linux。

對於有多少資料外洩,紅陽並不確定,但表示,早上發現時Google庫頁存檔資料約可查到300筆;iThome記者在下午四點左右查詢時約可查到近200筆。另外,根據Mobile01上署名為ient的網友表示嘗試改code之後,可以追朔資料到11月份。如果真如ient所言,那麼資料外洩的數字將遠比上述數字更加嚴重。

在後續處理方面,紅陽預計請客服專員向合作店家直接說明,而消費者方面則會透過e-mail或簡訊通知,另也會在周三發佈新聞稿對外說明。

據李宏鑫表示,公司合作的商家約3000家左右。不過,依據紅陽科技網站所提供的公司介紹,2005年時所提供的「 e`safe 代收代付金流服務」機制全台灣已有超過 4500 家企業及商家簽約採用,已有超過200萬人次的消費者使用過MSTS機制支付其日常消費。2005年每月透過「MSTS全方位金流服務」的流量高達 2.5億元,預估金流流量於年底前將達到每月 5億元。

李宏鑫表示,洩露的資料並未包含信用卡的完整資料,因此消費者不用擔心因此會被盜刷。另外,他也強調紅陽在資安上的重視,並表示紅陽已通過Visa及Master Card的PCI DSS認證。
2011-12-05

詳見

Android程式下載突破100億次

Android Market在去年7月創下10億次的程式下載,今年3月達到30億次,代表今年以來Android Market每月平均都有10億次的程式下載數。



Google周二(12/6)宣布,Android Market的應用程式下載量已於上周末超過100億次,為了慶祝此一里程碑,Google與開發人員協議讓Android用戶可以0.1美元添購多種受歡迎的程式,此一慶祝活動將維持10天。

Android Market在去年7月創下10億次的程式下載,今年3月達到30億次,代表今年以來Android Market每月平均都有10億次的程式下載數。

從周二開始,Android Market每天都可看到售價只要0.1美元的程式,目前上線的有Asphalt 6 HD、Color & Draw for Kids、 Endomondo Sports Tracker Pro、Fieldrunners HD、Great Little War Game、Minecraft、Paper Camera、Sketchbook Mobile、Soundhound Infinity及SwiftKey X等,10天內還會有其他優惠程式上線。

Android Market程式下載數的爆炸性成長歸功於Android手機的市佔率。市場研究機構Canalys今年第二季的調查顯示,Android手機出貨量已佔全球智慧型手機48%的比例,蘋果的iOS則佔19%。

目前Android Market約有超過30萬的應用程式,蘋果App Store的程式數量則超過50萬,同時App Store在今年7月的程式下載量就已突破150億,即使的應用程式數量與下載量現在皆領先Android Market,但市場認為在Android裝置數量不斷擴大的情況下,Android程式下載量很快就會超越iOS程式。(編譯/陳曉莉)

詳見

GFK:8月Android已佔台灣智慧型手機銷售量8成

8月手機零售通路銷售統計,智慧型手機銷售量已佔整體手機46%,智慧型手機銷售中高達8成為Android手機,其次是約1成的iPhone與不到5%的Symbian S60。



GFK對台灣零售通路8月調查指出,Android手機佔該月智慧型手機整體銷售量已達8成,在手機零售通路銷量佔比創下新高,遠超越iOS、Symbian等其他手機平台。

該調查是以台灣零售通路為對象,調查通訊行、電信通路與3C資訊通路手機銷售資料,不同於IDC、Gartner是以手機業者為對象,研究各家業者手機出貨至通路的數量。

根據GFK的8月統計資料,該月所有手機銷售約71萬支,其中智慧型手機共賣出33萬支,佔所有手機銷售量的46%,在手機業者、電信業者力推下,智慧型手機銷量已接近一半市場。智慧型手機銷售以Android遙遙領先其他平台,8成智慧型手機銷售為Android手機。

GFK分析師吳柏毅表示,Android手機銷售成長除了品牌手機、電信業者的支持外,還與其他平台在該季的表現下滑有關,包括微軟芒果機在8月尚未推出,蘋果尚未發表iPhone 4S,加上Symbian銷售下滑,都促使Android手機在通路銷售上取得高佔比。

該月智慧型手機平台表現,蘋果iPhone 4以1成左右的比重居次,Nokia的Symbian S60手機佔比不到5%,其他平台如微軟Windows手機、RIM黑莓機各自佔比不到1%。

吳柏毅表示,從季度資料來看,Android在第二季已拿下6成5的智慧型手機銷售,第三季雖然尚未完成統計,但8月Android手機銷量站上新高之下,第三季有機會達到7成以上。

智慧型手機銷售中,高階機種因規格、功能的豐富性吸引消費者青睞,約佔整體智慧型手機銷售的4成,而價位在5千到9千之間的入門級智慧型手機也達到2成左右。顯示本地消費者對智慧型手機喜好呈現高階、入門兩端發展。

除了GFK最新資料之外,統計手機業者出貨給通路數量的IDC,第二季報告顯示Android手機出貨已將近智慧型手機的7成,第三季因Windows手機、iPhone尚未推出新品,IDC預期Android手機出貨可能繼續增加。


詳見

App開發者一定要學會如何行銷

寫出「我要搭高鐵」App的王崇仁認為,自己開工作室發展軟體,除了英文能力要好,也必須學習如何推銷,以提高軟體的下載率

IT人物- Ollix工作室執行長 王崇仁

● 出生年:1985年
● 學歷:中興大學資訊工程系畢、目前就讀同校資工碩士班
● 工作內容:程式設計

公司檔案-Ollix工作室

● 服務項目:軟體開發
● 網址:www.ollix.com
● 軟體作品:我要搭高鐵、Music & Lyrics


在Apple的App Store上有一款名為我要搭高鐵的App,相當出名,它是提供查詢高鐵班次及訂票功能的軟體,雖然售價為4.99美元,但從上架至今已突破30萬人次下載,也曾經獲得臺灣總付費排行榜的第一名。

會獲得這麼好的成績,負責開發這套App的作者王崇仁說,是因為在開發時就以簡單、好用為前提,而且在推出後,也持續的更新功能,讓付費下載的使用者可以感覺到,作者是真正用心經營這套軟體。

因為找不到適合的App協助訂票,於是便開發了我要搭高鐵
王崇仁在大學時,便自己創立了Ollix工作室,他的理念是只做自己想要的東西,而我要搭高鐵就是這樣產生的。王崇仁是桃園人,而當時在臺中念書,所以時常搭乘高鐵往返兩地。因為覺得在網站上訂票及取票很不方便,所以他開始在App Store找能在iPhone上直接查詢並訂票的App,但是所找到的軟體,都沒有完全符合他想要的功能,於是他便有自己開發這套軟體的想法。

在2009年時,Ollix工作室先製作了我要搭高鐵的第一版,但因為第一次開發App,所以在功能上還不完整。直到2010年時,他認為自己的技術已經成熟了,便著手設計第二版並於年底推出,而甫推出便受好評。這一版加入了許多其它同類型App所沒有的功能,例如,可線上刷卡、支援早鳥優惠、即時座位檢查等。

從國小就自修HTML,慢慢累積程式設計的基礎
其實王崇仁在國小時就有接觸程式設計的經驗,一開始他先利用微軟的FrontPage軟體,製作了自己的網站,後來他看到別人的網頁,呈現許多的效果,例如,字體可以設定大小,甚至跑馬燈等,才知道原來那是用HTML寫出來的,於是開始學習HTML,爸爸也會買書給他看。王崇仁說,從小到大,他的電腦知識都是靠自修。

受到同學的影響,開始專注於程式開發
剛上大學時,其實王崇仁就跟一般大學生一樣,不知道自己將來要做什麼,甚至上課也都不專心聽講。直到大二時,有一天他在系上的電腦教室,看到一位同學鄧暐敦坐在電腦前,好奇地走過去看,想知道對方在做什麼?結果發現這個人正在翻譯英日文的電腦書,並且是利用自己開發的翻譯系統在工作。

王崇仁覺得很了不起,於是便詢問他,這套系統是用什麼程式語言寫的?鄧暐敦說,是用Python,因此他便開始學習這套語言,還特地買了一本Python的原文書來看。從此,他便熱衷於學習程式設計。

而在學習程式語言的過程中,每當遇到困難,王崇仁都會去請教鄧暐敦,後來他說,其實有問題可以上Google查詢,幾乎所有的解答都可以在上面找到。因此,他開始學習如何使用Google來解決所碰到的難題,例如,在欲查詢的字串加上雙引號,可以得到更精確的搜尋結果等。而他的經驗是,Google真的可以解決95%以上的問題,所以他得到了一個結論──要學程式語言,必須先學會使用Google查詢。也因為這樣,現在只要有學弟、妹來問他關於程式設計的事情,他也會先請這些人去網路上尋求解答。

除了熱衷程式設計,也喜歡拍照
由於王崇仁認真學習程式設計,在大學時就發展到很不錯的程度──他自己利用Python寫出了一套選課系統。他說,由於大學有些課程非常熱門,所以很難選到,而一些網路上可以下載到的滑鼠連點程式,又不好用,所以才會想開發這套系統。他保證,只要使用他這套程式,絕對選得到課。

而除了程式設計之外,他也喜歡拍照,還買了單眼相機,他會將自己認為拍得好看的照片,上傳到國外一些專門出售照片的網站,例如Shutterstock等拍賣,但因為這類網站在國外有好幾個,而每個網站的分類排序又不一樣,所以要分開上傳時就很麻煩,於是他寫了一套叫Micro agent的程式,它的功能是可以去搜集這些網站的關鍵字,並搜尋前一千張熱賣的照片,然後利用演算法去分析,最後主動將想上傳的照片依照這些網站的分類分好。

不斷創造練習英文的機會,增加自己的國際競爭力
王崇仁提到,想當個程式開發者,英文能力一定不能太弱,至少在讀跟寫方面要沒問題。因為在臺灣,程式設計的相關資源沒有國外豐富,所以想要習得更高的技巧及觀念,必須要到國外網站去找尋資源。

談到這裡,他在大學時有個有趣的小故事。他立志朝國際發展,因此知道英文的重要性,所以無論什麼作業,他都全部用英文去寫。因為他的想法是,這些老師都是留學回來的,所以他天真地認為,只要用英文交作業,那些老師就會順便幫他訂正文法。但結果是,作業發回來只有分數,根本就沒有幫他訂正,那時他有些失望。

雖然他想到的這個學習方法不管用,但他還是不斷找機會學習英文。例如,他只看原文書,遇到不懂的單字或片語,一開始會去查中英字典,但到後來都只看英英字典了,他說這樣學英文才會快。而他在考研究所時,自傳也是全部用英文寫的。由於持續練習英文,目前他的英文程度已經是不錯了。他笑著說,現在回頭去看大學時寫的那些作業,心裡都會想,天啊,這種文法當初怎麼可能寫得出來。

而他希望有一天,當國外有人邀請他上臺演講時,他可以用流利的英文演講。另外,因為他在大學就立志當獨立開發者,但他知道自己沒錢找別人幫他行銷,所以大學所修的輔系,他選擇了行銷系,他說念行銷對現在推廣他的App很有幫助,例如訂價策略,將售價訂的比其它同類型App高,是因為消費者對於價格較高的商品,都會有品質較好的想法。而在提高售價後,下載次數的確成長了不少,這些技巧都是當初念行銷系學來的。

堅持理念做自己,不接外包的案子
Ollix工作室成立至今,雖然有許多大企業找他們合作,甚至連政府機關都有,但都婉拒了。因為如果接受這些案子,那麼就會有時間上的限制,這跟他們的理念不符合。他們寧願多花一些時間讓App的品質更好,也不願意因為期限的關係,讓他們覺得不夠好的作品匆促上架。

而在程式開發上,王崇仁說,他們是比較狂熱的工作者,如果碰到問題,就會不斷的去思考如何解決,因此通常在一天之內就可以處理完。

最近,他們又有一套新的App上架了,這是一套iTunes的歌詞播放軟體,名為Music & Lyrics,它的功能是在播放音樂時,會自動上網下載歌詞,而特別的地方在於,這套軟體可以將簡體自動轉換成正體,他說,轉換的準確率甚至比Google的翻譯系統還高。

夢想邊工作邊環遊世界
他們的夢想是環遊世界,王崇仁說,曾經看過一個攝影師,邊旅遊邊拍賣沿途記錄下來的影片,完成了環遊世界。因此,他希望有一天也能靠著App及出售照片的收入,無憂無慮地完成這個夢想。文⊙胡仁禮

詳見

非官方統計:Android應用程式已超過20萬種

雖然Android Market建立之初應用程式數量的成長速度曾令人擔心,但隨著愈來愈多Android裝置的出爐,也吸引了更多開發人員投入Android程式的開發。



專門偵測Android Market應用程式數量的AndroLib本周的數據顯示,Android應用程式數量現已突破20萬。

Google曾在今年10月底宣布Android Market應用程式數量已突破10萬,若AndroLib的估計確實,顯示了Android應用程式數量在兩個月內就成長了一倍。

雖然Android Market建立之初應用程式數量的成長速度曾令人擔心,但隨著愈來愈多Android裝置的出爐,也吸引了更多開發人員投入Android程式的開發。Google在12月初發表Nexus S時曾表示,迄今市場上已有超過100種不同的Android裝置,且平均每天啟用20萬個Android裝置。

蘋果現仍保持應用程式龍頭位置,旗下的App Store在今年11月就提供超過30萬種應用程式,不過,隨著Android逐漸佔領智慧型手機市場,勢必會吸引更多的開發人員,先前即有多份調查報告透露開發人員最看好的應用程式平台是Android。

Gartner估計Android手機的全球出貨量在今年底將能超越黑莓機,成為全球第二大行動平台,並在2014年挑戰Symbian的龍頭位置。(編譯/陳曉莉)

詳見

2011年12月11日 星期日

Motivation
源起
I have developed a lot of programs, so alought there is no one formal description, I already have one set of naming rules. Recently, I took apart in several group-developing projects. These exprements make me feel that: something such as naming is unnecessary (even awkward) if it is hardness; but is important to list them if you need a general direction.
雖然不能稱得上非常多,但是我個人開發過的程式還算不少,所以雖然沒有很正式的規定,但是已經有自己的一套命名規則;加上最近參加過幾次團體開發的經驗,覺得這種東西,硬性規定的確沒有必要,或者說,還蠻鳥的,不過提些大方向,尤其是條列出來,還蠻重要的。

This document will list several basic naming rules, maybe a few concepts about source code writing. In addition, I will suggest some minor issues, such as indenting. But just like many other documents on Internet, do that as a natural sequence is most important.
這份文件打算條列出一些基本的命名規則,或許還會寫寫一些關於原始碼的想法,什麼地方該怎麼寫,什麼地方不該怎麼寫;還有些更無關緊要的,像是縮排要幾格?我會提些建議,但是就像其他網路上文件提過的,自己習慣還是最重要的。

Variable Prefixes
變數前置字元
Prefix Meaning Description
g global Always used on global variables. But some global variable such as those in a library but that library doesn't provide any interface to access them, because they are global only in their own library, conceptually they are local in that module. So I will use m_ as a prefix on these variables.
通常使用在全域變數上,但是有些全域變數,像是一個函式庫的全域變數,因為它只在那個函式庫中全域,在概念上,我覺得反而比較像是那個模組裡的區域變數,所以這時我會選用 m 開頭,而不是使用 g 。
m module, member You could think them as module variables or member variables. But I like conceptual explanation more personally. So whenever I name an variable, not only class member variables will be prefixed by m_. Above situation is a example. Basically, only variables which span two or more modules will be prefixed by g_.
模組和成員變數,這兩種解釋都通,但因為我個人比較喜歡概念上的解釋,所以通常在使用上,不是只有在物件中(物件才有成員變數)才會用到 m 開頭的變數,上面提的例子就是一個,基本上,會超越模組(跨模組)使用的變數我才會以 g 開頭。
s static In principle, I will use s_ on those variables which are specified by static keyword (in C/C++). Of course, this kind of variables is rare. If you have a lot of s_ varialbes, there are two possible reasons: 1. your program is very special, or 2. you make a mistake! (maybe you confuse the concept of static variable.) Besides, some people like use st_ to be a prefix of static variables. Maybe st_ comes from static, but since one character will not confuse with other prefix characters, why we use two characters?
靜態變數,原則上,使用 static 這個關鍵字(在 C/C++ 語言中)的變數,我就會使用 s 開頭,當然,這在程式中是很少使用的,靜態變數多有兩種可能,一個是程式特殊,另一個就是你寫錯了!或是搞錯靜態變數的概念,基本上應該是不常用到才對;另外也有人喜歡用 st 開頭,取自 static 吧,不過既然一個字元就不會重複了,沒什麼必要用兩個字元。
local There is usually no any prefix before local variable. Here "local" means usually the area between two braces of functions. I list a identical variable in four representations: g_foo, m_foo, s_foo, and foo.
區域變數,通常前面是不會有任何前置字元的,而這邊所謂的區域,通常在函式的兩個大括號中間。這邊列出同一個變數,用四種表示法分別為 g_foo, m_foo, s_foo, foo 。

Variables Type
變數型態
Type Meaning Description
a array 老樣子,我還是喜歡邏輯上的意義,所以同樣是 int * 的型態,如果變數是代表著一個整數陣列,就用 a 開頭,若是代表著一個整數指標,則用 p 開頭。
ch char 字元型態,我不知道有沒有人只有 c 開頭的就是了。
d double 就目前來講,我希望所有浮點數都是倍精確度,所以只有定義 d 開頭的代表 double ,而沒有指定 float 所使用的縮寫。
f flag 其實應該就是布林代數,不過 C/C++ 語言中並沒有這個型態,我個人習慣使用 BOOL 來代表這個抽象型態;其實還有另一種命名法,就是使用 b 開頭代表 boolean ,然後 f 就可以用來代表 float ,但是至少目前我打算採用。
h handle, height 如果用過 handle 這種抽象型態的人,應該知道特地定出來是有其必要的,當然,如果沒用過,就別理它了;另外在不會搞混的情況下,代表高度的變數用 h 開頭也不錯。
i index, int 通常都用來當做索引變數,或是整數變數,雖然我比較喜歡前者,但是整數實在是太常用了,所以在我的程式碼中還是蠻常採用後者。
l long 長整數。
n number 通常用來代表量的變數,配合 i 使用不錯,例如 for (iFoo = 0; iFoo < nFoo; ++i) 。
p pointer 代表某種型態的指標,通常還會配合其他的型態。
sz string end of zero 以 NULL 結尾的字串型態,通常是 char * ,至於為什麼要叫 sz ,則是學別人的,也有人用 str (因為 string ),當然,也有人只有 s 開頭的(因為沒有別的型態衝突)。
t time_t 不一定是 time_t ,代表時間的型態應該都可以使用 t 開頭的變數。
u unsigned 無號數,通常會配合其他的型態一起使用。
w width 代表寬度的變數,通常會和 h 開頭一起用。

Variable Naming
變數命名
由於除了型態和前置字元之外,剩下部分的命名就跟英文沒什麼差別了,所以也無法一一列出,在這邊只會列出一些大方向,以及建議,沒有一定,重點有兩個,首先,自己要看得懂,用起來覺得方便(簡潔),再來,就是希望別人也能一眼就看出來,不然就失去了定標準的意義了。

最簡單的,像是 i, j, x, y 還有 tmp 之類的變數,不用增加多餘的字元了。
一定要使用之前的提的前置字元和型態。
還有一套專門給 Windows Programming 的型態命名法,像是 wnd, bmp 之類的,可能有空再整理出來。
對於不在上面所列的型態(前置字元應該不會有例外才對),取縮寫的方式如下
刪母音,例如 region 可以縮成 rgn (這例子是學 MFC 的), table 可以縮成 tbl 。
取前面數個字元,例如 prefix 可以縮成 pre , binary可以縮成 bin 。
上面兩種,取意義比較明顯的那一個,像是 prefix 只取母音的話變成 prfx ?而 region 取前三個字元的話變成 reg ,太廣泛了,要想到 region 很難,我猜很多人會想到 register 吧?
有時可以多取幾個字元,像是 function 縮成 fun 或許不怎麼樣,但是縮成 func 就不錯(也有人縮成 fn 就是了)。
若是懶得想,或是都沒什麼意義,建議還是採用刪母音的方法。
最後,能短就短,不過有時為了意義要表達清楚,最後整個單字都用上了也無可厚非,看個人喜好,在這邊是建議越簡潔越好。
一個整數陣列要取成 aiFoo 還是 iaFoo 呢?我的習慣是前者,我覺得知道這個變數是一個 array 比知道每個元素是 int 要來得重要;它是一個陣列,而不是一個整數。
同理 piFoo 和 ipFoo 我也是喜歡 piFoo ,因為說到底, piFoo 是一個指標,不是一個整數。
那 paiFoo 跟 apiFoo 有什麼不同呢?前者代表一個指向(整數)陣列變數的指標;後者則是代表一個陣列變數,其中每個元素都是一個(整數)指標。這樣又有什麼不同?邏輯上不同罷了,程式碼都是 int * * ,不過在使用上會有差, (*paiFoo)[i] 跟 *(apiFoo[i]) 才是有意義的,而 *(paiFoo[i]) 跟 (*apiFoo)[i] 可能會使程式當掉。
其他的部分,就把整個變數的意義直接用英文打出來即可;取縮寫的技巧可以參考上面提的。
例如一個依據原子密度來排序的陣列,其中第 i 個元素表示第 i 個原子的密度是在所有原中子的名次,這個名次,我想用 int 就可以了,那麼這個陣列變數我會命名成 aiAtmDnstyRnk ;其中 Atm 代表原子( atom ),Dnsty 代表密度( density ),而 Rnk 代表排名 (Rank) ,至於順序則是用語言的習慣,"原子密度的排名",最後一個詞最為重要,通常在語法上是名詞,有人說英文是 rank of atom-density (rank of density of atom) ,這就真的看個人了,我喜歡把代表性的名詞放在最後,也可以放在最前,其他的順序,就真的不重要了,甚至去掉變成 aiRnk 也無妨(在不會混淆的情況下)。
再強調一次,能短就短,有時取太長,還不如在宣告的地方加個註解來得清楚。
Function Prefixes
函式前置字元
Prefix Meaning Description
i inline inline functions, which are after "inline" keyword (in C++). Because inline functions are more efficient so I create the prefix character. Then whenever I want to call some functions, I could find inline functions first for efficiency.
擁有 inline 這個關鍵字的函式,這是只有在 C++ 中才有的, C 語言並沒有。另外,使用這個函式並沒有什麼特別,我當初定的原因只是因為 inline function 執行起來比較有效率,加上這個前置字元時,我會知道呼叫這個函式會比較有效率罷了。
m module, member You could think them as module functions or member functions. But I like conceptual explanation more personally. So whenever I name an function, not only class member functions will be prefixed by m_. Even some public class member functions, I wouldn't use m as their prefixes. Only pretected and private class member functions are prefixed by _m_. Besides, some functions in a library, although they are not class member functions, if that library doesn't provide a interface to access these functions (so-called module function), then I would use _m_ as their prefixes.
模組和成員函式,這兩種解釋都通,但因為我個人比較喜歡概念上的解釋,所以通常在使用上,不是只有在物件中(物件才有成員函式)才會用到 m 開頭的變數,事實上,在物件中若是 public 的成員函式,我依然不會加上 m 的前置字元,只有受保護的成員函式( protected, private )我才會用;而在某些函式庫中的函式,就算不是一個物件的成員函式,但是若是這個函式庫沒有提供此函式的介面給外界呼叫,如同 m 的變數一樣,我稱之為模組函式,應以 m 開頭。
s static In principle, I will use s_ on those functions which are specified by static keyword (in C/C++).
靜態函式,原則上,使用 static 這個關鍵字(在 C/C++ 語言中)的函式,我就會使用 s 開頭。
other There is usually no local functions. So global (so-called "other") functions are the most common. I list a identical function in four representations: _i_foo(), _m_foo(), _s_foo(), and foo().
通常函式是不分全域還是區域的,所以這邊所謂的其他,就是一般的全域函式。這邊列出同一個變數,用四種表示法分別為 _i_foo(), _m_foo(), _s_foo(), foo() 。

函式的前置字元應該是我自己定的,至少,我沒有參考過別人的文件;至於之所以變數的前置字元是 m_ 開頭,而函式則由 _m_ 開頭,這多一個底線的原因,主要是因為排序的關係,我希望同類的函式能排在一起,而是沒多這個底線的話,那麼所有模組函式可能會和一個 m 開頭的一般函式排在一起,我覺得很醜,所以才這樣定。

Function Naming
函式命名
函式命名和變數命名大同小異,除了函式不要求型態之外(沒看過有人要求,我目前也覺得還好),還有我自訂的函式前置字元,應該沒什麼特別的,但是下面還是列出一些在函式命名和變數命名上的差別。

通常在 C 中,大家喜歡全小寫的函式名,中間用底線分開;例如 get_car_speed() 。
通常在 C++ 中,大家喜歡用大寫的字來分隔單字;例如 GetCarSpeed() 。
通常在 JAVA 中,大家喜歡用小寫開頭,但是又用大寫的字來分隔單字;例如 getCarSpeed() 。
函式通常最重要的意義在動詞,放在最前面,像上面的例子"取得車子的速度",用這個順序幾乎沒有人會有意見。
函式取縮寫的習慣似乎不怎麼普遍,完全不縮寫也蠻常見的,不過還是可以取,像是 rgb2hsv() (原本應該是 convert_red_green_blue_format_to_hue_saturation_value_format() 才對);其中 red 等縮成 r 蠻直覺的,而用 2 取代 to 更是常見;然後利用 to 的意義,進而省略 convert 也蠻直覺的。
上面的例子,雖然很特別又有點極端,但是又說明了一次,能短就短,何況函式的註解相當重要,所以與其取一個長到懶得打的函式名,還不如在旁邊寫一個詳細的註解。
Indent
縮排
使用跳格 (Tab) 字元當作最基本的單位。
跳格建議設為 8 個空白,很多人會不習慣,但是空白越多,在視覺上越輕鬆,用一用就會習慣了。
函式的左大括號,必須換行,例如

void foo() // here need a new-line
{
...;
...;
...; // here need a new-line, too
}
迴圈 (for, while) 以及條件 (if, switch) 的左大括號,皆不用換行,例如
for (...) { // watch here, only one new-line
...;
...; // here need a new-line, too
}
while (...) { // watch here, only one new-line
...;
...; // here need a new-line, too
}
if (...) { // watch here, only one new-line
...;
...; // here need a new-line, too
}
if (...) { // watch here, only one new-line
...;
...; // here need a new-line, too
} else { // watch here, only one new-line
...;
...; // here need a new-line, too
}
switch (...) { // watch here, only one new-line
case ...: // no any word after colon
...; // here need a tab
break; // here need a new-line, too
default:
...; // here need a new-line
}
結構 (struct) 宣告的左大括號,必須換行,例如
struct // here need a new-line
{ // here need a new-line, too
double d;
int i; // here need a new-line
};
下面是我常用的程式碼,順便提一下 typedef 應該如何使用
typedef struct _DOUBLEandINDEX // the struct name is a suggestion
{
double d;
int i;
} DOUBLEandINDEX, * LPDOUBLEandINDEX; // here are two types
上面有提到結構的命名,通常跟其變數或是函式命名的原則差不多,但是如果要用來當一種型態的話(使用 typedef 定義過後),我建議全部用大寫;至於上面名稱中使用小寫的 and ,是為了分隔前後兩個單字,這樣可以一目了然這個結構倒底長什麼樣子;記得在 struct 後面的名稱中加個底線(也有人喜歡加 tag 這個單字,小寫),這樣後面才能使用。
物件 (class) 宣告的左大括號,必須換行,例如
class Car // here need a new-line
{ // here need a new-line, too
protected: // no tab, need a new-line
BOOL m_fDoorClosed;
int m_iSpeed;
public:
void CloseDoor();
void OpenDoor();
void SlowDown(int iDiff);
void SpeedUp(int iDiff); // here need a new-line
}
除了縮排外,上面提到物件的命名,跟結構不同,我建議首字大寫,其餘字母小寫,分隔時也使用大寫,例如 class MyCar ;中間的程式碼我沒有省略,主要是因為我想提醒一下之前的命名法,實際上使用大概就像這樣。
我要提一個自己訂的名詞,單行縮排(英文就先用 inline indent 好了,所以也可以叫行內縮排),因為我雖然有看過別人這樣縮,但是沒看過文件提起過,下面用實例來說明比較方便
double * adDnsty = NULL; // density of each atom, need to free
int i; // iteration variable
int iMax = -1; // index of maximum rank
int iMin = -1; // index of minimum rank
double * adDnsty = NULL; // density of each atom, need to free
int i; // iteration variable
int iMax = -1; // index of maximum rank
int iMin = -1; // index of minimum rank
看得出上面兩塊的差別嗎?我在每行中,都加入了不等的跳格鍵,為了什麼?只是為了方便閱讀而已!通常一個變數的宣告,習慣好的話,會有四個部分,型態,名稱,初始值,以及註解;上面第二塊的程式碼,就有分別對這四塊部分做縮排,現在我把跳格鍵畫出來再看一次

double *^t adDnsty = NULL; // density of each atom, need to free
int^t ^t i;^t ^t // iteration variable
int^t ^t iMax^t = -1;^t // index of maximum rank
int^t ^t iMin^t = -1;^t // index of minimum rank
上面有底線的部分,就是跳格鍵,不過有些地方是連續兩個跳格鍵,所以我會加上 ^t 的記號;而那些沒有底線的空格,就是一個空白鍵而已。不難看出來,我只對四個部分做縮排(所以一行有至少有三個跳鍵)。

而像 double * ,雖然中間有空白,但我認為整個(包括星號)才算是型態,所以就用空白;或是 = NULL ,因為大家都有 = 這個字元,所以只要前後都用跳格鍵,那這邊就算用空白也會很整齊,何必讓整行又變得更長?

另外像是 int i 那行,沒有初始值,或是 double * 比其他型態都多了一格跳格,這時就會發現 ^t 的數目不太一樣,調整這跳格字元的數目就是我所謂的單行縮排,通常在變數宣告的地方使用,例如結構宣告,物件宣告,在函式開頭做區域變數的宣告等,有時可以一群一群相關的變數才對齊,否則相當費時且如果有個變數更動,全部都得更著改,反正,只要自己看起來覺得整齊就可以了。


詳見