Category Archives: 程式編寫

愛上 Node.js 的理由 – JavaScript

愛上 Node.js,其 non-blocking event loop 是其一,更重要是 JavaScript 語言! Declare 一個 object var m = {}; 再在 array 上用 for each,把 name 加入 object names.forEach(function(val){ m[val.name] = 1; }); 最後一句便可抽出 unique name 再排埋序 Object.keys(m).sort(); 神奇的 JavaScript!有咩理由唔愛上 Node.js 而用累贅又食 RAM 的 Java。身為 OCP: Java SE 6 的我是學 JavaScript 先,起初是用來做一些唔特洗的網頁特效用,之後 AJAX 興起,就用來做 dynamic 客戶端網頁,到 Node.js,JavaScript 更可在 server 上運行,其執行快速是建基於… Read More »

用 gorush 來談談 Google Go

一直都好想寫一個 Push Notification 的 portal/server,來提供 HTTP RESTFul API 給需要 push notification 的 program。這樣可以集中處埋 push notification,各 program 不用重覆 push notification 的部份,不用 “reinventing the wheel”。 結果,我在 GitHub 這個大寶藏發現了個 grouch! gorush支援 iOS 及 Android 的 push notification,可以用 command line 快速測試,也可以用 server mode 長駐。它本身帶有 portal 及 stat API,用來查看 server 及 push 狀態,可謂一應俱全。它用 GO 寫成,這個是它的一大好處。何解?那就談談 GO。 GO 是 Google 的產品,它的歷史可以自行… Read More »

淺談 Node.js 的 callback 及 JavaScript object reference 的特性

Node.js 是用 Chrome V8 JavaScript engine 發展而成。V8 快的原因在於應用了 JIT 以及把 JavaScript 先 compile 成 C++ 再執行。而 Node.js 快的原因除了因使用了 V8 外,就是其著名的 event-driven / callback 機制。Node.js 把 time consuming 的 tasks 例如 disk IO、DB access、network requests 等,包裝成 callback。CPU 不會等回應就繼續執行。 初學者會覺得好困擾,個 program 不知何解有時能正確返回結果,有時就不能。原因在於 callback 及跟 JavaScript object 的 reference 特性有關。 能正確返回結果的原因是 CPU 剛巧被其他 task 阻一阻,以致幸運地等到了 callback,而 object reference… Read More »

從 Python 3.6 的 PEP 529 看 Windows APIs

談談 Python 3.6 中的 PEP 529 Windows 版的 Python 去到 3.6 才改用 UTF-16 APIs,在此之前一直使用 ANSI APIs。 這個要從 Windows 的歷史講起。Windows 9x 系列 (95 – Me),原生並不支援 Unicode (在 2001 年 Microsoft 推出了 Microsoft Layer for Unicode 令 9x 支援 Unicode,但 2001 年已推出了 Windows XP)。在 9x,它是使用 multibyte code page 來支援非 ANSI (英文) 字元。 與此同時,差不多並行推出的 Windows NT 系列 (NT… Read More »

C++ string stack overflow

收到一個 Win32 C++ program,發覺 input 大 file 時,執行途中會掛掉。查看 source code 後估計好大機會是因為 stack overflow。 改左幾句,把 wstring 改做 wchar_t 及改埋相關的 functions 便解決了 stack overflow 問題。原因是「新」C++ STL 是會把短 string 放 stack,長 string 才放 heap,咁做是為左 performance 考量,要知道 stack 快過 heap 好多。但超大量短 string 就會做成 stack overflow。結果修改後,便能正常運行。 點解用 wchar_t 唔用 char,是因為要處理中文,char 要用 UTF-8 編號才可放非英文字元。在近乎全中文下,UTF-8 比 UTF-16 不但運算慢,也需要更多存儲空間。 下一步就是把 program 移植到 Linux,寫左個… Read More »

易學難精的 JavaScript

JavaScript 是公認的神奇語言,易學難精是佢的特點。以下是我如何為 console.log 寫一個 wrapper,記錄時間、Level、Class、Function。簡單一個 wrapper 已用到 arguments、 call()、apply()。

CT File Encrypt – OS X

由於 Qt 4.8 在新版 OS X drag-and-drop 時 QMimeData 的 url 會有問題,必須升級 Qt 5,而 Qt 5.4 source code 有個 struct _Nullable,咁岩 clang 新版又加了 Nullable。要自己 patch 先 compile 到。Qt 5.5 又有其他問題。搞左好耐,終於出到 OS X GUI 版 (之前只能用 command) 下載:CT File Encrypt

CT File Encrypt

CT File Encrypt 可以把你重要的文件、相片用 AES-256 加密。 點解要自己整,市面已有好多依類軟件?原因之一是我覺得自己寫安全一點,沒有後門。但最重要是坊間找不到同類的:一拖即加密/解密、無須密碼! 使用場景:先把有個人資料的文件加密再放上雲存儲或由互聯網傳送、唔想放 share folder / NAS 的東西給同事、家人看到 我好怕記密碼,複雜的怕唔記得,簡單的又怕唔安全。SSH 登入 Linux / OSX 都用 private key 的我,就寫了一個用 key 來加密/解密的工具。簡單、易用、安全就是設計理念。 看回 git 記錄,2014 年 8 月已開始整,2015 年 5 月我已一直用,其間有畀過其他人試用,開始時已計劃開源,只是沒有時間整埋源碼,今次終於放上了 GitHub 了。 重要訊息: 第一次開啟時,會在 %USERPROFILE% 中建立 key 這個檔案。這個 key 是唯一的,萬一不見了,我也沒有辦法幫你解密檔案,請小心保管!可以用 7z AES-256 把它備份好。 已知問題: 1. 未有 OS X 版 2. 未支援資料夾 (可先… Read More »

JavaScript array with named index

JavaScript 其中一個 Magic 的地方就是 array 可以有 named index,即是 var arr = []; arr[‘blue’] = 1; arr[‘red’] = 2; 但當 JSON.stringify(arr) 時,只會出現 []。如果真的要 stringify,那麼就只能只用 map,即是: var arr = {}; // 或直接 var arr = { blue:1, red: 2}; arr.blue = 1; arr.red = 2; 用 map 都可以當成 array 用, var keys = Object.keys(arr); 就可 iterate keys… Read More »

node(.js) 和 JavaScript 很給力

我愛 Google Go,但也喜歡 node。有人說 node 不濟,因為 JavaScript 很爛。的確,JavaScript 很爛,但也很有趣,很神,識得用會好好用 node(.js) 真的很神奇。其實應該是 JavaScript 很給力!簡單地就用到 log4j 的效果 // logger.js exports.getLogger = function(className){  return {   now: function(){ /* 省略 */},   info: function(message){    console.log(this.now() + ‘ [‘ + className + ‘] ‘ + message);   }  }; } // 之後,只要的用法就如著名的 log4j 一樣 var logger = require(‘./logger.js’).getLogger(‘main’); logger.info(“hello world”);

JavaScript String

JavaScript String 本身是沒有 trim function,但透過簡單 regular expression 便可做到: String.prototype.ltrim = function(){ return this.replace(/(^\s*)/g, “”); } String.prototype.rtrim = function(){ return this.replace(/(\s*$)/g, “”); } String.prototype.trim = function(){ return this.replace(/(^\s*)|(\s*$)/g, “”); } 還有這個用來測試是否 ASCII 也很實用: String.prototype.isAscii = function() { return !/[\u0080-\uFFFF]/.test(this); }

fork and printf

題目:請問下面的程序一共輸出多少個 “-“? #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> int main(int argc, char *argv[]) {  for (int i = 0; i < 2; i++){   fork();   printf("-");  }  return 0; } 就咁睇,答案是 6,但實際是很 tricky 的 8。這是 printf 把 "-" 放到了緩存中,並沒有真正的輸出,在 fork 的時候,緩存被複製到了子進程空間,所以,就多了兩個

解決 LLVM compiles Reachability.h warning 問題

Apple 提供很多 sample code 給開發者作為參考之用。其中有一個叫 Reachability,用來測試當是用者的 internet 連線,但用上 LLVM Compiler 後,會出現以下 warning: Reachability.h: warning: Semantic Issue: Declaration of ‘struct sockaddr_in’ will not be visible outside of this function 其實可以很簡單解決,只需在 Reachability.h 開頭中,加下以下一句: #import <netinet/in.h> 就可解決了

開放 MP3 ID3 編碼轉換及編輯工具已收藏於 Softpedia 資料庫

收到 Softpedia 通知,開放 MP3 ID3 編碼轉換及編輯工具 (MP3 ID3 Tag Encoding Converter) 已收藏於 Softpedia 資料庫 想不到有人留意及使用我的作品,得到肯定,感到十分鼓舞 Windows 版: http://www.softpedia.com/get/Multimedia/Audio/Tag-Editors/MP3-ID3-Tag-Encoding-Converter.shtml Mac 版: http://mac.softpedia.com/get/Audio/MP3-ID3-Tag-Encoding-Converter.shtml

開放 MP3 ID3 編碼轉換及編輯工具

大家有無發覺 d 中文歌拖入 iTunes 時,歌名歌手名變晒亂碼?其實原因好簡單,就是 iTunes 只接受 Unicode 作為 MP3 ID3 tag 的編碼。即是如果 MP3 制作者用 Big5 或 GBK 輸入 MP3 ID3 metadata,你放去 iTunes 就會亂碼。坊間都有工具把 ID3 轉成 Unicode,最出名的是 “Unicode Rewriter”,以 Java 寫成。缺點是它要求使用者輸入來源編碼,無法自動檢測,再者其 Swing 介面很醜,自從 0.1 之後無再開發了 我決定用 C/C++ 重作這個 MP3 ID3 Tag Unicode Convertor,終於在這個農曆新年假期完成了: 開放 MP3 ID3 編碼轉換及編輯工具 ID3 標籤多應用於MP3格式的音訊檔案中。它可以將相關的曲名、演唱者、專輯、音軌數等資訊儲存在 MP3 檔案中。 資訊文字可以以不同編碼儲存,但多數現代 MP3 播放器如 iTunes、VLC… Read More »

編碼轉換

UTF-8、UTF-16、Unicode 之間的轉碼可以透過運算方法進行轉換,但 Unicode 跟 Big5 的轉碼就要方透過字碼表 Mozilla 台灣社群就收集了各種泛 Big5 的 b2u 跟 u2b 對映表 (mapping table) http://moztw.org/docs/big5/ 當然你也可以使用現成的 iconv 或 Windows API 進行轉換

淺談 Unicode、UTF-8、UTF-16 和 UTF-32

淺談 Unicode、UTF-8、UTF-16 和 UTF-32 電腦其實只以儲存和處理數字,而電腦的數字是以二進制的,亦即只有 1 和 0,要電腦處理文字,首先要為文字編上一個數字。 而 Unicode 就是為所有字元都編上一個獨有的數字,由於是獨一的數字,同一編碼就只會對應一個字元,這就可解決亂碼的問題。之於 UTF-8、UTF-16 和 UTF-32 就是如何儲存 Unicode 編碼的方法,UTF 全名是 Unicode Transformation Format。 問題是全世界有這麼多字元,數字要多大才夠?Unicode 1.0 以為 2 bytes﹝即是 16-bit 就足以處理,故此出現了 UTF-16 / UCS-2﹞。但好快就發覺 2 bytes 不足以為所有字元編碼,故此就出現了 Unicode 2.0,它是以 21 bits 編碼。目前 Unicode 最新標準是 Unicode 6.0,21 bits 空間仍然十分充裕。 UTF-16 原意是以固定 2 bytes 儲存一個字元,這樣運算和處理起來都十分方便有效率,無奈 2 bytes 無法為所有字元編碼。UTF-16 的做法是如果 FFFF… Read More »

[轉貼] Unicode、UTF-8 和 ISO-8859-1 到底有什麼區別

來源:http://campuss.blog.sohu.com/74210127.html Unicode、UTF-8 和 ISO-8859-1到底有什麼區別 本文主要包括以下幾個方面:編碼基本知識,java,系統軟件,url,工具軟件等。 在下面的描述中,將以”中文”兩個字爲例,經查表可以知道其GB2312編碼是”d6d0 cec4″,Unicode編碼爲”4e2d 6587″,UTF編碼就是”e4b8ad e69687″。注意,這兩個字沒有ISO-8859-1編碼,但可以用ISO-8859-1編碼來”表示”。 2. 編碼基本知識 最早的編碼是ISO-8859-1,和ASCII編碼相似。但爲了方便表示各種各樣的語言,逐漸出現了很多標準編碼,重要的有如下幾個。 2.1. ISO-8859-1 屬於單字節編碼,最多能表示的字符範圍是0-255,應用於英文系列。比如,字母a的編碼爲0x61=97。 很明顯,ISO-8859-1編碼表示的字符範圍很窄,無法表示中文字符。但是,由於是單字節編碼,和計算機最基礎的表示單位一致,所以很多時候,仍舊使用ISO-8859-1編碼來表示。而且在很多協議上,默認使用該編碼。比如,雖然”中文”兩個字不存在ISO-8859-1編碼,以gb2312編碼爲例,應該是”d6d0 cec4″兩個字符,使用ISO-8859-1編碼的時候則將它拆開爲4個字節來表示:”d6 d0 ce c4″(事實上,在進行存儲的時候,也是以字節爲單位處理的)。而如果是UTF編碼,則是6個字節”e4 b8 ad e6 96 87″。很明顯,這種表示方法還需要以另一種編碼爲基礎。 2.2. GB2312/GBK 這就是漢子的國標碼,專門用來表示漢字,是雙字節編碼,而英文字母和ISO-8859-1一致(兼容ISO-8859-1編碼)。其中gbk編碼能夠用來同時表示繁體字和簡體字,而gb2312只能表示簡體字,gbk是兼容gb2312編碼的。 2.3. unicode 這是最統一的編碼,可以用來表示所有語言的字符,而且是定長雙字節(也有四字節的)編碼,包括英文字母在內。所以可以說它是不兼容ISO-8859-1編碼的,也不兼容任何編碼。不過,相對於ISO-8859-1編碼來說,uniocode編碼只是在前面增加了一個0字節,比如字母a爲”00 61″。 需要說明的是,定長編碼便於計算機處理(注意GB2312/GBK不是定長編碼),而unicode又可以用來表示所有字符,所以在很多軟件內部是使用unicode編碼來處理的,比如java。 2.4. UTF 考慮到unicode編碼不兼容ISO-8859-1編碼,而且容易佔用更多的空間:因爲對於英文字母,unicode也需要兩個字節來表示。所以unicode不便於傳輸和存儲。因此而產生了utf編碼,utf編碼兼容ISO-8859-1編碼,同時也可以用來表示所有語言的字符,不過,utf編碼是不定長編碼,每一個字符的長度從1-6個字節不等。另外,utf編碼自帶簡單的校驗功能。一般來講,英文字母都是用一個字節表示,而漢字使用三個字節。 注意,雖然說utf是爲了使用更少的空間而使用的,但那只是相對於unicode編碼來說,如果已經知道是漢字,則使用GB2312/GBK無疑是最節省的。不過另一方面,值得說明的是,雖然utf編碼對漢字使用3個字節,但即使對於漢字網頁,utf編碼也會比unicode編碼節省,因爲網頁中包含了很多的英文字符。 3. java對字符的處理 在java應用軟件中,會有多處涉及到字符集編碼,有些地方需要進行正確的設置,有些地方需要進行一定程度的處理。 3.1. getBytes(charset) 這是java字符串處理的一個標準函數,其作用是將字符串所表示的字符按照charset編碼,並以字節方式表示。注意字符串在java內存中總是按unicode編碼存儲的。比如”中文”,正常情況下(即沒有錯誤的時候)存儲爲”4e2d 6587″,如果charset爲”gbk”,則被編碼爲”d6d0 cec4″,然後返回字節”d6 d0 ce c4″。如果charset爲”utf8″則最後是”e4 b8 ad e6 96 87″。如果是”ISO-8859-1″,則由於無法編碼,最後返回 “3f 3f”(兩個問號)。… Read More »