發表文章

目前顯示的是 九月, 2008的文章

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

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

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

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

Function Pointer in C

Function Pointer 是C語言最重要的高等特色之一,最常見的例子就是 State Machine 的實作以及排序演算法的 compare function 輸入。下面的程式碼只是要記錄一個基本的用法,方便之後使用參考,畢竟從來沒用過(雖然知道很久了)。

#include <stdio.h>

int sum( int, int );
int sub( int, int );
int mul( int, int );
int mod( int, int );

int (*op[4]) ( int, int ) = { sum, sub, mul, mod };

int main()
{
....int a, b, i;

....a = 5;
....b = 3;

....for( i = 0 ; i < 4; i++ )
........printf("Operation %d result: %d\n", i, (*op[i])(a, b) );
....}

....return 0;
}

int sum( int a, int b ) { return a+b; }
int sub( int a, int b ) { return a-b; }
int mul( int a, int b ) { return a*b; }
int mod( int a, int b ) { return a%b; }

exec() family

這只是一件小事,特此記錄用以提醒

在 Google 上面搜尋 exec 系列的 example code,常常會看到下面的寫法:

#include <unistd.h>

int main()
{
....char * argv[ ] ={ "ls","-al","/etc/passwd",0};
....execvp("ls",argv);
....return 0;
}

這是一個很簡單的範例,很可以編譯執行,但卻暗藏危險

Why?

首先,來問問看「男人」
The exec() family of functions replaces the current process image with a new process image.

這句話的意思是「將外部程式(ELF image)取代掉原來的 process」

所以,一般來說,在程式裡面要使用 exec 系列的 functions 時,不能在 parent process 裡叫用 exec system call 來跑外部程式;否則 parent process 會消失。正確的作法應該是先 fork 一個 process,並於那個 process 裡面進行 exec 的呼叫。而上面的範例之所以沒問題只能說是「剛好」沒問題而已,為什麼剛好沒問題... 自己看囉~

一個可以看出錯誤的例子

#include <unistd.h>
#include <stdio.h>

int main()
{
....int a = 0;
....char * argv[ ] ={ "ls","-al","/etc/passwd",0};
....execvp("ls",argv);

....a++; // 你會發現這裡不會執行唷~
....printf("a = %d\n", a); //

....return 0;
}

正確的範例

#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>

int main()
{
....int a;
....char * argv[ ] ={ &q…

Linux Multicast Routing Cache

圖片
在 Linux 裡面,Multicast 的 Routing 會不同於一般的 Routing 方式,在公司實驗的時候,明明 Routing Table 都已經進行設定了,封包卻始終不按照自己所想的方式來轉送,於是跟同事進行研究後,得到下面的結論。

首先,先來看一張圖





當然,這張圖有點小,請按照連結去觀看原始大小

當網卡收到封包以後,處理順序會是
netif_receive_skb -> ip_rcv -> ip_rcv_finish -> ip_route_input -> ip_route_input_slow ...

在 ip_route_input 和 ip_input_route_slow 裡面會進行 routing 的動作
但其實在 ip_route_input 裡面有多加了一段判斷,是圖中所沒有的

/linux/net/ipv4/route.c

if (MULTICAST(daddr))
{
...
return ip_route_input_mc(skb, daddr, saddr, tos, dev, our);
}

很明顯的可以看到 multicast 是被例外處理的
而 MULTICAST 的定義如下:

/linux/include/linux/in.h

#define MULTICAST(x) (((x) & htonl(0xf0000000)) == htonl(0xe0000000))

很明顯的,可以看出是 Class D 的區段

總之,要 Linux 進行 Multicast Forwarding 的條件如下:

1. /proc/sys/net/ipv4/conf/all/mc_forwarding 要設成 1

請注意,這邊直接使用 echo 來設定是沒有用的
MRouterFD = socket( AF_INET, SOCK_RAW, IPPROTO_IGMP );
setsockopt( MRouterFD, IPPROTO_IP, MRT_INIT, (void *)&Va, sizeof( Va ) );

這是直接抄自 smcroute 的 code (當然我拿掉了 error protection 的部分)

2. /proc/net/ip_mr_cache 裡面要有資料

簡單來說,就是 multicast routing tab…

這個網誌中的熱門文章

如何將Linux打造成OpenFlow Switch:Openvswitch

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

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