存档

2010年1月 的存档

Slackware安装配置

一月 30th, {2010 2 条评论 10,283 人阅读过  

前两天实验室新买了一台服务器,装系统的活就交给了我,一直钟爱于Slackware,于是就想着把服务器上也装一个Slackware,因为是台裸机,没办法就去买了张CD,刻了张Slackware13.0CD1,服务器也不需要图形界面之类的东西,一张CD就完全足够了,然后借了个USB光驱就开始安装了。
1.Slackware安装

第一次用CD安装,过程很顺利,其实也没有什么特别需要说的,就是按照提示一步一步来的,第一步是分区,服务器是1T 的硬盘,这么大的硬盘我还真不知道该怎么分区,留了200G以后以防以后需要装Windows,可能性极小,但还是留了。

我的分区方案是:

swap分区 4G
ext3 40G 挂载在/ 用于存放操作系统
ext3 10G 挂载在/tmp 临时目录,10G着实有点大,不过硬盘空间也实在是用不完
ext3 700G 挂载在/home 把剩下的磁盘空间全给了/home,这样每个人开一个账户,在上面怎么折腾都行
ntfs 200G 挂载在/winback 为将来的windows预留的,十有八九是用不到的

接下来的硬盘安装就很简单了,只不过没有Ubuntu等发行版那么好看的界面,安装起来也一样很方便,引导程序安装了Slackware默认的LILO

另外把我当时硬盘安装的过程也简单写一写:
下载了一个grub020p.zip,解压开后放到了C盘根目录下,然后修改boot.ini文件,在最后面加一句话:

C:\grldr="Start GRUB"

menu.lst改不改无所谓了,我是没改过,还是喜欢直接在grub下用C进入command提示符模式,自己输地几个命令。

然后把slackwarecd1,cd2解压到某分区根目录下,找到bzImage和initrd.img两个文件放到某目录下,注意一定要放在FAT32的分区下,貌似grub识别不了ntfs,没有fat32分区想要硬盘安装就麻烦了。

OK,重启之后就可以进入grub界面了,然后C键,输入下面命令:

grub>root (hd0 , 3)
grub>kernel /boot/bzImage
grub>initrd /boot/initrd.img
grub>setup

这样grub就把内核装进了内存,接下来的操作就跟光盘安装一样了,只不过在选择安装源的时候指定刚才解压的那两个CD的目录就可以了。

2.Slackware基本配置

实验室服务器配置就先暂时不说了,服务器暂时还没有特别的要求,既不做web服务器也不做ftp服务器,把ssh启了就可以了,sshd是默认启动的,所以装完之后我就懒得去管它了。

简单地说一下我自己的机器上的配置吧。slackware安装完成之后默认没有进入图形界面,可用命令startx进行图形界面,前提是安装了图形界面,slackware的六张cd里面,第一张是系统核心的东西,必须安装的,第二张里面有xfce4,第三张里有kde,我没装,剩下的三张没下下来,也不知道有什么,不过前两张cd就完全够用了。

slackware默认的运行级别是3,可以在修改/etc/inittab文件,将启动级别修改为4,则会自动进入图开界面。

ouclwp@darkstar:~$ sudo vi /etc/inittab
# Default runlevel. (Do not set to 0 or 6)
id:3:initdefault:
#将这句话中的3改成4就可以了,各级别的作用如下:
# These are the default runlevels in Slackware:
#   0 = halt
#   1 = single user mode
#   2 = unused (but configured the same as runlevel 3)
#   3 = multiuser mode (default Slackware runlevel)
#   4 = X11 with KDM/GDM/XDM (session managers)
#   5 = unused (but configured the same as runlevel 3)
#   6 = reboot

其实rc.4这个脚本所做的唯一工作是启动了X11 Session Manager,先检测gdm,然后是kdm,都找不到就启动xdm,如果不安装gnome和kde的话就会用xdm启动,xdm是很难看的,我安装了一个kdm,后来用着不爽,最后还是换成了gdm。

我在将kde换成gdm的时候出了一个问题,当时gdm没装好,而kdm已经被我删了,这时候运行级别4和startx都进不了xfce4图形界面,查看了一下/etc/X11/xinit里面的文件,发现xinitrc这个符号链接变成了红色,这也就意味着这个链接的源不见了,查看了一下确实是,它居然是链到xinitrc.kde的,这是我怎么也不能理解的,kde环境连同kdm一起早就被我给删了,xinitrc.kde也不在了,而且我也从来没用过kde,startx就是执行了xinitrc这上脚本,所以就会出问题,我把xinitrc重新连接到了xinitrc.xfce上就没问题了。

编码格式

编码格式刚开始是用的GBK,后来发现用GBK有诸多不便,从网络上读取数据的时候大多数的服务器软件都是用的UTF-8编码,取下来的数据都要通过程转换成GBK,非常麻烦,于是终于鼓起勇气把编码格式转换成了UTF-8。

ouclwp@darkstar:sudo vi /etc/profile.d/lang.sh
#修改下面两句话
export LANG=zh_CN #将系统汉化
export LC_CTYPE=zh_CN.UTF-8  #使用UTF-8做为编码格式

这样修改就可以了,当然从GBK迁移到UTF-8还要做很多修改,最麻烦的就是中文文件名乱码,可以写个脚本全部修改过来的,不过后来看看觉得也不多,就懒得写了,用下面的命令修改:

ouclwp@darkstar:convmv -f gbk -t utf8 --notest *

另外还有一些软件像gftp都要修改的,就不一一写出来了,gftp我已经不再用了,FileZilla我个人觉得是一款极为出色的FTP客户端软件,强烈推荐。

音乐播放器我用的是mocp(music on console),一个纯命令行的音乐播放器,非常漂亮。

中文字体我用的是Vera Sans YuanTi ,下载下来之后放到/usr/share/fonts里面,然后更新一下字体缓存就可以了

ouclwp@darkstar:/usr/share/fonts$ fc-cache -fv

其它的都没有什么值得说的了。个人觉得slackware是一个出色的发行版,而且特别适合做开发,它集成了很多常用的开发包,像libxml2,libpng,openssl等等,用起来非常方便。slackware虽然没有apt或者yum这样在线的包管理工具,但slackware的pkg包管理工具一样很出色,而且在slackbuild.org上可以下载到绝大多数常用的包,强烈推荐每一个coder或者developer使用slackware,它给我最直接的感觉就是简洁,高效,稳定。

分类: Linux 标签: ,

关于C/C++的内存管理和函数回调

一月 29th, {2010 5 条评论 8,502 人阅读过  

最近一直都在用C++写程序,这几年都在用像C#,java这样的高级语言,很多C/C++的机制用起来突然发现自己已经那么不熟练了,甚至有些东西在当初就没有理解透彻,简单地说一下自己遇到的一些小儿科的问题。

1.C的内存管理

首先便是C/C++的内存管理机制,C#和java这样的高级语言是很牛的,他们有自己的自动内存管理机制,不需要程序员去人为地释放分配的内存,而之于C++便不同了,每一次在内存中new一块内存空间,在使用完后都要及时地释放,一个new便一定要对应一个delete,new完没有delete,这可能不会马上出现太大的问题,不过程序却会蚕食着内存,直到耗尽。

另外就是变量在内存中的存储位置问题,其实以前在用高级语言的时候都从来不考虑这个问题的,而现在不同了,想做一个c/c++ coder ,就需要把这些细节都弄清楚,通过new动态分配的内存空间是存在于堆上的,而且函数内部定义的变量的内存空间是存在于堆栈上的,当初对这个问题产生了一个弱弱的疑问,像下面这段代码:

1
2
3
4
void test()
{
       char* name = new char[10];
}

当初就是想不明白,那name到底是存放在哪里的呢,哈,其实现在想想都觉得当初真是傻啊,name是一个指针,它本身就是一个占四个字节空间的变量,这4个字节理所当然是存在于栈上的了,而name所指向的那10个字节的内存空间是存在于堆上的,逻辑关系其实非常清晰。

因为函数成员变量只在函数局部有效,函数执行完毕后堆栈上的东西便不存在了,于是想要返回一个字符串的时候就有可能会出这样的错误:

1
2
3
4
5
char* test()
{
       char name[] = "hello world";
       return name;
}

这样写的话编译器好像会提示吧,记不清了,反正我没这样写过,返回字符串我常用的方法有两种:

1
2
3
4
5
6
char* test()
{
       char* name = new char[10];
       ........
       return name;
}

这样在通过调用test函数得到一个返回值,用完后必须要记得释放那块内存空间,这个问题很容易遗忘,检查代码的时候发现了好几外这样的问题。
另外一种是通过函数参数

1
2
3
4
void test(char* name)
{
        strcpy(name , "hello world!");
}

这样在使用的时候就可以这样调用了:

1
2
char name[20] = { 0 };//我习惯这样初始化字符数组
test(name);

或者new一个字符数组,这样在用完后还是在这一层次上delete掉,一个new对应一个delete,逻辑关系很明确,不太容易出问题。

2.C++使用回调函数

这个问题以前也没有考虑过,最近在用C++和GTK+做开发,本来是打算用QT,后来觉得在GTK的桌面环境下QT的程序跑起来看上去总是很别扭,后来也考虑了gtkmm,可觉得gtkmm不能用在c里面,我也不一定一直都用C++,不如借此机会学习学习GTK,然后就选了GTK,还是习惯面向对象,然后最后决定用C++和GTK这种组合,自己都觉得有点不伦不类。

GTK中的信号机制是采用的函数回调,这在C里面是肯定没有问题的,但如果要在C++的类中引入回调函数,确实有一些麻烦,C++是不允许将非静态成员函数作为回调函数的,这也就是说回调函数一定要是一个类的静态成员函数,当然这样又出现了一个问题,非静态成员不能够调用类的成员变量 和成员函数,这是个大问题,然后我就想了一种方法,下面是一个gtk中信号实现的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class test
{
    public:
       test();
       void hello();
       void initialize();
       static test* pthis;
       static void testfunc(GtkWidget* widget , gpointer data);
};
void test::initialize()
{
    test* pthis = this;//静态成员函数是不能在类中赋值的,这里相当于定义。
    ...............
    g_signal_connect(someobj , "clicked" , G_CALLBACK(testfunc) , pthis);
}
void test::testfunc(GtkWidget* widget , gpointer data);
{
    test* pthis = static_cast<test*>(data);
    pthis->hello();
}

我一直都是这样干的,不知道这算不算个野路子,不过我的程序是没有在这方面出过问题。

分类: C/C++ 标签: ,

终于给自己划了一块地

一月 28th, {2010 11 条评论 8,552 人阅读过  

下午在网上买的虚拟主机,卖家口碑很好,事实也证明了选他的主机绝对是对的,价格公道不说服务还真是到位,域名我也找他买的,下午刚想好域名,晚上吃完饭回来就能用了,因为不懂php嫌麻烦就直接请他帮忙把wp也给我装好了,回来一看整个博客就可以用了,哈,真是不错,狠赞一个。

wordpress真是强大,以前只是在网上看到别人的博客是用wp做的,很漂亮,现在自己在用了才发现wp确实很强大,枉我做了这么多年的web,虽然不懂php,看用了之后也倍感汗颜啊,我当初接触web的时候这些神奇的功能应该都不会有,没想到几年过后已经发展到如此地步,幸亏我早已跳出web行业,要不然又得压力巨大。

OK!总算给自己划了一块地,以后可以把一些零散的问题整理整理扔上来了,庆祝一下!

分类: My Life 标签: