Category Archives: programming

基於 libuv 的 uvloop 令 Python 3.5+ 的 asyncio 更快

Python 3 已推出一段長時間,文章落筆時最新為 3.7,其間 Python 3 都變了不少,3.6 起基本上已無誘因繼續用 2.7。 PEP 529 — Change Windows filesystem encoding to UTF-8 Windows NT 時用了 UTF-16 支援 Unicode,令 Windows APIs 有一套 9x 帶落 ASCII 的 *A functions (),另一套 UTF16LE 的 *W Functions。Python 3.6 就同 POSIX APIs 睇齊,用 UTF-8,即同 Linux 上一樣,解決好多 cross-platform 檔案存取問題。 PEP 3156 — Asynchronous IO Support Rebooted:… Read More »

Internet Explorer 11 is the new Internet Explorer 6

Internet Explorer 11 is definitely the new Internet Explorer 6. It can’t even run the simple JavaScript as below. (() => “hello world!”)(); 由於 Windows 7 不死,而 Windows 7 上最新只能用 IE 11,沒有 IE 12 也沒有 Edge,IE 11 已變成新 IE 6。很多新標準 IE 11 都未能支援,就連 ES6 的 arrow function 都正確運行,變相令 develops 使用新技術時有所顧忌。

愛上 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 »

再談 UTF-8

Unicode 自 2.0 到現在 6.0 都是 21 bits 編碼。UTF 就是實作把這個最大為 21 bits 的數字儲存。常見的 UTF 有 UTF-8、UTF-16 及 UTF-32。今次要再講講 UTF-8。 UTF-8 之所以流行是因為它跟 ASCII 兼容,”a” 字在 ASCII 及 UTF-8 時都是 0x61,但在 UTF-16 時卻是 0x00 0x61,當中 0x00 用 ASCII 解讀時會觸發 null-terminated。且儲存英文及數字只需使用 1 byte,比 UTF-16 節省一倍。雖然儲存中文字時,UTF-8 會比 UTF-16 用多較多空間,不過除非是全中文文章,否則中英混雜時,例如 HTML,用 UTF-8 一般會較有儲存大小上的好處。 UTF-8 能兼容 ASCII 之餘又能儲存大於 128 編碼的袐密在於可變位數,詳情可參看 淺談… 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 »