簡單做一下筆記。
Futures, Promises, Packaged Task, Async in C++11
這篇是Concurrency in C++11的部份筆記,先寫有關C++11標準的部份。
future, promise被加入C++11,大概等同於C#的Task或是Java8的Future。
最簡單的情況
以讀寫一個檔案作為範例
1 | vector<char> readFile(const string& inPath) |
如果要拷貝一個檔案,可以這樣寫。
1 | size_t sync_copyFile(const string& inFile, const string& outFile) |
這樣寫得問題在於,讀寫都是同步動作。如果檔案一大,就什麼事都不用做了。如何使用Multithread來感善動作。
Partial application & Currying
Partion Application
顧名思義,提供函數一部分的參數。變成一個新的函數。
最簡單的例子就像這樣
1 | int sub(int a, int b) |
當然上面這種寫法復用度並不高,於是在C++11把bind跟function納入標準配備之後,可以寫成這樣。
1 | std::function<int(int)> sub2 = std::bind(sub, std::placeholders::_1, 2); |
有時間再來討論bind跟function。
不過就可讀性來說,Pyhton版的強多了
1 | import functools |
Currying
Currying是為了解決不一樣的問題
假設一個函數有多個參數,把他轉化成多個只有一個參數的函數組合。
用C++11的Lambda Expression來做示範。
1 | std::function<int(int)> add2(int a) |
基本上PCurrying可以實現一部分Partion Application的應用。不過以上麵的sub2
為例,Currying在這邊就不是用。
更清楚的描述可以看What is the difference between currying and partial application
Network Test and Monitor Tools
C / C++ Learning Resources
不定期更新
C Language
- C Programming Language
- C Programming Notes
- Programming in C UNIX System Calls and Subroutines using C
- JTC1/SC22/WG14 - C C語言標準
- C Language Reference Microsoft提供的r教學
C++ Language
- ISO CPP
- C++ FAQ 包函 C++11 / C++14 最新的狀況
- C++ Language Reference Microsoft提供的教學
- C++ FQA Lite
未分類
Branch Prediction for CPU
在Stackoverflow看到這串討論很有意思。
以下的Code,雖然時間複雜度都一樣O(n),不過排序過後的速度遠遠超過沒排序,將sort註解掉之後可以看出很明顯的差異。
1 | #include <algorithm> |
Some Debugging tips for linux
寫起來,免得忘記。
在程式Crash前直接呼叫gdb
1 | void dump(int signo) |
IO Models and Desgin Pattern
對最近的心得做個總結。
這篇Boost application performance using asynchronous I/O描述了幾種常用的IO Model。
首先要先解釋兩個很像,卻又部太相同的名詞
- Synchronous Application發起I/O Operation,並且等待其完成 (如 read / write)
- Non-Synchronous Application僅發起I/O Program Request,由Kernel通知Application完成
- Blocking Application因為等待某事件,而不能繼續往下執行
- Non-Blocking Application不受事件影響
Synchronous blocking I/O
最常見的I/O Model,就是在Event未結束前不會將控制權交還給Application。
1 | int len = recv(s, .....); |
在這種Model之下,為了要解決Blocking的問題,就得使用Multi-Porcess或是Multi-Thread的方式來做。
Extension Methods in Java 8 / C#
隨著Java8推出,新增了一堆新特性。其中有一項就是C# 3.0有的Extension Method。紀錄一下。
問題
在OOP的世界裡,一旦介面推出之後,就不能在更改了。否則依賴於這介面開發的程式必須更著改動。如果Source Code都在自己手上還好。如果是3rd party或是已不在維護的Library,這就變成問題。
1 | public interface MyInterface { |
如果如果現在Interface需要增加一個myFunc2的功能,該怎麼作。
Introduction to Docker
Docker跟Virtual Box這種Virtual Machine上的虛擬化不同,他是基於64 bit linux上,由cgroups/AUFS/LXC為基礎發展出來的Linux virtualization,目前也僅能在Linux上跑,相對於VM等級,更輕量化且更省資源。
安裝
由於Docker需要Linux kernel 3.8以上的,如果版本比較舊的要先更新
1 | $ sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring |
Update: Ubuntu 14.04
由於Ubuntu 14.04直接收入Docker
所以直接安裝docker.io就好,然後以下的指令全部用docker.io
取代docker
1 | $ sudo apt-get install docker.io |
將Docker的PGP Key跟Repository加入環境中
1 | $ sudo sh -c "wget -qO- https://get.docker.io/gpg | apt-key add -" |
跟新Source且安裝LXC-Docker
1 | $ sudo apt-get update |