Trait有很多種形式,Scala也有Trait。不過這邊講的是Rust的Trait。Scala的Trait觀念不太一樣。
一開始是看到這篇How are Rust Traits different from Go Interfaces?,後來發現跟C++觀念有點相近,於是一起比較。
Rust trait
trait長得很像Interface,不過方式不太一樣,會在編譯時期檢查資料型態。
1 | trait Foo { fn bar(&self); } |
Trait有很多種形式,Scala也有Trait。不過這邊講的是Rust的Trait。Scala的Trait觀念不太一樣。
一開始是看到這篇How are Rust Traits different from Go Interfaces?,後來發現跟C++觀念有點相近,於是一起比較。
trait長得很像Interface,不過方式不太一樣,會在編譯時期檢查資料型態。
1 | trait Foo { fn bar(&self); } |
安裝systemtap本身沒什麼,不過如何找到Debug info就沒這麼簡單了。
1 | $ sudo apt-get install systemtap |
以下是網路大神提供的懶人法
1 | $ wget http://www.domaigne.com/download/tools/get-dbgsym |
曾經試著自己編譯過,不過kernel mismatch,有時間再試吧。
雖然這題目很簡單,不過看到How to zero a buffer我嚇到了,原來我之前的觀念不一定正確。
假設我們在程式中有些敏感資料(金鑰/密碼等),希望能夠在使用之後清除掉。通常我們會這麼作。
1 | void dosomethingsensitive(void) |
不過這段程式碼經過最佳化之後,最後的memset被省略不做。
最近碰到一個困難的問題,好不容易找到解答,因此紀錄起來。
當一個Socket讀寫速度不對稱的時候,該怎麼處理。
假設Socket讀取的資料室100M/S,而寫入的速度是10M/S。
如果是Blocking I/O,OS會自動幫你處理這種狀況,難怪上網找範例程式碼都沒特別處理。
由於libuv/libevent等都是Non-blocking I/O framework,,因此無法得到有用的資訊。
翻到Linux多線程服務端編程:使用muduo C++網絡庫裡面有個地方觸動了我的靈感。利用Watermark來管理讀寫動作。
後來找到Libevent的Bufferevents和Python asys IO都有類似Watermark的觀念,我想這應該是可行解。
以讀取比寫入快為例
Aspect oriented programming的技術基礎可以看這裡
我想這篇已經寫得很清楚了,有興趣的話繼續Google。
接著試著用C++來實做一些Complie time的AOP方式。
可以試著在關新的函數前面,加上Before跟After。
1 | template <typename WrappedType> |
這題目雖然不怎麼困難,不過解法還蠻多的,雖然原理相同,不過根據編譯氣得能力,得到的結果也不同。
題目要求: 把讀到的內容當作一個string傳回來。
不考慮OS Level API(open/CreateFile)的方式,直接用C/C++的API來做。
大家都很熟了,用fopen/fseek/fread/fclose來達成。
1 | #include <cstdio> |
寧可備而不用,不可用而不備,這邊講的是Debugger使用的工具,其他Memory Check跟Performance turing就沒列出了。
有更新再補完
這功能很有用,SVN的時代常常使用,不過在Git上就忘了怎麼用。
看到Stackoverflow的資料紀錄一下。
首先,先查詢某個檔案的Commit log。
1 | $ git log -- [filename] |
以下是一個示範
1 | $ git log --pretty=oneline --abbrev-commit -- README.md |
接著就可以用git diff來比較兩個commit之間的差異。
1 | $ git diff {version1} {version2} -- [filename] |
如果我們要看README.md的前一個版本跟現在的版本差異,就能這樣操作
1 | $ git diff acb9f89 HEAD -- README.md |
有個好的GUI果然比較有用,這些技術以備不時之需。
這一組API雖然在Coding上不會直接用上,不過要實做Coroutine,模擬Exception的時候,總部會少了他。紀錄一下>
setjmp/longjmp很像Goto,不過比Goto更強,可以跳躍至任何地方,Goto不能跳躍至函數外層。直接看例子吧。
1 | #include <stdio.h> |
叢書出的結果我們可以猜到程式怎麼運作
1 | second |