2019年3月26日

[C] Variadic Macro

有時候會有個需求是像這樣:
  • 希望在執行任何 function / expression 前可以先做檢查,檢查過了才真的執行
  • 能把上述的檢查包成容易使用的形式,讓後續使用的人不會忘記
這種需求其實很常見,以 C 來說,確保一個 pointer 不是 null 後才真的拿來用是很基本的事情。所以如果可以包成像下面的形式想必會好用很多也比較不會忘記:

#define CHECK_AND_USE(x, ...) if (x) { x(...); }

typedef void (*f1ptr)(int);
typedef void (*f2ptr)(double, const char*);
f1ptr p1 = NULL;
f2ptr p2 = NULL;
CHECK_AND_USE(p1, 2) // equivalent to if (p1) { p1(2); }
CHECK_AND_USE(p2, 1.0, "test") // equivalent to if (p2) { p2(1.0, "test"); }

這樣基本上只要記得都透過 CHECK_AND_USE 就能避免用 pointer 前忘記先做 null check。重點來了:CHECK_AND_USE 中的 ... 該怎麼辦呢?顯然的,我們需要不定數量與型態的參數。而能達到這件事情的有幾個方式,這邊要介紹的是 C99 開始支援的 Variadic Macro

2019年2月27日

[python] Inheritance & Hack with mock

最近工作的內容因為會用到 python,不過因為 python 實在太過自由了,有些特性對於習慣寫 C++的我來說實在有點不好控制,導致寫好的檢查是有可能被使用者繞過去的,舉例來說,確認使用者是否有 licesce 這件事就極度重要。這邊就筆記一些目前有想到的方式

[C++] One Simple Trick For Reducing Code Bloat

簡單整理一下這部影片的重點,說明有時候一個小動作會讓 compiler 難以最佳化,然後 code size 就會變大。

2019年2月24日

[C++] How to Write Reliable Code

這篇只是下面這段演講的整理
How to write more reliable code - Egor Bredikhin - Meeting C++ 2018
投影片

總結來說有以下這幾點
  • Guidelines
  • Unit tests 
  • Code reviews
  • Static analysis
  • Dynamic analysis
  • Mordern C++

2019年2月18日

[C++] pinned_vector - Pointer Invalidation Issue on std::vector

pointer invalidation 在 C++ container 是個滿重要 (但很容易被忽略) 的議題,主要原因在於 C++ container 會自己在 runtime 依據使用情況去調整記憶體使用量。也因此,如果用 pointer 去存取 container 中的東西時有時會遇上 container 因為你的操作 (比方說新增/刪除) 導致既有的 pointer 不再合法 (也就是原本指到的地方已經不再是你原本指向的東西,可能已經變成其他的東西或是不能被存取了),這就是所謂的 pointer invalidation,在 C++ reference 上各個 container 的 member function 其實可以看到會有一段在描述 iterator validity,那個就是在講這個議題。

當然,不同方式的 container 在 pointer validity 會有不同的情況 (比方說 std::list 沒有這問題,但是他的 element 就不會是在連續的記憶體上),選用 std container 的時候其實有一部份是要謹慎考量這問題的,因為這攸關使用情境以及效能。這次在 Meeting C++ 2018 看到的 pinned_vector 簡單來說就是提出一個可以滿足最低限度的 pointer validity 的改良版 std::vector

2018年10月4日

[筆記] MySQL Config File Encryption and Decryption

上一篇提到 MySQL 在 5.6 版後提供 mysql_config_editor 這支 utility 讓使用者可以產生/修改加密後的 config file (或者叫做 option file),但是很奇怪的是官方提供的 API 不管是 C 或 Python 都不吃加密後的 config file。後來經過多方查詢研究後發現 python 有一個 package 叫 myloginpath 可以把加密後的 config file 解成明文,基於 python 沒秘密,所以這邊就來整理一下這弱到爆的加密方式

2018年10月2日

[MYSQL] C/Python Connector API for MySQL

MySQL client 登入時可以藉由提供一個 option file (比方說 .mylogin.cnf) 並且在裡面寫好 user / password / host 等資訊後,登入時直接使用 option file 連上 MySQL server。不過 option file 因為必須是明文,自然會有風險。只是 MySQL 自 5.6 版以後提供了 mysql_config_editor 這支 utility 讓使用者可以把 option file 加密 (目前看到的資料好像是會用 AES 128bit 加密) 來避免這個問題。

想當然爾,MySQL 也必須提供 API 讓使用者可以藉由這些 API 直接使用這些加密後的 option file 連上 MySQL server。這邊介紹的是關於官方原生提供的 C/Python API 上的狀況。

2018年10月1日

[C++] A Simple Wrapper on A Non-Thread Safe Container for Thread Safety

大部分的 container 像是 STL 的所有 container 通常都不是 thread safe 的,因為如果要做到 thread safe 的設計多半都要犧牲一些效能,但是大多數情況其實我們不會需要這種設計,因此不考慮 thread safe 對於這類考量泛用類型的架構是合理的。當然如果一開始就有考慮做成 multi-thread 的架構,也有許多 thread-safe container 可以使用,像是 Boost 或是 Intel Thread Building Block (TBB)。

但是假設今天用了 STL 的 container 後一段時間才想要改用 multi-thread 架構的話要怎麼辦?方法大致上就 2 種:
  1. 換掉 container:不過多半連既有程式的使用方式也要跟著做修改
  2. 想辦法把原本的 container 改成 thread-safe
第 1 點當然會是比較保險的,但是換 library 是大事,特別是如果想用的 library 沒有對應的 API 可以對回去原本 library 的用法那就很麻煩了。所以這邊提供第二種方式:增加一個 wrapper,在盡量不改變 usage 的情況下提供 thread safety。

2018年9月23日

[C++] A thread-Safe Bounded Queue Based on STL Container and C++11 Threading Library

要寫一個平行化的程式通常多半免不了需要一個 thread-safe 的 container,很不巧的是 STL 並沒有提供一個 thread-safe 的 container。雖然通常純讀不修改多半是可以 thread-safe,但如果要允許同時可讀又可寫就需要自己想辦法了。

這篇就是自己想辦法用 STL 的 container 生了一個 thread-safe 的 bounded queue。用 STL container 當基底純粹是因為我懶得自己做記憶體管理 XD