發表文章

目前顯示的是 三月, 2013的文章

靈修分享:亞略巴古的演講

亞略巴古的演說是使徒行傳一篇非常著名的講道。基督徒往往用這段經文來說明上帝的屬性,同時也會參考這段經文作為和外邦人互動的一個參考方式。最近因為團契查經查到這一段,重新思想後看到了以前沒有考慮過的面向,在這邊記錄一下。

徒17:16-34保羅在雅典等候他們的時候,看見滿城都是偶像,就心裏着急;於是在會堂裏與猶太人和虔敬的人,並每日在市上所遇見的人,辯論。還有伊壁鳩魯和斯多亞兩門的學士,與他爭論。有的說:「這胡言亂語的要說甚麼?」有的說:「他似乎是傳說外邦鬼神的。」這話是因保羅傳講耶穌與復活的道。他們就把他帶到亞略‧巴古,說:「你所講的這新道,我們也可以知道嗎?因為你有些奇怪的事傳到我們耳中,我們願意知道這些事是甚麼意思。」(雅典人和住在那裏的客人都不顧別的事,只將新聞說說聽聽。)
保羅站在亞略‧巴古當中,說:「眾位雅典人哪,我看你們凡事很敬畏鬼神。我遊行的時候,觀看你們所敬拜的,遇見一座壇,上面寫着『未識之神』。你們所不認識而敬拜的,我現在告訴你們。創造宇宙和其中萬物的神,既是天地的主,就不住人手所造的殿,也不用人手服事,好像缺少甚麼;自己倒將生命、氣息、萬物,賜給萬人。他從一本本:有古卷是血脈造出萬族的人,住在全地上,並且預先定準他們的年限和所住的疆界,要叫他們尋求神,或者可以揣摩而得,其實他離我們各人不遠;我們生活、動作、存留,都在乎他。就如你們作詩的,有人說:『我們也是他所生的。』我們既是神所生的,就不當以為神的神性像人用手藝、心思所雕刻的金、銀、石。世人蒙昧無知的時候,神並不監察,如今卻吩咐各處的人都要悔改。因為他已經定了日子,要藉着他所設立的人按公義審判天下,並且叫他從死裏復活,給萬人作可信的憑據。」
眾人聽見從死裏復活的話,就有譏誚他的;又有人說:「我們再聽你講這個吧!」於是保羅從他們當中出去了。 但有幾個人貼近他,信了主,其中有亞略‧巴古的官丟尼修,並一個婦人,名叫大馬哩,還有別人一同信從。

對基督徒來說,保羅這篇講道講的真好,不但講出了上帝的超越性(像是不住人手所造的殿、也不是金銀石的彫刻),也帶出了耶穌基督復活的大能。但最近我才注意到眾人的反應:「眾人聽見從死裏復活的話,就有譏誚他的;又有人說:「我們再聽你講這個吧!」」不曉得你看到這一段有什麼感想?可能我是玻璃心吧,如果我是保羅,我大概會非常非常的難過,看起來似乎沒有人理會這個福音、這篇講道。這篇被基督…

mmap

下面是一個很簡單、很一般的程式碼,內容是使用 openssl 所提供的函式去計算一個檔案的 MD5。既然這麼簡單為什麼要紀錄呢?理由有兩個:第一,紀錄一下要怎麼使用 openssl 的 library;第二是今天的重點,mmap。

一般來說,要計算一個檔案的 MD5,勢必要把整個檔案讀到記憶體當中(或是分批讀入,但勢必整個檔案都要吃進來),所以標準的程序應該是 open --> read --> md5 --> close。而在 read 這一步還需要額外準備一份記憶體空間給它。但如果使用 mmap 的話就可以直接少了 read 這一步了。


#include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<fcntl.h> #include<sys/mman.h> #include<sys/types.h> #include<sys/stat.h> #include<openssl/md5.h>longutil_getFileSize( char * ); voidutil_md5File( char *, unsigned char * ); static longutil_getFdSize( int ); intmain( int argc, char *argv[] ) { int fileFd = 0; long fileSize = 0; unsigned char md5sum[MD5_DIGEST_LENGTH]; int i = 0; if( argc != 2 ) { printf( "Usage: md5 <file>\n" ); return 0; } fileSize = util_getFileSize( argv[1] ); if( fi…

memcpy vs. memmove

這個事件是在工作中時間發生的案例。先看看下面的例子:

#include <stdio.h>#include <stdlib.h>#include <string.h>intmain() { int a[100]; int i = 0; int index = 5; for( i = 0 ; i < 100 ; i++ ) { a[i] = i; } memcpy( &(a[index]), &(a[(index + 1)]), sizeof( int ) * ( 100 - index - 1 ) ); for( i = 0 ; i < 100 ; i++ ) { printf( "%d", a[i] ); if( ( i % 10 ) == 9 ) { printf( "\n" ); } } printf( "\n" ); return 0; }
好了,請問上面這段程式碼在寫什麼呢?

其實很簡單,這只是一個 array shift 的動作,將 index 後面的元素全部往前搬動一格。這樣寫會有什麼問題呢?我在我自己的電腦上什麼問題都沒有發生啊?

邏輯上很 OK ,但問題出在 memcpy 這隻函式上面。一般人可能會認為, memcpy 是直接做 sequential 的拷貝動作,也就是程式會先把把 i+1 的元素拷貝到 i ,然後才會把 i+2 的元素拷貝到 i+1。很直覺,但是上面這個想法是誰說的?

來讀讀看 manual 吧!

The memcpy() function copies n bytes from memory area src to memory area dest.  The memory areas must not overlap.

換句話說,

If copying takes place between objects that overlap, th…

這個網誌中的熱門文章

如何將Linux打造成OpenFlow Switch:Openvswitch

我弟家的新居感恩禮拜分享:善頌善禱

如何利用 Wireshark 來監聽 IEEE 802.11 的管理封包