星期三, 6月 26, 2013

用IP和netmask計算subnet

因為現有的Python package都太大包了,我只需要計算subnet而已,所以,找到一篇[1]看起來最簡單的,程式如下︰
#!/usr/bin/env python

def calc_subnet(ip, netmask):
  a = [int(n) for n in ip.split('.')]
  b = [int(n) for n in netmask.split('.')]
  c = zip(a,b)
  return '.'.join([str(a & m) for a, m in c])

ip = '192.168.1.2'
netmask = '255.255.0.0'
print calc_subnet(ip, netmask)

[1] Amusement: Python and Netmasks, http://unroutable.blogspot.tw/2012/01/amusement-python-and-netmasks.html

星期四, 2月 14, 2013

看了許久終於知道JavaScript object model是怎麼一回事了

因為GNOME要換用JavaScript做為開發application的語言,而C用於開發library,使得我終於不得不面對JavaScript。

之前接觸JavaScript都是一點點一點點,所以,始終沒有搞它的object model。

所以,就從object model做為切入點,而在Mozilla Developer Network的Details of the object model是一篇還不錯的文章,對我夠用了。

星期四, 1月 17, 2013

悖論


第一次看到悖論﹙paradox﹚這個詞是在Final Fantasy XIII-2,今天晚上看到第到第二次,居然是在講儲存的書裡。悖論[1]指的應該是︰
如果承认它是真的,经过一系列正确的推理,却又得出它是假的;如果承认它是假的,经过一系列正确的推理,却又得出它是真的。
不知道該說是FF XIII-2太深奧了,還是書扯太遠了。

[1] 悖论, http://zh.wikipedia.org/wiki/悖論

星期一, 1月 14, 2013

今天就以False-sharing就做為一天的結束吧

電腦上的儲存裝置的速度,暫存器﹙register﹚ > cache﹙快取﹚> RAM﹙Random-access memory﹚ > blah...blah...blah...

這篇文章的主題是cache,cache line是CPU管理cache的單位,有數種方法可以取得cache的大小[1]。在寫程式的時候,需要盡量保持資料在cache裡,這樣程式可以跑的比較快。

在multi-core的環境下,cache管理機制﹙MESI [2]﹚裡隱藏著一個陷阱,False-sharing。

False-sharing是指程式以multi-thread(process)的模式在存取資料時,意外造成cache invalidate,然後導致效能下降﹙因為要重新讀取資料更新cache﹚。

引用wiki[3]上的範例來看,
struct foo {
  int x;
  int y;
};

static struct foo f;

/* The two following functions are running concurrently: */

int sum_a(void)
{
  int s = 0;
  int i;
  for (i = 0; i < 1000000; ++i)
    s += f.x;
  return s;
}

void inc_b(void)
{
  int i;
  for (i = 0; i < 1000000; ++i)
    ++f.y;
}
兩個threads,一個執行sum_a﹙讀取f.x﹚,另一個執行inc_b﹙更新f.y﹚,兩個threads貌似彼此獨立,但,實際上卻因為f被分別塞進兩個CPUs的cache line,一邊不斷的更新,造成另一邊的cache invalidate,然後更新CPU cache,時間就無形的浪費了。但,這是可以解決的,[4, 5]列出了可能的解法。但,記得先profile[6],確定你的cache miss問題嚴不嚴重!

隨著nVIDIA在CES展上發表了Tegra 4[7],手動手持裝置﹙嵌入式系統?﹚也進入了很多核時代﹙其實早就雙核了啦﹚。撰寫程式時就需要知道這些雜七雜八的事。

但,話說回來,JavaScript / Python / Ruby / Lua,這種script language,要怎麼做才能控制到這種細節?

[1] Programmatically get the cache line size?,http://stackoverflow.com/questions/794632/programmatically-get-the-cache-line-size
[2] MESI protocol, http://en.wikipedia.org/wiki/MESI_protocol
[3] False sharing, http://en.wikipedia.org/wiki/False_sharing
[4] False sharing問題及其解决方法,http://rritw.com/a/JAVAbiancheng/thread/2011/0604/87966.html
[5] 多核平台下Cache的False Sharing问题 ,http://blog.csdn.net/duofeng/article/details/1525876
[6] Are there any way to profile cache miss in linux kernel?,http://stackoverflow.com/questions/9394193/are-there-any-way-to-profile-cache-miss-in-linux-kernel
[7] 輝達Tegra 4亮眼 台積電代工,http://news.chinatimes.com/tech/171706/122013010800435.html

星期日, 11月 04, 2012

不能用valgrind,用mtrace總可以了吧!

在嵌入式系統上,因為valgrind並不支援armv5﹙但,支援armv7﹚,所以,在抓memory leak時,有時會porting到x86上用Valgrind掃一次,能找多少修多少。但,有時還是會發生慘案,在x86上掃不出,可是,放到板子上跑時,卻會memory leak。

儘管[1]舉出數個可應用在embedded systems上的detectors,但,找不到因不慎操作shared library產生的memory leak。比如,不斷呼叫GLib GList的append/prepend卻忘了釋放,雖然GLib支援透過環境變數改變GSlice的行為,變為直接呼叫malloc。可是,像mtrace這類的工具,只會回報shared library裡面有呼叫malloc,但,卻無法透過addr2line找出memory leak的地方。

所以,產生了一個想法,自己寫一個簡單的shared library,透過掛載malloc hooks,在每一次malloc被呼叫時,使用backtrace找出當時的callstack,程式結束時,把結果寫到檔案。在搜尋撰寫library相關知識時發現,其實已經有人寫好了libmtrace,也可以卻實找出當下的callstack,算是符合當初預期的目標。太好了,省事多了XD

[1] Memory Leak Detection in Embedded Systems

星期日, 10月 14, 2012

Markdown語法說明與線上編輯

最近看了一下Markdown語法[1],其實和wiki的語法很像,都可以用純文字的方式撰寫再轉成HTML。有好心人提供了線上編輯工具[2],同時提供了轉換後的source code和preview兩種功能。

[1] Markdown語法說明, http://markdown.tw/
[2] Markdown Web Dingus, http://daringfireball.net/projects/markdown/dingus

星期日, 9月 23, 2012

socket zero-copy

一直好奇socket能不能在user-mode和kernel-mode之間達成zero-copy[1,2],看起來是可以的。

一開始是看到Linux PACKET_MMAP[3],但,PACKET_MMAP是用來做packet capture的,如果拿來做實作像RTSP的串流協定,得先花很多工夫在實作TCP這類底層的協定,光想就覺得很累。

再試著搜尋一下,也許可以透過splice[4]達成,只是較不直覺。

方法是先建一個檔案﹙也許用fallocate﹚,然後開啟檔案並用mmap對映至行程空間,接下來就是用splice把資料搬至檔案,然後用透過mmap取得的指標操作資料。簡單的表示就是︰
socket fd -> write end pipe -> read end pipe -> file fd


[1] Linux 中的零拷贝技术,第 1 部分, http://www.ibm.com/developerworks/cn/linux/l-cn-zerocopy1/index.html

[2] Linux 中的零拷贝技术,第 2 部分, http://www.ibm.com/developerworks/cn/linux/l-cn-zerocopy2/index.html

[3] Raw socket, Packet socket and Zero copy networking in Linux, http://yusufonlinux.blogspot.tw/2010/11/data-link-access-and-zero-copy.html

[4] splice(2) - Linux man page, http://linux.die.net/man/2/splice

09/30更新

文章[5]講的更貼近實務,而文章[6]說明如何調整pipe大小

[5] splice(), http://ogris.de/howtos/splice.html

[6] 深入理解PIPE, http://blog.ddup.us/?p=285

星期二, 7月 31, 2012

練習Metaprogramming

之前讀完Metaprogramming Ruby就一直想找個機會練習metaprogramming,現在終於有機會了。

atop是一個Linux上很好用的效能監視工具,在LWN上有一篇介紹的文章One-stop performance analysis using atop。

可是,分析atop的輸出檔就很痛苦了,system-level的部份畫出圖表來就一目瞭然,但,想要細究圖表中的變化,就要靠分析process-level的資料,但,process-level的資料實在太多了,一下子就被滿坑滿谷的資料淹過去。

在人工分析幾次後,我就想說﹙用Python﹚寫個程式來分析自動產生圖表吧,寫了幾行發現重複性的code很多,於是就藉機用metaprogramming的方式來處理,果真是威力強大啊!幾行code就把system-level處理的差不多了,剩下process-level。

事實上,我在使用metaprogramming之前,有用PyGTK硬寫出一個產生圖表的程式,但,無奈,產生圖表的函式庫功能不符需求,轉而使用pyplot。想說都重寫產生圖表的部份了,乾脆來重寫一次吧!才誕生metaprogramming的版本。

專案atop-plot放在github上,請各位多多指教。

星期日, 7月 15, 2012

一口氣補上The Linux Programming Interface第六,七章的投影片。
TLPI - 6 Process
View more presentations from Shu-Yu Fu
Tlpi 7-memory-allocation
View more presentations from Shu-Yu Fu

星期日, 6月 03, 2012

本週讀完了程式設計師的自我修養第10章,投影片在這!

星期三, 12月 07, 2011

當用GStreamer啟動多個pipelines時,如果記憶體使用的很多,其中一個可能原因是thread stack size!

用ulimit -s [KByte_SIZE]調小試看看吧!

原文參考[gst-devel] Memory usage


星期六, 11月 19, 2011

GStreamer Conference 2011

影片可以在這裡看到!

Vala

Vala實在是很方便的程式語言!在OSSF裡介紹Vala的影片,有興趣可以看看喔!
Vala is a new programming language that aims to bring modern programming language features to GNOME developers without imposing any additional runtime requirements and without using a different ABI compared to applications and libraries written in C.

星期三, 11月 10, 2010

GStreamer Conference 2010

GStreamer Conference 2010部份的影片和投影片已經觀賞和下載囉!

影片在這裡。

投影片在這裡。

星期五, 11月 05, 2010

Blogger和Facebook

在Facebook的網誌功能裡寫了幾篇文章,但,似乎更適合寫在Blogger裡.

所以,我用Facebook整合外部網誌的功能把Blogger匯入,以後只要寫在Blogger裡就會同步在Facebook裡了.

這篇就是寫在Blogger同步發在Facebook.

星期日, 1月 17, 2010

Developer, Engineer, or Architect?

最近想瞭解這三個詞的區別所以搜尋了一下,

找到了這篇Developer, Engineer? Architect?

也許可以參考一下.

星期六, 8月 01, 2009

計算Process的CPU使用率

前一陣子因為工作需要, 我需要計算process的CPU使用率.

這篇文章點出了CPU使用率的概念和在Windows下的實作方法.

星期日, 7月 12, 2009

空間的利用

最近整理房間, 發現平面的空間不夠用了.

所以, 想用要利用立體的空間.

目前在尋找幾個放在書桌上的架子, 把東西垂直的擺放在一起.

讓空間的利用率更好.

星期六, 7月 04, 2009

荒廢已久的網誌

今天突然想起這荒廢已久的網誌.

距離上次寫網誌已經很久了.

這中間發生了許多的事情.

好的; 壞的, 都過去了.

心裡一直有無法解答的問題.

希望能有指引, 讓我走出這迷宮.

星期日, 3月 29, 2009

Cross-compile Windows Applicatoin and Library (Static and Shared) on Linux

最近需要在Linux上編譯Windows DLL, 用Google找了一下, 結論是用MinGW來達成.

看了一些網頁, 都在講怎麼在Linux先編譯MinGW. 可是都沒成功.

後來在MinGW網頁裡的FAQ找到一個官方做法1, 使用x86-mingw32-build.sh (這檔案包含在x86-mingw32-build.sh-0.0-20061107-1.tar.bz2), 使用方法請加--help就可以看到了.

這個script會以互動模式把編譯前需要的組態和檔案搞定. 過程中, 會詢問source packages要從哪裡獲得. 第一次編譯的我, 從網路上下載囉, 下載後會把檔案放在你指定的位置, 假設/opt/mingw32/src)

但, 在編譯binutil時, 是使用binutils-2.17.50-20060716-1-src.tar.gz這個檔案, 會使得編譯失敗.

這時, 我們只去MinGW網站下載binutils-2.19.1-src.tar這個檔案, 並放入/opt/mingw32/src裡, 然後將先前的binutils-2.17.50-20060716-1-src.tar.gz先暫時移到別的地方.

然後, 重新執行x86-mingw32-build.sh並在過程中指定source packages從/opt/mingw32/src裡取得. 這樣就可以順利編譯出MinGW.

然後, 我們就可以用MinGW編譯出Windows的執行檔(.exe)和函式庫(.lib和.dll).

1. MinGW cross compiler for Linux build environment, http://www.mingw.org/wiki/LinuxCrossMinGW