2007年2月28日 星期三

Firestarter启动的问题

我和论坛里的很多朋友都遇到这样一个问题。启动Firestarter的时候,提示
“External network device $IF is not ready. Aborting..”
其中$IF是个变量,是当前使用的网络接口的名字。例如如果用eth0上网,那么显示的就是
“External network device eth0 is not ready. Aborting..”
这个问题也让我感到很困惑,并且至今没有发现有人解答。只好自己捣鼓。一番猜测和检查后,终于发现了问题所在。就此谈谈其原因和解决的办法。

在我的记忆中,该问题的发生,是在一次软件升级之后。在以前,我将firestarter设置为自启动,以方便随时查看防火墙的状态。它一直工作得很好,就在一次软件升级后,它出现了上述问题。为了查看我的eth0配置是否正确,当时便执行了ifconfig。结果发现软件升级前,ifconfig输出信息都是英文。而升级后,都是中文的了。当时并没有在意,觉得可能是安装了一些中文包的缘故。也并没有把这个变化和Firestarter无法启动的事情联系到一起。在后续检查中,发现虽然Firestarter提示错误,但iptables却运行正常。既然防火墙工作正常,那么这个图形前端,不看也罢。于是将该问题就此搁置,直到今天又想念这个图形前端了,才重新捡起来。

想到这两个变化,便做了一个推测。觉得可能是Firestarter的启动脚本比较愚蠢,会从ifconfig的输出信息中查找相关接口的配置信息。以前它查找的肯定是英文的字符串,现在由于ifconfig的输出信息变成了中文的,一些参数信息它可能无法获取了,所以导致启动失败。于是检查Firestarter的启动脚本,发现竟和我预料的一样。于是问题迎刃而解。

Firestarter的启动脚本是/etc/init.d/firestarter,其中执行了/etc/firestarter/firestarter.sh来启动防火墙,因此,其实Firestarter真正的启动脚本是/etc/firestarter/firestarter.sh。

编辑/etc/firestarter/firestarter.sh
根据本机ifconfig的输出信息来修改以下几行代码:
IP=`/sbin/ifconfig $IF | grep inet | cut -d : -f 2 | cut -d \ -f 1`
MASK=`/sbin/ifconfig $IF | grep Mas | cut -d : -f 4`
BCAST=`/sbin/ifconfig $IF |grep Bcast: | cut -d : -f 3 | cut -d \ -f 1`

例如,我的系统使用eth0上网,就执行ifconfig eth0。其中IP地址依然可以通过以上代码的第一行获取,只是子网掩码和广播地址的获取会有问题。于是保留第一行不做修改,将后两行代码中grep搜索的英文字符串改为相应中文字符串即可。

IP=`/sbin/ifconfig $IF | grep inet | cut -d : -f 2 | cut -d \ -f 1`
MASK=`/sbin/ifconfig $IF | grep 掩码: | cut -d : -f 4`
BCAST=`/sbin/ifconfig $IF |grep 广播: | cut -d : -f 3 | cut -d \ -f 1`

保存文件后,启动Firestarter。一切正常。
不知道别人遇到的问题是否和我的一样,记录下来,仅供参考吧。

Update:
无意中看到有人转载了我这个文章,内心竟萌生出一点责任感。
其实这个方法挺傻的。没有任何通用性可言。
于是把想到的一个更好一些的法子写到这里,献丑了。
sudo vi /etc/firestarter/firestarter.sh
找个合适的地方,例如在
# External network interface data
这行注释的上面,添加一行:
LANG=en_US

这样,ifconfig的输出就是英文的了,这个启动脚本也就可以从它的输出信息中搜索出需要的几个参数了。这个方法更加简单,并且感觉上通用性似乎好一点。

标签:

2007年2月26日 星期一

Effective C++

很多程序员对牛人们谈论编程经验和感想的书籍顶礼膜拜,例如市面上种种《xx缄言》,《xx夜里睡不着觉》,《高质量xx》,以及老外写的一些诸如《xx陷井与缺陷》,《Effective xx》,甚至还觉得不过瘾,又来个《More Effective xx》。不知道以后会不会再出《More and More Effective xx》,《More and More and More Effective xx》,然后一直就这样more下去,子子孙孙无穷匮。

出于好奇和对牛人以及伪牛人出书的敬佩,我也看过这些流行的小书。然后不由得想起有人曾对刘墉的文章的一句评价:“吃饱了饭,喝了杯凉水,然后放了个屁。” Bjarne Stroustrup是我心目中真的猛牛,在他的《The C++ Programming Language》一书第二版的序中,曾说过这样一句令我感动的话。 “这里的叙述仍然是针对有经验的程序员,并努力不去轻视他们的智慧和经验。” 作为一个自以为是的人,我希望得到这种尊重。

其实对于语言的学习,只要你仔细阅读语言的权威书籍,认真实践,并勤于和善于思考,很多xx的经验,不言自明。Bjarne说要写出一个好程序需要智慧、品位和耐性,万分赞同。关于如何避免在C++中依旧使用C风格,以及有效使用C++进行编程,Bjarne已经给出一些很好的忠告。胜似金玉良言。我想摘录出来,以供借鉴。其中interface一词,译者把它译为“界面”,而我觉得这里译为“接口”更妥当一些,便改为接口。另外在抄这些条目的时候,忍不住做了一点注释。

给C程序员的建议

一个人对C了解得越好,在写C++程序时大概就越难避免C的风格,并会因此丢掉某些潜在C++的优势。这里是几个有关的要点,在这些地方做同样的事情时,在C++里存在比C更好的方式:

[1]在C++里几乎不需要用宏。用const或enum定义明显的常量,用inline避免函数调用的额外开销,用template去刻画一族函数或者类型,用namespace去避免名字冲突。
(抄袭者注:宏使得代码不易于理解和维护,有更多潜在的陷井,增加了出错的可能性。这个建议在C语言中也有一定的适用性,并且gcc的扩展使得C语言也支持inline。)

[2]不要在你需要变量之前去声明它,以保证你能立即对它进行初始化。声明可以出现在能出现语句的所有位置上,可以出现在for语句的初始化部分,也可以出现在条件中。
(抄袭者注:在使用前定义变量而不是先定义好要用的所有变量再开始操作语句,这样使得代码可读性更好,并且不容易出错。在C中,对ANSI标准支持不好的C编译器,不允许在一个代码块中已经开始执行语句的位置定义变量。但如果编译器支持,那么在C语言中也应当采用这个建议。)

[3]不要用malloc()。new运算符能将同样的事情做得更好。对于realloc(),请试一试vector()。
(抄袭者注:new比malloc更加灵活,表达能力更强。使用new的代码常常更加简短,并且避免了“强制”这样的不良风格。)

[4]试着去避免void*、指针算术、联合和强制,除了在某些函数或类实现的深层之外。在大部分情况下,强制都是设计错误的指示器。如果你必须使用某个显示的类型转换,请设法去用一个“新的强制”,设法写出一个描述你想做的事情的更精确的语句。

[5]尽量少用数组和C风格的字符串。与传统的C风格相比,使用C++标准库string和vector常常可以简化程序设计。
(抄袭者注:C++在语言级别上提供了进一步的抽象,使得程序设计更加简化,维护更加容易。但无论使用C还是C++,使用安全而高效的库,总是比自己编写相关算法更好。因为这样不仅提高了生产效率,提高了代码的复用程度,而且使程序代码更简短,易于维护。所以尽量使用标准库中的容器和泛型算法,而不是自己处理低层的实现。即使自己可以将代码编写得和标准库一样高效和安全。)

最重要的是,试着将程序考虑为一组由类和对象表示的相互作用的概念,而不是一堆数据结构和一些去拨弄数据结构中二进制位的函数。


使用C++的一些忠告

要写出一个好程序需要智慧、品位和耐性。你不会第一次就能把它搞好的。试验!

[1]在编程序的时,你是在为你针对某个问题的解决方案中的思想建立起一种具体表示。让程序的结构尽可能地直接反映这些思想:
[a]如果你能把“它”看成一个独立的概念,就把它做成一个类。
[b]如果你能吧“它”看成一个独立的实体,就把它做成某个类的一个对象。
[c]如果两个类有共同的接口,将此接口做成一个抽象类。
[d]如果两个类的实现有某些显著的共同东西,将这些共性做成一个基类。
[e]如果一个类是一种对象的容器,将它做成一个模板。
[f]如果一个函数实现对某容器的一个算法,将它实现为对一族容器可用的模板函数。
[g]如果一组类、模板等互相之间有逻辑关系,将它们放进一个名字空间里。

[2]在你定义一个并不是实现某个像矩阵或复数这样的数学对象的类时,或者定义一个低层的类型如链接表的时候:
[a]不要使用全局数据(使用成员)。
[b]不要使用全局函数。
[c]不要使用公用数据成员。
[d]不要使用友元,除非为了避免[a]或[c]。
[e]不要在一个类里面放“类型域”;采用虚函数。
[f]不要使用在线函数,除非作为效果显著的优化。

请记住,这些忠告只是粗略的实用规则,而不是万古不变的定律。它们只应使用在“合理的地方”。从来就没有任何东西能够替代智慧、经验、常识和好的鉴赏力。

标签:

2007年2月3日 星期六

自由软件对谈录

me:
OO中写的doc,到了MS Word 2003中,图就乱了。
我辛辛苦苦画的流程图,变得乱七八糟。
我恨OO。早知如此,我就直接在Windows上用MSO写了

Ma: 这不赖OO

me:
那赖谁?
另外用OO Drawing画图实在太痛苦了,用Dia花图还不如用OO方便。可能是我不会用吧

Ma: 如果你用OO,为什么做完了还要拿到MS的O去打开呢

me:
因为我的领导用的都是Windows呀
别的同事用的也是Windows,他们只有MSO
我写文档不是给自己看的

Ma: 如果真要用linux下的O来完成MSO的工作,你还是试试永中的O吧

me:
微软总是唯我独尊,从不考虑和同类软件的兼容。
仗着他在操作系统上占的市场份额,嚣张得不行。

Ma: 因为1张2003的MSO才不到5RMB,你们同事为什么不使用MSO呢

me: 啊,我多么希望中国正版化运动的来临

Ma:
那样也不好
真正正版了,咱们都不能使用xp了,除非购买正版

me: 不用了呗

Ma: 我不希望因为买个xp还要买一堆相关的软件

me:
大家都用Linux,FreeBSD呗
实在想用Windows就花钱买去呗

Ma: 缺少了很多娱乐

me: 别娱乐呗

Ma: 比如游戏

me:
那样的话,游戏厂商会连夜加班去做他们游戏的Linux版本的。
你放心吧
他们为了赚钱,肯定会干。

Ma: 买了这么好配置的硬件,不game一下,还不如买个普通的机子

me:
你顶多枯燥上半年,各大游戏厂商就会纷纷推出他们游戏的Linux版本。
硬件厂商,比如傻逼华硕,也会出Linux下的驱动程序。
我就不用再为我的笔记本不能使用显卡的3D功能而惋惜。
你也可以在Linux用OO办公,FF上网上银行,删掉Wine这类的模拟器,直接安装暴雪的游戏。
那时候,网吧里装的全是Linux,傻逼游戏小孩儿的机器装的也都是Linux
计算机启蒙课程,不再讲授DOS操作,而是Linux操作。
高中生不再以会修改注册表为荣,而是以熟练的Unix shell脚本能力而沾沾自喜。
那是什么样的世界,妈的?

me:
我决定费劲周折用OO写出MSO可以基本正常浏览的文档。
假设我一旦用了盗版MSO,就会名誉扫地,遭到巨额罚款,失去银行贷款需要的社会信誉。

Ma: 那时我也鄙视你

me:
我不能为了让他们在Windows下看得舒服就付出这么大代价。
况且即便我没有被发现,盗版的行径影响了整个软件行业,使这个行业不景气。
我的薪水会因此下降,找工作困难,生活窘迫。
因此我不能为了让他们看着舒服,就冒这么大的风险。
下了。88

标签: