pretty code

2018年11月27日 星期二

大陸亞馬遜購書

前一陣子發現 Kindle 可以支援自訂字型﹝需升級版本到最新﹞。

在裝了特殊簡體字型後,便可以看到繁體中文的內容,於是便申請了一個大陸亞馬遜帳號,底下是步驟及問題整理。

1. 不同國家亞馬遜帳號沒有互通,需要各自申請,網路上說不能用同一組 email,但我測試是沒有問題,記得密碼不要一樣。

2. 需在我的設備及內容裡的設置,將國家改成中國,才可以購買電子書,我這裡是用集運公司的地址。

3. 如果上網的 IP 不在中國,購買幾本書後﹝我在買了 8本後﹞,便會被鎖住,可以聯絡線上客服幫忙解鎖,一次可以開放 20 本,之後被鎖住就再開,如果覺得麻煩,可以考慮用 VPN 之類的方式上網。

線上客服

2019/06/17 更新
由於線上客服選項無法出現,嘗試用電子郵件聯繫,但一個禮拜都沒有收到回信。後來發現在線上客服頁面多試幾次後,有機會跳出線上客服選項,也順利的請客服幫忙解鎖成功。

另外,我查了一下幾家知名的 VPN,目前只剩 PureVPN 的網站有顯示支持大陸,但在買了一個月的帳號後,使用 Chrome Extension 發現並沒有 China  的伺服器可以選擇,待安裝其他版本軟體來確認。

2019/06/20 更新
經安裝 Windows 軟體實測,可以連到大陸無誤,詳此篇文章

2018年11月19日 星期一

Use mongodump and mongorestore with authentication

如果當初設定 MongoDB 時,有設定帳號密碼
則 dump and restore 時,都需要指定相關資訊

假設 ip 192.168.1.1, port 27017, user abc, password abc, database def

mongodump -h 192.168.1.1 -p 27017 -u abc -p abc /db:def /out:"xxxxxx"
mongorestore -h 192.168.1.1 -p 27017 -u abc -p abc /db:def "xxxxxx"
   
如果有設定 root 帳號,則不必指定 /db: 參數,會備份所有 database(含 admin)
相反的如果有針對 database 設定存取帳號,則一定要加上 /db: 參數

2018年11月13日 星期二

MongoDB 備份與還原

目前知道的備份有 2 種方式(針對 single server)

1. 直接複製 MongoDB db and log 的上層目錄,如果是在 Windows 下,需要先停止服務
2. 使用 mongodump -p portNumber /out:"folder path",dump 的資料夾會位於 "folder path"

至於還原的話
1. 直接複製回去即可
2. mongorestore /drop "folder path",在還原前會先砍掉舊資料

2018年11月2日 星期五

Javascript 非同步 pattern

還沒有 Promise, asyc / await 前
在撰寫非同步程式時
其實 code 的邏輯不太好看
又容易會有 callback hell 的問題

今天想了一下,其實可以用以下概念來處理此類問題

我們以常見的從資料庫撈資料來看
大概注意幾個重點即可

1. 在 function 內寫出一連串要做事的 function and callback
2. 上述 function 不要寫成變數,否則會有 undefined 的問題(hoist)
3. 相關的 function 可以照執行順序寫好,方便閱讀


function getDataFromDB(callback) {
    console.log("start connect to DB");
    connectDB(connectDBCB);

    function connectDB(cb) {
        setTimeout(() => {
            console.log("connect to DB done \n");
            cb(null, "fake handle");
        }, 2000);
    }

    function connectDBCB(err, conn) {
        console.log("start get data");
        getData(conn, getDataCB);
    }

    function getData(conn, cb) {
        setTimeout(() => {
            console.log("get data done \n");
            cb(null, conn);
        }, 2000);
    }

    function getDataCB(err, conn) {
        setTimeout(() => {
            console.log("prepare data to back");
            callback(err, [1, 2, 3]);
        }, 2000);
    }
}

getDataFromDB((err, data) => {
    console.log(err, data);
});

2018年11月1日 星期四

Build wxWidgets Project in Linux

OS: Ubuntu

使用 apt-get install 相關程式
apt-get install libwx*
apt-get install wx3.0*

執行 wx-config --cxxflags
-I/usr/lib/x86_64-linux-gnu/wx/include/gtk2-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread

執行 wx-config --libs
-L/usr/lib/x86_64-linux-gnu -pthread   -lwx_gtk2u_xrc-3.0 -lwx_gtk2u_webview-3.0 -lwx_gtk2u_html-3.0 -lwx_gtk2u_qa-3.0 -lwx_gtk2u_adv-3.0 -lwx_gtk2u_core-3.0 -lwx_baseu_xml-3.0 -lwx_baseu_net-3.0 -lwx_baseu-3.0

綜合上面參數,使用 g++ 便可以成功編譯

假設你寫了一支 Test.cpp,裡面簡單的創建一個視窗,你也可以這樣下指令來直接編譯
g++ Test.cpp `wx-config --cxxflags --libs` -o Test
如果需要顯示中文,記得使用 UTF8 編碼



Test.cpp

#include <wx/wx.h>

class Test : public wxFrame
{
public:
    Test(const wxString& title)
        : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(400, 200))
    {
        Center();
    }
};

class MyApp : public wxApp
{
public:
    bool OnInit()
    {
        Test *test = new Test(wxT("醉裡挑燈看 Code"));
        test->Show(true);
        return true;
    }
};

wxIMPLEMENT_APP(MyApp);

Javascript substr

以前再取子字串時都習慣使用 substr
今天才知道這個 function 不算是標準的 ECMAScript Spec(僅在附錄)
故建議是不要使用 substr
可以用 substring or slice 來代替

Annex B (normative)
Additional ECMAScript Features for Web Browsers

The ECMAScript language syntax and semantics defined in this annex are required when the ECMAScript host is a web browser. The content of this annex is normative but optional if the ECMAScript host is not a web browser.

NOTE This annex describes various legacy features and other characteristics of web browser based ECMAScript implementations. All of the language features and behaviours specified in this annex have one or more undesirable characteristics and in the absence of legacy usage would be removed from this specification. However, the usage of these features by large numbers of existing web pages means that web browsers must continue to support them. The specifications in this annex defined the requirements for interoperable implementations of these legacy features.

These features are not considered part of the core ECMAScript language. Programmers should not use or assume the existence of these features and behaviours when writing new ECMAScript code. ECMAScript implementations are discouraged from implementing these features unless the implementation is part of a web browser or is required to run the same legacy ECMAScript code that web browsers encounter.

Javascript 浮點數轉整數

Javascript 的數字類型是 64 位元的浮點數

以前在轉 C code 時
遇到類似 3/2 的語法都用 parseInt(3/2) 來取代

正規來說,應該要用 Math.floor(3/2)
也讓不懂 Javascript 的人比較好懂 code 的意義