9/26/2006

转换分区格式--linux技巧

好久不用windows,留着FAT32真是没什么用。为避免中文乱码及azureus-error中提到的那个恶心的错误,我一直计划着把FAT32转成ext3。
最初,我硬盘里共有三个FAT32分区。由于都有内容,只能慢慢整理,慢慢转换。
由于概念不清,基础知识不扎实等,走了很多弯路。
第一次转换
最初我是想能不能无损数据完成转换的,但没有找到相关资料。就了下面的方法:
  1. 用fdisk删除一个分区,然后再新建一个分区;
  2. 重启(fdisk提示说重启后才生效);
  3. mkfs;
  4. 修改/etc/fstab;
  5. mount -a;
可是实践时,出了大麻烦。执行完第一步后,机器已经起不来了,搞了半天才知道,第一步已经改变了分区表,hdaX的X很多都变了。于是用live-CD启动,上网找了一堆资料,终于在RecoveringUbuntuAfterInstallingWindows指导下搞定了。
第二次转换
也就是今天,我刚刚做的。
  1. umount /dev/hdaxx
  2. 用fdisk的t命令改变分区格式,改成83(linux);
  3. 重启;
  4. 用mkfs.ext3 /dev/hdax或mkfs -t ext3 /dev/hda建立新的文件系统;
  5. 修改/etc/fstab;
  6. mount -a;
成功了,但却无法往分区上写东西。
重启后就可以写了。
总结
要注意区别分区和文件系统,用fdisk只是为了改变分区格式,用mkfs才是建立我们熟悉的vfat,ext2,ext3等文件系统。第一次做lfs时,我忘了改变分区格式,结果无论如何都启动不了lfs,重做了几遍,还好有备份。
不保证上述方法同样适用于你的系统。

参考资料
man fdisk
man mkfs
http://www.linuxmine.com/39733.html

9/23/2006

c++笔记--模板,成员初始化等

模板类,不能像通常的类那样将单独的实现文件放在一个cpp中。
如果非要这么做,就必须在每个函数前加上export关键字。形如:
export T& A::getNext(const T& any)
但export虽然是c++标准的关键字,但目前可见的绝大部分编译器均不支持它。详情请看参考资料。
因此,一般情况下我们应该将模板类的全部声明和定义写在一个头文件中。
当然,如果你不嫌使用时需要包含两个文件(即.h和.cpp)的麻烦,可以将定义单独写到一个cpp中。
从模板类继承时,不要忘了尖括号。如:
template <class T>class B:public A<T>
习惯上在template另起一行,函数也是如此。即:
template <class T>
class B:public A<T>

在构造函数中初始化成员变量时,应该尽力保证初始化顺序和声明顺序一致。
如果不注意的话,则可能出现类似这样的错误或警告。
:: === cb, Debug ===
testdriver.cpp:110: instantiated from here
LinkedList.h:37: warning: count will be initialized after
LinkedList.h:75: warning: when initialized here
:: === Build finished: 1 errors, 3 warnings ===
但很奇怪的是,已经生成了可以运行的可执行文件。
另一个例子请看参考资料。

参考资料:
export关键字
http://gcc.gnu.org/ml/gcc-help/2005-04/msg00317.html

gaim2.0内置QQ协议了--多截图






我现在用的版本是svn20060917。以下是我看到的主要改进:
一:内置了QQ协议,添加帐号方法如图示。好像还不能收发文件;
二:用户昵称用不同颜色显示,平滑移动,及一些小的界面改进
三:能显示google talk好友的图片了。

另外,tencent最近搞了个webqq,竟然……

参考资料:
http://www.zoudan.com/doc/qq_gaim.htm
http://gaim.sourceforge.net/

9/22/2006

ubuntu dapper下安装xgl--还差一点

(此外省略前期准备,以后再补充)

关键的安装代码
sudo apt-get install compiz xserver-xgl libgl1-mesa xserver-xorg libglitz-glx1 compiz-gnome

结果输出:
Password:
Reading package lists... Done
Building dependency tree... Done
xserver-xgl is already the newest version.
libgl1-mesa is already the newest version.
xserver-xorg is already the newest version.
libglitz-glx1 is already the newest version.
compiz-gnome is already the newest version.
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
compiz: Depends: compiz-plugins (>= 0.2) but it is not going to be installed
E: Broken packages

没办法,源里没有csm包,所以安装不能继续。我只能先不安装一些东西,代码如下:
sudo apt-get install xserver-xgl compiz-gnome libglitz-glx1 libgl1-mesa
……
……
……
经过一番努力,xgl终于成功了,可是一点特效都没有,只是窗体的标题栏全都消失了。
用gconf-edit看了一下,一个plugin也没有加载成功,汗……
于是开始疯狂google,在参考了不下100个网站后,宣告放弃。
我觉得是xgl的源有问题,并且相信过几天就能修复。等等吧!

9/20/2006

linux下打拳皇(KOF)--ubuntu技巧









安装
sudo apt-get install xmame-x

下载rom
kofXX.zip和neogeo.zip放到/usr/share/games/xmame/roms
如果是在KDE下,路径可能需要相应的改变。一般是在/usr/lib/games/xmame/roms

运行
xmame kofXX
其中XX为96,97等等。也可以用完整的文件名,比如kof97.zip
部分机器在这里可能会出现黑屏的情况,这时只要按Ctrl+alt+F1切换到其它终端,然后再按ctrl+alt+F7回到图形界面即可。应该是xmame太旧了,我正在下最新版本的源码……

设置键位
按TAB即可开始设置键位。从设置界面里看到,可以两个人对打。

图形界面前端
如果你想方便地设置显示及声音等选项,建议安装一个图形前端。比如gxmame,kxmame。我这里只介绍gxmame,源里好像有点问题。建议直接去sourceforge.net/projects/gxmame下载最新的0.35b2的deb预编译包。
装上后,会在游戏菜单里面生成相应的项目。单击界面,选择“available”,然后再点击"Refresh",然后再双击相应项目就可以开始游戏了。个人感觉属性里,display的resolution最重要了,在这里可以选择放大的比例。
需要注意,gxmame也是调用xmame,所以使用它也可能会有黑屏的现象。解决方法见上文。

可能遇到的问题
除了已经提到的黑屏问题。rom文件的有效性问题是最大的问题,网上下的zip并不是每个都好用的,只有下下来试玩一下才知道。gxmame也能帮我们验证有效性。

输出模式
共有三种,分别是x11,SDL,openGL,分别可以用ctrl+insert,ctrl+home,ctrl+pageUP切换出来。选择输出模式主要是为了降低CPU占用率,避免声音断断续续,节省系统资源。如果显卡3D驱动已经安装,选择openGL可以使CPU占用率保持在30%以下。另外alt+pageDown可以切换到全屏模式。

截图
见最开始部分。除了neogeo,CPS1,CPS2游戏也都可以玩。


相关资源:
http://x.mame.net/
sourceforge.net/projects/gxmame

9/18/2006

ACE安装配置--ubuntu技巧

ACE自适配通信环境(ADAPTIVE Communication Environment)是可以自由使用、开放源码的面向对象(OO)框架(Framework),在其中实现了许多用于并发通信软件的核心模式。ACE提供了一组丰富的可复用C++ Wrapper Facade(包装外观)和框架组件,可跨越多种平台完成通用的通信软件任务,其中包括:事件多路分离和事件处理器分派、信号处理、服务初始化、进程间通信、共享内存管理、消息路由、分布式服务动态(重)配置、并发执行和同步,等等。
不再继续介绍了,我来介绍一下ACE在ubuntu下的安装,并运行一个简单的示例。
sudo apt-get install libace-dev libace-doc libace5.4.7c2a libssl-dev
这样,一个完整的开发以及运行环境就建立起来了。
下面,写一个简单的程序来体验一下这个框架。


#include <ace/INET_Addr.h>
#include <ace/SOCK_Connector.h>

#include <ace/SOCK_Stream.h>
int main(int argc, char *argv[])
{
const char *pathname =
argc > 1 ? argv[1] : "/";
const char *server_hostname =
argc > 2 ? argv[2] : "www.herofit.com";
ACE_SOCK_Connector connector;
ACE_SOCK_Stream peer;
ACE_INET_Addr peer_addr;
if (peer_addr.set(80, server_hostname) == -1 )
return 1;
else if (connector.connect( peer, peer_addr) == -1)
return 1;
char buf[BUFSIZ];
iovec iov[3];
iov[0].iov_base=(void*)"GET ";
iov[0].iov_len=4;
iov[1].iov_base=(void*)pathname;
iov[1].iov_len=strlen(pathname);
iov[2].iov_base=(void*)" HTTP/1.0\r\n\r\n";
iov[2].iov_len=13;
if (peer.sendv_n(iov, 3) == -1)
return 1;
for(ssize_t n;(n = peer.recv(buf,sizeof(buf)))>0;)
ACE::write_n(ACE_STDOUT, buf, n);
return peer.close();
}

编译上面的程序:
g++ testace.cpp -o testace -lACE
运行:
./testace index.php www.herofit.com



最后提醒一点,ACE的授权许可证并不要求使用它的软件开放源码。

参考资料:
http://www.flyingdonkey.com/ace/
http://www.cs.wustl.edu/%7Eschmidt/ACE.html

9/13/2006

临时改变区域语言设置--ubuntu技巧

有时候,我们检查程序在不同的语言设置下的运行效果。
比如,在英文环境下,我想使用中文firefox,这时候我们可以
export LANG=zh_CN
firefox
又如,在中文环境下,希望使用英文版的dia进行类设计(原因是中文翻译的太不好,以致于根本理解不了),
export LANG=C
dia
C也可以是en_US什么的。

举这两个例子就是提供一个可以临时改变区域语言的方法,希望有点用。

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&amp;amp;amp; 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留言