Monthly Archives: November 2019

exception safety

整理一下David Abrahams提出的exception safety幾個exception handling level 這在設計function時抱持這個概念非常重要, 因為對使用function的使用者來說, 常常在使用C++的function時,會擔心function失敗時的行為。 使用者角度處理exception handling時,不確定該function到底可能會丟出哪些exception,而造成困擾。 因為可能發生的exception不單是看呼叫的function本身, 該function內部呼叫的函式有可能也會產生exception。 如果真的不確定function可能會丟出哪些exception,最好的方式就是將exception往外傳。 當exception往外傳時,代表function流程中斷了,因此這時候就需要思考function exception safety gurantee。 他的概念有點類似資料庫transaction integrity,當transcation failure, 資料庫內容的一致性要達到什麼程度。例如ACID裡的C – consistency類似exception safety的Basic exception safety(invariants在function前後保持一致) Consistency ensures that a transaction can only bring the database from one valid state … Continue reading

Posted in C++ idioms | Leave a comment

nodejs quick install

nodejs 在linux安裝如果不透過安裝包或是yum的包管理來安裝,最快的方式是直接從官方網站抓binary dist,以下是在CentOS 6.9測試 https://nodejs.org/dist/latest-v10.x/Linux: https://nodejs.org/dist/latest-v10.x/node-v10.17.0-linux-x64.tar.gz tar xf node-v10.17.0-linux-x64.tar.gz 將 bin/node copy到 /usr/local/bin cp node /usr/local/bin/ install npm 解壓縮的binary包有帶npm,用這個npm來抓取最新的npm安裝到系統 ./npm -g install npm 如果只是拿nodejs來執行的話,npm並不需要裝,只需要node執行檔。在壓縮包裏有 include,那是需要build binary addon時會用到,可直接複製到 /usr/local/include cp -r include/node/ /usr/local/include/

Posted in nodejs | Leave a comment

C語言的struct hack整理

在C語言中,有一個技巧叫struct hack,主要是要實現動態大小的struct 要紀錄的資訊有名字欄位,可以這樣設計 但是這邊假設name存的字串最長是31 + 1 bytes (null terminated string),如果要能動態長度就要改用指標處理,例如 這個的缺點就是 name的記憶體配置是另外配置,和person_info不在同一處,可能無法利用到cpu cache。 struct hack的作法是讓尾端可以動態大小,此時在struct最後面定義一個place holder malloc 會allocate 一塊空間包含struct member所需的,剩下的空間可以用name來存取 注意這裡name的用途是拿來做place holder,不用另外計算struct之後的起始位置,因為有時候有alignment padding的問題。 struct hack的作法只能用在最後一個member是不定大小。在C99 可以用flexible array member來描述 char name[]; flexible array member算是incomplete array type,所以不能直接sizeof §6.2.5 #12 An array type … Continue reading

Posted in C Language | Leave a comment

Diffie-Hellman Key Exchange整理

在雙方要做加密通信時,需要共同協商出密鑰,無論是加解密同一把,或是加密/解密分開, 都需要某種方式讓雙方得到密鑰。最簡單的做法就是透過事先設定好密鑰,或是另外透過安全的傳輸傳輸密鑰。 但是密鑰要在安全傳輸的通道裡傳輸,安全傳輸的通道怎麼來的,例如可能是實體的額外的線路,也可能是兩方私下先共同約定好特定密鑰的加密通道,不過這兩種做法似乎都要先約定好,是否有辦法直接在不安全的通道裡在雙方都沒有事先溝通的參數的情況下協商出一把只有雙方才知道的密鑰呢? 這個問題等同於如果有一個人在偷聽兩個陌生人的加密對話,從頭聽到尾(包括兩個人加密協商階段也能偷聽到的情況下),是否可以讓偷聽的人無法知道兩個陌生人原始的對話,也就是避免偷聽的人解開兩人通信使用的密鑰,答案是可以,這邊必須注意的是 – 偷聽是只在旁邊偷偷觀察,不是MTIM中間人攻擊 關於這個問題可參考 https://en.wikipedia.org/wiki/Key_exchange 比較多詳細的描述 Diffie-Hellman密鑰交換算法可以解決這個問題: 即使是在不安全的通道裡雙方還是可以協商出一同一把密鑰,而竊聽的人無法輕易得知那把密鑰。 他的做法是給定兩個數 p, g p是質數、g是 primitive root modulo p https://en.wikipedia.org/wiki/Primitive_root_modulo_n Alice、Bob透過不安全的通道交換p, g的資訊(所以這個資訊可能被第三者知道) Alice挑了一個數字a 計算出 A=g^a mod p,然後將A數字給BobBob挑了一個數字b 計算出 B=g^b mod p,然後將B數字給AliceAlice將拿到的B 計算出 K1=B^a mod pBob將拿到的A 計算出 K2=A^b mod p事實上 K1 … Continue reading

Posted in General | Leave a comment