淺談 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()。

Let’s Encrypt 免費 SSL cert

一向 SSL cert 是有錢人的玩意,找間有名的 CA 簽發,一個 domain 往往要數千甚至上萬港元一年,莫講話個人,好多中小企都負擔唔起,這不單阻礙了網絡安全的發展,更阻礙了 SPDY (HTTP/2) 的推廣。情況可能被 Let’s Encrypt 打破,她提供了免費 SSL cert 簽發服務,簽出來的 cert 在 IE11、Edge、Safari、Firefox、Chrome、Android、iOS 都被認可。這實在是網絡發展一大進步。 要 Let’s Encrypt 簽署,你可以用 Certbot,而使用 Certbot 最簡單的方法就是使用 Docker。Docker 已成了最簡單 deployment 的方法,比 RPM、DEB 更方便! 首先 pull 個 image 下來本機 $ docker pull quay.io/letsencrypt/letsencrypt:latest 之後建立本機資料夾用來存方簽好的 cert、key、config 等檔案 $ sudo mkdir /var/lib/letsencrypt /etc/letsencrypt 再起動 docker container $… Read More »

如何建立 RPM private repository (私有 RPM 倉庫)

在 Linux deploy 軟件,最簡單又穩陣的方法,當然是使用 package。即 RHEL/CentOS/Fedora 就用 RPM,Debian/Ubuntu 就用 DEB。首先把自己的軟件 compile 再包裝成 RPM。當有了 RPM 後,可以直接 “yum install package.rpm”。 不過,當 packages 比較多,又或需要做版本 update 時,就會顯得麻煩,比較理想是建立私有 package repository。以下以 MySQL 為例,自從 MariaDB 成為各大版本標準 package,MySQL 就被踢出了。 Oracle 有提供 MySQL 的 CentOS 7 RPM。首先,下載整個 bundle.tar,之後 untar 放進自己部機的 directory 或 Web Server。接著,把簽署 package “rpm –addsign *.rpm”﹐就可 “createrepo .”。你會發現多了一個 叫 repodata 的 folder,那即是成功了。… Read More »

Search Engine Optimization

近來試下做一做 Search Engine Optimization (SEO),於是建了一個 Andrew Wat website http://andrew.aboutmy.info,希望能被 search engine 注意得到

uHub OS X Client

uHub 是 PCCW 提供的雲儲存服務。Server 在香港,所以 upload 同 download 都很快,這是我中意它的最重要原因。雖 uHub Plus 推出了,但問題多多,而且 uHub 有別於 uHub Plus 或 OneDrive 或 Google Drive 或 Dropbox,它是沒有在本機留底,它並非同步盤,檔案完全在線,就好似 56K 年代的 X-Drive 咁。用來於一些不是經常存取的檔案又或零碎的相片就最合適。 uHub 已被 PCCW 遺棄,官方 uHub client 並不支持最新 Mac OS X。安裝時,會被拒絕。用 xar 解壓 uHub client 的 .pkg 會發現 script 指明需要 OS X 10.7 – 10.9 (含)。 是否 OS X… Read More »

初嘗 Apache Cassandra

傳統 RDBMS 設計是用來做 transactions 要保持 consistency,並不適合儲存 Big Data。犧牲一些 consistency 及 fancy SQL,換取分散式架構,那就是 Cassandra。 Cassandra 可靠嗎?Apple 用左 75,000 nodes 儲存了超過 10 PB 資料。Cassandra 難安裝嗎?解壓就 run 得。 不過要注要一下,Cassandra 的預設 config 好進取,如果部 server 有其他野 run 梗,好容易會 out of memory error,要調一調 con/jvm.options 中的 heap size,也可以把 assertions 關掉。GC 也有得選。 加 node 也很容易,設好連接的 seeds 便可。預設是為左 quick start,真正用時改一改 endpoint_snitch 做 PropertyFileSnitch 及設置… Read More »

使用 Command 開啟 Mac OS X 的 Remote Management

如果唔記得開 Mac OS X 的 Remote Management,又或者想轉 password,又或想 restart Remote Management,只要能 SSH 入去,就可以用以下 command 開啟 Remote Management (一行過,用你想要的 password 代替 “password”) sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app /Contents/Resources/kickstart -activate -configure -access -off -restart -agent -privs -all -allowAccessFor -allUsers -clientopts -setvncpw -vncpw password

Web Service Load Balancing

而家 RESTful web service 及 AJAX 流行,server 同 client 多數用 JSON / Protocol buffers 交換資料。Server side 對 Java EE / J2EE 需求大減,特別是 mobile Apps,更本用不著 Java EE,偏向用 Node.js 或 Python 或 Go 來做 server API。由於在 web API 做 multi-thread 會很麻煩,花大量時間做 development 及 testing,而基於 JavaScript 的 Node.js 更加沒有 multithreading,而是用 callback。 如果想用盡 CPU cores,最容易的方法是把用 Node.js 或 Python 或… Read More »

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 »

Android 螢幕拍攝

Android 由 Kitkat 開始自帶了螢幕拍攝 (screen record) 功能,只要在 adb shell 中輸入 screenrecord –-bit-rate 8000000 /sdcard/record.mp4 就會把螢幕錄下來,放在 /sdcard/record.mp4,直至按下 Ctrl + C 停止。 screenrecord –help 可以查看說明。screenrecord 是放在 /system/bin/screenrecord。

Mac OSX RAM Disk

如果你 Mac 有足夠的 RAM 做 RAM Disk,很簡單,只需在 Terminal 打 diskutil erasevolume HFS+ ‘RAM’ `hdiutil attach -nomount ram://8388608` 就可以建立一個 4GB 的 RAM Drive 註:4096 * 2048 = 8388608

快倉輸入法

快倉輸入法,在 Linux 上是我用過最好用的倉頡,也有 Windows 版 http://www.scj2000.net/download 快倉六是以 GNU General Public License version 3 (GPLv3) 授權發放,輸入法之源程碼可在 http://download.scj2000.net/src/ 找到。在各 Linux 分發版內之快倉六套件(建議安裝分發版內之快倉六): Ubuntu 11.04: ibus-table-scj6 Fedora 15: ibus-table-cangjie (包含快倉六) Debian sid: ibus-table-scj6 Debian stable: ibus-table-scj6

在 Linux 上安裝 Oracle Database 的小經驗

Oracle Database 用就用得多。Enterprise Edition 就未安過,只是安過 Express。要安裝 Oracle,有一大堆手續。例如:加 user、改 .bash_profile、改 Kernel 參數等等,但一如其他 Linux 軟件,最煩的是 dependencies。 如果用類 CentOS Linux,最簡單的是從 Oracle 中安裝一個叫 oracle-rdbms-server-11gR2-preinstall 的套件。套件只是幾十KB,只是佢會令你安裝一些需要的套件。 # Download Repos wget –no-check-certificate https://public-yum.oracle.com/public-yum-ol6.repo -O /etc/yum.repos.d/public-yum-ol6.repo # Download GPG Key wget https://public-yum.oracle.com/RPM-GPG-KEY-oracle-ol6 -O /etc/pki/rpm-gpg/RPM-GPG-KEY-oracle # 安裝 oracle-rdbms-server-11gR2-preinstall yum install oracle-rdbms-server-11gR2-preinstall 但這個時候我不會真的安裝它,而是 cancel 後自行補安需要的套件。再把 /etc/yum.repos.d/public-yum-ol6.repo 刪除又或改為 .bak。否則,加入 Oracle Respo 後,你的 CentOS 會被安裝其他 Oracle… Read More »

強制 Firefox pop-up 開新頁而非新視窗

其中一個我喜愛 Safari 的原因,Safari 可以強制網頁 pop-up 例如 e-banking 的登入畫面在新分頁而新視窗打開。雖然 Firefox 有 “Open new windows in a new tab instead” 這個選項,但對於這些 pop-up 是無效的。終於在網上找到了方法。 在 Firefox 網址列打 about:config 再 search browser.link.open_newwindow.restriction,把其預設由 2 改成 0 便可

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 »