發表文章

使用 Serial Port 來除錯的時候請小心

一般來說,程式設計師在除錯的時候常常會用的一種方式就是 print 大法,在程式適當的地方插入一些顯示資訊的指令,提供開發者更多資料來除錯。而在使用這個方法來除錯的時候,有很高的機會是利用 serial port 來顯示信息,特別是在嵌入式系統的開發上。然而當透過 serial port 來印信息的時候有著潛在的風險,因為在工作上遇到了,所以就特別紀錄在下面。首先先來看看下面這一段程式。 1 2 3 4 5 6 7 #!/usr/bin/python import sys import time for item in range( 0, 10000, 1 ): print str( item ) + " ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ" 這段程式相當的簡單,就只是單純的把一個字串印個 10000 次罷了。然後我們分別透過 SSH 以及 Serial port 連到測試設備上執行這個程式,並利用 time 這個指令來量測時間。結果記錄在下面(省略印字串的輸出)。 SSH: root@OpenWrt:~# time ./test_print_01.py real    0m 0.68s user    0m 0.18s sys     0m 0.08s Serial Port (115200): root@OpenWrt:~# time ./test_print_01.py real    1m 8.18s user    0m 0.17s sys     0m 0.07s 可以發現時間差距非常的多,理由很簡單,因為 serial port 的輸出速度只有 115200 bps (本篇的實驗設備),所以慢也很正常的。問題是,如果今天要除錯的程式是一隻 time critical 的程式,那這就會遇到很大的麻煩。先把程式列在下面: test_print.py 1 2 ...

隨筆:技術的演進

在我還在念碩士班的時候,那時候一個碩士學姐講了一個她在工作上有人來面試的經驗。 學姊:你好,歡迎來應徵軟體開發工程師吧。你看看這些題目 ... 應徵者:這些我不會ㄟ ... 學姊:(太難了嗎 ... ) 沒關係,能寫多少就先寫,有問題也可以討論看看 應徵者:但是我看不懂 學姊:你知道我們要找的是 JAVA 的開發工程師吧 應徵者:我對寫 JAVA script 很有經驗 學姊:... 在當下,實驗室的人都笑了。連 JAVA 和 JAVA script 都分不清的人也敢過來面試,JAVA script 不過就是一堆美化網頁用的小技巧罷了... 這麼多年過去了,看看 HTML5、node JS ... 我不禁為當年的無知吸了一口氣。

靈修分享:神是愛

約壹3:16 主為我們捨命,我們從此就知道何為愛 ;我們也當為弟兄捨命。 約壹4:7-19 親愛的弟兄啊,我們應當彼此相愛,因為愛是從神來的。凡有愛心的,都是由神而生,並且認識神。沒有愛心的,就不認識神,因為 神就是愛 。神差他獨生子到世間來,使我們藉著他得生,神愛我們的心在此就顯明了。不是我們愛神,乃是神愛我們,差他的兒子為我們的罪做了挽回祭, 這就是愛了 。親愛的弟兄啊,神既是這樣愛我們,我們也當彼此相愛。從來沒有人見過神,我們若彼此相愛,神就住在我們裡面,愛他的心在我們裡面得以完全了。神將他的靈賜給我們,從此就知道我們是住在他裡面,他也住在我們裡面。父差子做世人的救主,這是我們所看見且作見證的。凡認耶穌為神兒子的,神就住在他裡面,他也住在神裡面。神愛我們的心,我們也知道也信。 神就是愛 ,住在愛裡面的,就是住在神裡面,神也住在他裡面。 這樣,愛在我們裡面得以完全,我們就可以在審判的日子坦然無懼;因為他如何,我們在這世上也如何。愛裡沒有懼怕,愛既完全,就把懼怕除去,因為懼怕裡含著刑罰;懼怕的人在愛裡未得完全。我們愛,因為神先愛我們。人若說「我愛神」,卻恨他的弟兄,就是說謊話的;不愛他所看見的弟兄,就不能愛沒有看見的神。愛神的,也當愛弟兄,這是我們從神所受的命令。 不管是不是基督徒,也先不管認不認同,幾乎所有人都知道基督徒很喜歡喊的一句口號(或是經文):神就是愛。愛,這是多美好的一個字,幾乎我們所想到所有的美善都可以歸到這個字裡面,對基督徒來說,用這個字來形容上帝是多美好的一件事情。可是真的是這樣嗎?有時候想一想,我發現很多基督徒們在這部分似乎搞錯了甚麼 ... 再繼續之前,還是要來一段宣告,下面的分享是本人的立場。我沒有要求誰一定要接受,就算看法不同也還是可以討論的,不過這真的是我所想的。 唐崇榮牧師曾經分享一個故事。有個牧師對唐牧師說:【只有一件事情能夠讓上帝受限制,那就是愛。】唐牧師表示無法接受這種說法,不過卻可以理解為什麼這個牧師這樣說。對唐牧師的神學觀來說,上帝是超越者,因此沒有任何東西可以限制上帝,所以正確的說法應該是上帝以祂自己的主權順服在祂自己的原則愛下面來行事,但除了描述用語以外,很明顯唐牧師並不會反對這句話的內容本身。可是以我來看,這句話卻有另外一個問題, 那就是用【愛】做為一個脫離上帝的客體來反過頭定義上帝。 這是甚麼意思呢?我們看...

libpcap 使用範例

最近因為工作上的需求,所以透過 libpcap 寫了一個小程式。程式紀錄在下面。應該不難懂,所以就不多做說明。程式主要參考 sniffex ,不過主要針對  DHCP 的封包進行攔截以及顯示。 #include #include #include #include #include #include #include #include #define SIZE_ETHERNET (14) #define SIZE_UDP (8) #define ETHER_ADDR_LEN (6) const char *DHCP_MSG_TYPE_STR[9] = { "None", "DHCP Discover", "DHCP Offer", "DHCP Request", "DHCP Decline", "DHCP ACK", "DHCP NACK", "DHCP Release", "DHCP Inform" }; struct sniff_ethernet { uint8_t ether_dhost[ETHER_ADDR_LEN]; /* destination host address */ uint8_t ether_shost[ETHER_ADDR_LEN]; /* source host address */ uint16_t ether_type; /* IP? ARP? RARP? etc */ }; struct sniff_ip { uint8_t ip_vhl; /* version << 4 | header length >> 2 */ uint8_t ip_tos; /* type of service */ uint16_t ip_len; /...

Write FD set 的用途

一段時間,我其實都不知道 select 和 epoll 這一類 function 裏面的 writefds 到底有什麼用。read fd set很容易理解,那就是有東西要讀,或者白話一點,收到封包了。那 write fd set 到底要幹嘛呢?直到今天遇到了一個情境我才使用了它 ... 在寫 TCP socket 程式的時候,會使用到 connect 這個函式。一般來說, connect 這個函式是 blocking 的,也就是會一直到事情做完才會返回。但如果將 socket 設定成 non-blocking 模式呢?這時候 connect 會立刻返回並將 error no 設定為 EINPROGRESS 。下面是"男人"的解釋: EINPROGRESS               The  socket  is  nonblocking and the connection cannot be completed immediately. It is possible to select(2) or poll(2) for completion by  selecting  the  socket  for  writing.   After select(2) indicates writability , use getsockopt(2) to read  the SO_ERROR option at level SOL_SOCKET to determine whether connect() completed successfully  ( SO_ERROR is zero ) or unsuccessfully ( SO_ERROR is one of the usual  error codes listed here, explaining the reason for the failure ). 好了,這時候我們可以看到 select 可以用來判斷 connect 是否...

如何透過 Python 來呼叫 ioctl

首先,先來抄一段 wikipedia 的定義: In computing, ioctl (an abbreviation of input/output control ) is a system call for device-specific input/output operations and other operations which cannot be expressed by regular system calls. It takes a parameter specifying a request code ; the effect of a call depends completely on the request code. Request codes are often device-specific. 簡單來說,ioctl 是針對 device 去做輸入輸出(白話一點,get/set)操作的一種方式,在 Linux 底下,所有的 kernel module 都可以被視做是一個 device,所以把 ioctl 當作一種 UK 的溝通機制也未嘗不可。不過如果要傳大量資料的話還是採用其他的方式比較妥當,像是 netlink 。在溝通的時候,User Space 和 Kernel Space 必須先定義好雙方溝通的格式。最常見的範例基本上就是 ifconfig 這隻程式了,在這裡也不去看它,反正是一支很簡單的 C 程式。 本篇要紀錄的是,在 Python 裡要怎麼呼叫 ioctl。範例很簡單,,就是實作一支類似 ifconfig 的程式(不過只有 get,懶得寫 set)。直接放在下面: #!/usr/bin/python import socket import fcntl import sys import struct import array def get_if_list (): try : fd = socket.socket( socket.AF_INET, socket.SOCK_DGRAM ) # #define SIOCGIFCONF 0x8912 /* get iface list ...

靈修分享:看見神

身為一個基督徒,有幾個問題幾乎是一定會被問到的。其中有一個問題幾乎一定會名列前茅的,就是「真的有上帝嗎?你讓我看見上帝,我就會信了!」在這個 Seeing is believing 的年代,事事都要講求證據以及符合邏輯的推論,如果沒見過上帝,又怎麼能信呢?無怪乎哲學家羅素說:「如果真的有上帝,那我會責備上帝怎麼不多提供自己存在的證據。」對我來說,「神既然是創造者,為什麼要合乎人的邏輯、定理?」將上帝擺在人的理性和慾望之下才是有問題的。不過有趣的地方在於,不要說是非基督徒,就是基督徒也常常對上帝提出同樣的要求:「主啊,我想要看見祢!」對基督徒來說,當在提這樣的要求的時候,似乎表示看見神就能夠更加的堅定信心,繼續面對前方的挑戰。可是,似乎神都沒有顯現,即便是對這群屬祂的百姓。為什麼不呢?如果說非基督徒是信心不夠,那基督徒呢?(當然也不是不能繼續宣稱信心不夠啦)。所以我想整理一下,到底聖經是怎麼說「看見神」這件事情。 首先從舊約開始。第一個看見神的人毫無疑問的是亞當。上帝創造亞當,並賜給他一個配偶夏娃,吩咐他們要管理看守伊甸園。他們在園中是何等的舒服,也能面對神、與神談話。直到他們聽了蛇的建議,吃了神不許他們吃的果子。 創3:7-10 他們二人的眼睛就明亮了,才知道自己是赤身露體,便拿無花果樹的葉子為自己編作裙子。天起了涼風,耶和華 神在園中行走。那人和他妻子聽見 神的聲音,就藏在園裡的樹木中,躲避耶和華 神的面。耶和華 神呼喚那人,對他說:「你在那裡?」他說:「我在園中聽見你的聲音,我就害怕;因為我赤身露體,我便藏了。」 聖經這邊有個很有趣的地方,在於描述亞當和夏娃眼睛明亮了。一般來說眼睛明亮應該是好事,可是在這裡卻似乎不是這麼一回事。當亞當夏娃眼睛明亮後,他們開始用自己的眼光來看自己以及上帝。看自己,覺得赤身露體,非常羞恥;看上帝,從一開始的親密,變成害怕、恐懼。從那時候開始,人對於看見神這件事情就喪失了恩典,當人看見上帝,感到的不再是安心,而是充滿著罪惡感,寧可逃離創造天地的主。之後還有誰看見過神呢?或是提出想要看見神的要求呢?繼續一個一個往下數。 出33:18-23 摩西說:「求你顯出你的榮耀給我看。」耶和華說:「我要顯我一切的恩慈,在你面前經過,宣告我的名。我要恩待誰就恩待誰;要憐憫誰就憐憫誰」;又說:「你不能看見我的面,因為人見我的面不能存活。」耶和華說:「看...