9/10/2006

装上了suse10.1--更新中

经过昨天八个多小时的下载,终于把DVD镜像下来了。
今天刻成了盘,赶快装上试试。

安装大约需要一个小时左右。
桌面系统只能从gnome,kde等几个中选一个。--此描述不准确,可以选择软件包
由于以前没怎么用过KDE,决定熟悉一下。
不过总体感觉挺漂亮的,颜色搭配也挺谐调。
中文显示方面就是小字体有些模糊,其它的都好。--已解决,字体设成方正宋体12号即可
输入法scim(这里叫skim?)也装上了,不过汗的是竟然装了几十种语言共几百种输入法。
视频播放某些文件还有些问题(版本原因)。

目前发现的问题有:
无法用Fn+Fx调整系统音量
找不到设置桌面快捷键的地方(非标准KDE)。--已找到,可惜没找到定义打开命令行窗口的地方
播放AVI有声音无图像(准备从ubuntu拷win32codes)

现在正在看文档,熟悉一下基本设置。

用md5sum校验文件的准确性

一般我们安装linux都是先从网上下镜像,然后再硬盘安装或刻录到光盘上再使用。
在使用这些下载来的文件前,我们必须进行正确性检测。否则,很可能就浪费时间或浪费光盘了。
经常下载站点在提供内容本身的同时,还会提供一个叫做MD5SUM或类似名字的文件。
其实,这个文件就是做校验用。
下面就通过一个综合的小实例来说明使用md5sum的全过程。
要求:将/var/www下的文件由一个位置通过网络或移动硬盘传到另一台机器上。
步骤:
cd /var/www
md5sum * > MD5SUM

如果/var/www下含有文件夹,这里会有错误提示输出,形如:
md5sum: ajax: Is a directory
md5sum: apache2-default: Is a directory
md5sum: blog: Is a directory
md5sum: codeblocks: Is a directory
md5sum: download: Is a directory
md5sum: php100: Is a directory

我们查看一下到底生成了什么东西:
cat MD5SUM
这里是:
40491cfa725e9f612597e18e5cb5a731 cube-bot-0.32.tar.gz
71b29ffeaa264caecaeb6f30813814f5 hack2.js
d779f6b43832a6d65610840fbeb0c398 hack2.js~
9dccf462d245f55ac3e0cdb0e5401f5b index2.php
4afbe1cc2bd8eb97a4e6c51e6aaf5202 ipgw.py
af7788191a44f32a9d4aafa3aa7f61c4 md5sum
9dccf462d245f55ac3e0cdb0e5401f5b phpinfo.php
2883fddfd2a1c9a448ab03862beeda81 r.php
60880cf2774e5f54159f0e7555a6c723 r.php~
6bb2397f1cd9922c46e15c2253a99c27 s.html
d3e265f801b2f3b7fa37b5578ad83ffb s.html~
9175a6e91a1a909eae8baf532c44eccf ss.html
a6cc3964fb87d1b3ed3829b0c2d1b4c6 ss.html~
aee6dc4a6715f93747137c19d151c51c w21~
4e313605a6602d7c516ec6bb32a43bad w21.html
4e313605a6602d7c516ec6bb32a43bad w21.html~
20a76cde1afb88df632c5a13d0bff1c5 w2.html
a7f67a7d9b59e2c2dae6f917e9b59934 w2.html~
现在通过各种手段移到另一个位置。假设已经完成移动,我们现在要验证各个文件在移动过程中是否有损坏。假设文件夹的内容被移到了/tmp/test下:
cd /tmp/test
md5sum -c MD5SUM

此示例输出为:
hack2.js: OK
hack2.js~: OK
index2.php: OK
ipgw.py: OK
md5sum: OK
phpinfo.php: OK
r.php: OK
r.php~: OK
s.html: OK
s.html~: OK
ss.html: OK
ss.html~: OK
w21~: OK
w21.html: OK
w21.html~: OK
w2.html: OK
w2.html~: OK
如果输出结果全部是OK,说明内容没有改变。
这里,我们模拟一下传输出现错误的情况。
在r.php文件中做任意修改,这里只是在开头加一个空格。上述结果就变为:
cube-bot-0.32.tar.gz: OK
hack2.js: OK
hack2.js~: OK
index2.php: OK
ipgw.py: OK
md5sum: OK
phpinfo.php: OK
r.php: FAILED
r.php~: FAILED
s.html: OK
s.html~: OK
ss.html: OK
ss.html~: OK
w21~: OK
w21.html: OK
w21.html~: OK
w2.html: OK
w2.html~: OK
md5sum: WARNING: 2 of 18 computed checksums did NOT match
刚才的改动涉及了两个文件,所以这两个文件的验证都失败了。
如果删除某个文件呢?这里我把w2.html~删了,看看结果:
cube-bot-0.32.tar.gz: OK
hack2.js: OK
hack2.js~: OK
index2.php: OK
ipgw.py: OK
md5sum: OK
phpinfo.php: OK
r.php: FAILED
r.php~: FAILED
s.html: OK
s.html~: OK
ss.html: OK
ss.html~: OK
w21~: OK
w21.html: OK
w21.html~: OK
w2.html: OK
md5sum: w2.html~: No such file or directory
w2.html~: FAILED open or read
md5sum: WARNING: 1 of 18 listed files could not be read
md5sum: WARNING: 2 of 17 computed checksums did NOT match
需要提醒大家的一点是,文件较大时,需要的时间可能会很长!!!
比如我刚才下的SUSE-Linux-10.1-GM-DVD-i386.iso,验证时间都几乎花了十分钟。但考虑到数据的完整性和正确性,还是值得投入的。

参考资料与推荐阅读:
windows下的md5sum验证工具
http://www.stllinux.org/meeting_notes/1998/0319/node30.html
http://www.linuxclues.com/articles/01.htm
http://www.delorie.com/gnu/docs/textutils/md5sum.1.html

9/07/2006

C++运算符重载实践

在数据结构课本上又看到C++运算符重载的内容。想起上学期的一次实验就在这里卡住了,后来乱七作糟把问题解决掉了,但还没有搞清楚。今天决定写一个小类来实验一下。
于是写了下面这个类,


class Point {
private:
int m_x;
int m_y;

public:
Point(int x,int y) {
m_x = x;
m_y = y;
}
Point(const Point& pt) {
m_x = pt.get_x();
m_y = pt.get_y();
}
~
Point() {};
int get_x(){
return m_x;
}
int get_y(){
return m_y;
}

};




不等写完,编译试试。一编译竟然有错误,提示是
main.cpp:12: error: passing ‘const Point’ as ‘this’ argument of ‘int Point::get_x()’ discards qualifiers
main.cpp:13: error: passing ‘const Point’ as ‘this’ argument of ‘int Point::get_y()’ discards qualifiers
怎么会有这样的提示呢?拷贝构造函数根本没有更改pt啊?
于是将最后两个成员函数改成
const int get_x(){
return m_x;
}
const int get_y(){
return m_y;
}
可惜错误依旧。
没办法,只好搜了。
google " error: passing as ‘this’ argument of discards qualifiers"
果然找到了相关信息,确实是最后两个成员函数的问题。不过const不应加在前面,而是要加在小括号后面。
int get_x()const {
return m_x;
}
int get_y()const {
return m_y;
}
改成上面的样子就没有错误了。后来仔细想想才知道,const加在最前面,只是说明返回的值不允许更改,说明成员函数不会更改对象属性,应该将const加在最后面。 基础不扎实,概念不清,哎……

继续编码,期间遇到非常多的问题。这里一一列估计可以写成一本书了……
比如这个函数
Point& operator - (const Point& pt) {
cout << "operator -" <
m_x -= pt.get_x();
m_y -= pt.get_y();
return *this;
}
这个函数有问题吗?
举例有语句 Point ptf = (pte - pta);
执行完后,pte就等于ptf了(仅是值)。这显然不是预期行为,pte自己是不能变的。
完整的程序请看这里,为方便起见,所有函数都是inline类型的,这在实际情况中应该分离出来一些。分离时特别要注意的是函数后的const必须写在cpp中,“const相当于函数的一部分”。

顺便说一句,如果你能读懂程序的每一行并且知道为什么要这么写的话,你的C++水平不差了!!!

参考资料:

http://www.storkyak.com/2006/07/more-gnu-c-error-messages-explained.html
http://www.daniweb.com/techtalkforums/thread53783.html
http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.14
数据结构(用面向对象方法与C++描述),殷人昆等
THE C++ PROGRAMMING LANGUAGE(Special Edition),Bjarne Stroustrup

9/06/2006

Ctrl+Alt+Backspace后桌面无图标--ubuntu技巧

不知道怎么会出现这样的问题。桌面的图标一个也不显示了,而且自已定义的快捷键也全部失效。
还好,firefox可以打开,于是上网搜了一番。

gnome下刷新桌面的方法:
killall nautilus
试了一下,显示:
nautilus: no process killed
看来nautilus这个程序是关键。于是直接运行nautilus,桌面图标马上就显示出来了。
接着Ctrl+C,桌面一闪然后就又一切正常了。看来nautilus还智能的。
顺便提一下, gnome下刷新面板的方法:
killall gnome-panel
好像应该叫GNOME技巧^_^

9/05/2006

Code::Blocks--图形化C&C++集成开发环境

code::blocks是免费,开源,跨平台的集成开发环境。支持自动完成,代码智能提示……
code::blocks由wxWidgets写成,运行于Win32,Linux,Mac等多个平台。
开发小组每天都会出一个新版本,请到 http://forums.codeblocks.org/index.php?board=20.0 下载最新版本
这里发布的是9月4日版。


9/03/2006

MinGW-Minimalist GNU for Windows

MinGW-Minimalist GNU for Windows

简介
MinGW是一个常用GNU软件的windows版本,它提供C,C++,Java,Ada等语言的编译器和一系列提高开发效率的机制(如make机制)。
MinGW中的g++是最优秀的C++编译器之一,完整支持C++最新标准(STL,智能指针等),完全能够满足你的开发需求。配合安装包中的windows相关的头文件和库文件,你可以开发任何你想要的windows程序。

安装
要下载最新版本或添加组件(如java编译器)请访问http://www.mingw.org/
MinGW是由一系列的工具包组成的,需要你根据需要分别下载安装多个文件。为方便同学们的使用,我制作了一个集成的安装包,里面包括了C,C++编译器以及make等常用工具。
下载地址是:http://www.herofit.com/download/MinGW32.rar
下载后解压到任意目录下即可使用。为方便编译,执行程序,建议将MinGW32的bin目录添加至环境变量PATH中,具体添加方法可查看SSD1的java编译器设置相关章节。例如:
假如你解压的位置是 C:/MinGW32,则请添加C:/MinGW32/bin至PATH中。

编译演示
C编译示例1
gcc src1.c -o c1.exe
程序只有1个文件,指定生成的文件名叫c1.exe

C编译示例2
gcc src1.c src2.c -o c2.exe
程序有2个文件,指定生成的文件名叫c2.exe

CPP编译示例1
g++ src1.cpp -o cpp1.exe
程序只有1个文件,指定生成的文件名叫cpp1.exe

CPP编译示例2
g++ src1.cpp src2.cpp -o cpp2.exe
程序有2个文件,指定生成的文件名叫cpp2.exe

注意,如果不用-o指定输出文件名,则默认为a.exe

使用makefile
当工程的源文件数目很多时,可以使用make机制要简化程序编译步骤,节约编译时间。
待续……

调试程序
由于空间限制,安装包中未包含调试工具GDB。需要的请自行下载GDB的windows版。解压到MinGW32目录即可使用。为使程序包含调试信息。请在编译程序时加入-ggdb参数。例如:
g++ src1.cpp -ggdb -o cpp1.exe
运行gdb cpp1.exe即可开始调试。

获得帮助
问身边的同学吧^_^
也可以到http://herofit.blogspot.com/2006/09/mingw-minimalist-gnu-for-windows.html留言