2009年8月28日星期五

继续写blogspot

自从blogspot被封以后,好长时间没有去登录,今天得闲,tor + FoxyProxy登录,把前段时间在http://liuhongdan.bokee.com的文章转到我的http://liuhongdan.blogspot.comhttp://hongdanliu.blogspot.com上,速度还行,呵呵。

ok,以后记着,别再落下了。

在fedora中安装lxr浏览内核源代码

说明:本文旨在在fedora中安装lxr,此安装方法与fedora版本无关,本文在fedora 11中进行的安装,参考的是fedora 4/9等文章说明,成功。使用普通用户安装,过程中使用到su命令,lxr设置为可以同时查看多个版本源代码。

1.下载lxr-0.3
下载地址:http://sourceforge.net/projects/lxr/files/
说明:lxr的最新版使用的是PostgreSQL,麻烦,0.3则不需要数据库,方便。

2.下载glimpse
http://webglimpse.net/download.php
http://webglimpse.net/trial/glimpse-latest.tar.gz

3.安装lxr
3.1解压lxr,进入解压后的文件夹lxr-0.3,修改Makefile文件,主要有两项:

Code:
# The location of your perl5 binary
PERLBIN=/usr/bin/perl
这是perl的路径名,/usr/bin/perl是大多数情况下的默认配置,如果不同,请用whereis perl查找。
# LXR will be installed here
INSTALLPREFIX=/var/www/html/lxr
这是lxr脚本的安装目录,其中/var/www/html取自Apache配置文件/etc/httpd/conf/httpd.conf中的DocumentRoot(文件根目录)的值。
3.2执行"make install"
Code:
su
make install
这会在上述INSTALLPREFIX目录安装相应的脚本和文件.

4.安装glimpse
进入解压后的文件夹,执行:
Code:
./configure
su
make install
以下操作需要root权限:

5.把源代码放在/var/www/html/lxr/source文件夹中
这里可以放多个,比如linux-1.0, linux-2.4.0, linux-2.6.18.8,其中linux-1.0.tar.bz2和linux-2.4.1.tar.bz2解压后的文件夹都是linux,请自行改名,原因后面说明。

6.在source中建立两个文件versions和defversion,其中versions为你的源代码版本(即你的目录),defversion为你的default version,即lxr默认展示的那个version。
versions的内容就是所有的源代码的版本,如下:
Code:
linux-1.0
linux-2.4.0
linux-2.6.18.8
defversion的内容如下:
Code:
linux-2.4.0
7.修改lxr的配置文件lxr.conf,先备份一下:
Code:
# cp lxr.conf lxr.conf.bak
需要修改的有variable v, baseurl, htmlhead, htmltail, htmldir, sourceroot, srcrootname, dbdir和glimpsebin,如下(这里用到了前面建立的两个文件versions和defversion):
Code:
# Configuration file.

# Define typed variable "v", read valueset from file.
variable: v, Version, [/var/www/html/lxr/source/versions], [/var/www/html/lxr/source/defversion]

# Define typed variable "a". First value is default.
variable: a, Architecture, (i386, alpha, m68k, mips, ppc, sparc, sparc64)

# Define the base url for the LXR files.
baseurl: http://localhost/lxr/http/

# These are the templates for the HTML heading, directory listing and
# footer, respectively.
htmlhead: /var/www/html/lxr/http/template-head
htmltail: /var/www/html/lxr/http/template-tail
htmldir: /var/www/html/lxr/http/template-dir

# The source is here.
sourceroot: /var/www/htl/lxr/source/$v/
srcrootname: $v

# "#include " is mapped to this directory (in the LXR source
# tree)
incprefix: /include

# The database files go here.
dbdir: /var/www/html/lxr/source/dbdir/$v/

# Glimpse can be found here.
glimpsebin: /usr/local/bin/glimpse

# The power of regexps. This is pretty Linux-specific, but quite
# useful. Tinker with it and see what it does. (How's that for
# documentation?)
map: /include/asm[^\/]*/ /include/asm-$a/
map: /arch/[^\/]+/ /arch/$a/
8.创建lxr/http/.htaccess文件,即/var/www/html/lxr/http/.htaccess,内容如下:

Code:

SetHandler cgi-script
9.修改/etc/httpd/conf/httpd.conf文件的lxr设置和ServerName设置
9.1在文件最后添加如下几行
Code:
# Cross Reference Stuff

Options All
AllowOverride All
或者
Code:

Options All
AllowOverride All
order allow,deny
allow from all
9.2修改vim /etc/httpd/conf/httpd.conf中ServerName为localhost:
Code:
ServerName localhost
说明:原文件中可能把ServerName注释了,如果不修改则会在开启httpd的时候找不到ServerName而有如下相似的错误:
Code:
#service httpd start
Starting httpd: httpd: Could not reliably determine the server’s fully qualified domain name, using 127.0.0.1 for ServerName
Starting httpd: [ OK ]
10.建立lxr的数据文件
由于前面设置的dbdir为/var/www/html/lxr/source/dbdir/$v/,我们在lxr/source/dbdir/下面建立 linux-1.0, linux-2.4.0, linux-2.6.18.8等相关文件夹,以linux-1.0为例,进入lxr/source/dbdir/linux-1.0,然后生成lxr数据文件:
Code:
# cd /var/www/html/lxr/source/dbdir/linux-1.0
# /var/www/html/lxr/bin/genxref /var/www/html/lxr/source/linux-1.0/
生成fileidx和xref两个文件
# glimpseindex -H . /var/www/html/lxr/source/linux-1.0/
生成7个.glimpse_*文件
# chmod 755 *; chmod 755 .g*
(中间是分号)将这几个数据文件修改为任何人均可读可执行。
11.启动Apache服务器.
Code:
# /etc/rc.d/init.d/httpd start
或者
# service httpd start
12.完成,在浏览器中输入地址http://localhost/lxr/http/,点击source就可以浏览和查找不同版本的linux源代码了,或者直接http://localhost/lxr/http/source也可以,一样的效果。

13.如果开启了selinux,则可能会被selinux禁止,使用如下命令关闭selinux:
Code:
# setenforce 0
查看selinux状态:
# getenforce
如果需要安装在自己另外设置的目录的话,需要在/etc/httpd/conf/httpd.conf中把DocumentRoot改为自己的目录,所有相关的Directory也需要更改。

Options All
AllowOverride All
order allow,deny
allow from all

即可。

fedora: 一个非常酷的主题+图标(Overglossed +Black-White 2 Vista)

fedora非常cool的主题,只要你看到,你一定会喜欢,那黑色的任务栏,深邃的蓝色,绿色的麦地,以及地平线上的太阳,没有刺眼,却很辽阔,没有灿烂,却有犹豫的晴朗。
上图:
Click the image to open in full size.
Click the image to open in full size.
Click the image to open in full size.
Click the image to open in full size.

方法:
主题为Overglossed:
http://gnome-look.org/content/show.p...13&forumpage=0
图标为black-white 2 Vista:
http://dbgthekafu.deviantart.com/art...Vista-73277142
图标里面有一些其他的图标,可以用来设置自己的主目录的各个文件夹的图标,在文件的属性里面改变图标即可。
背景为Grassy Sunset:
http://interfacelift.com/wallpaper/details.php?id=1537

参考:

10 Of The Best Linux Desktop Customization Screenshots To Inspire Your Creativity
http://maketecheasier.com/10-of-the-...ity/2008/11/28

1) My Desktop by ramios

* GTK2.0 Theme: Overglossed by TheRob [link]
* Emerald: Overglossed by TheRob [link]
* Icons: Black-White 2 Neon/Style by DBGtheKafu [link] [link]
* Wallpaper: Grassy Sunset by mattyv8 [link]

fedora 10的3D桌面教程以及相关设置

以前在bbs.fedora-zh.org写的文章,没想到似乎论坛的数据丢失了一部分,幸好有其他人转载,想起放在博客中备份一下,记录自己,方便后人。

http://bbs.fedora-zh.org/showthread.php?t=568

1.安装compiz:
代码:
[root@dan ~]# yum list compiz*
能看到很多关于compiz的包包
于是我们安装compiz:
代码:
yum install compiz
2.安装compiz-fusion:
代码:
yum install compiz-fusion*
3.安装fusion*
代码:
yum list fusion*
代码:
yum install fusion*
4.安装emerald主题(就是窗口装饰)
代码:

yum list emerald*
yum install emerald emerald-themes
5.安装任务栏托盘
代码:
yum list avant-window-navigator*
yum install avant-window-navigator
如果上面5个都OK了,那么可以在系统工具找到Compiz Fusion Icon了,启动就好了,会在右上角看到那个带鼠标蓝色立方体,avant-window-navigator在附件里面,也要启动,然后就自己配置吧!!
下面是我的图,可能有些人看过,不过我又配置为一样的啦











关于如何把compiz和avant-window-navigator添加到自启动:
1.应用程序-->系统工具-->Compiz Fusion Icon,右键,"将此启动器添加到面板"。
2.在面板上右键刚才添加的Compiz Fusion Icon带鼠标的蓝色立方体,选择"属性",这时候我们能看到启动器的属性,类型,名称,命令,注释等。
3.系统-->首选项-->个人-->会话,在"启动程序"中选择“添加”即可,按照方才的启动器的属性复制粘贴即可。
4.avant-window-avigator也同理。
5.下次启动时应该会自动启动了。


我超喜欢那张girl的图
下面是compiz的设置,firefox常用插件等。

关于Emerald设置:
右键通知区域的Compiz Fusion Icon图标,选择Emerald Theme Manager,则会出来我们安装的Emerald Themer,选择一款自己喜欢的主题,鼠标选中就可以了,不需要过多的设置。

关于CompizConfig设置:
同上,右键选择Settings Manager,则会打开CompizConfig Settings Manager窗口,下面几个是我个人推荐的选项:
1.桌面-->Expo, Desktop Cube, Rotate Cube,淡出到桌面
__说明:Expo效果是鼠标放在屏幕的左上角会远程显示所有的桌面和右上角会显示当前桌面所有的窗口的动画效果
2.特效-->3D 窗口, 动画, Cube Reflection and Deformation, Fading Windows, Window Decoration, Wobbly Windows
__说明:Animations要选中(1)特效设置-->对所有事件施行随机动画,不然动画效果不会出来的;(2)获得焦点动画-->动画选取-->双击编辑-->闪避(很好的效果,赞!)
__推荐随机效果:Curved Fold, 多米诺,爆炸特效,滑动效果1, Razr,插袋特效,Skewer,燃烧就算了吧。
__说明:Cube Reflection andDeformation里面Deformation-->Deformation-->无,不然会是椭圆形;Cubecaps主要设置 cube的颜色和top, bottom的图片。选择这个主要是要它的倒影功能!
__说明:Minimize Effect就不要选择了。
3.额外功能-->Window Previews
__说明:在awn上能看到缩略图,不错。
4.窗口管理-->Shift Switcher
__说明:win键+Tab的选择窗口的特效,赞!
5.General Options-->Opacity Settings-->Windowopacities-->Add,在对话框中输入“Tooltip | Menu | PopupMenu |DropdownMenu”,并设置透明值为90,这个是修改相关的窗口的透明度的。



关于scim输入法:
不管你用的什么语言环境,请使用以下命令即可:
代码:
im-chooser
scim -d
我还是喜欢横向的scim,竖着的看着不爽:
SCIM输入法设置-->面板-->GTK-->输入窗口-->垂直式候选窗口(勾掉),为什么会有宽屏的电脑,就是因为人们更为习惯左右移动眼睛,而不是上下移动眼睛!
这是我的scim历险:http://bbs.fedora-zh.org/showthread.php?t=567


关于Firefox设置:
关于firefox的插件推荐:
All-in-one Sidebar:侧边栏,很方便
Chatzilla:irc
ColorfulTabs:很漂亮的标签颜色
Ctrl-Tab:可以在不同的标签中选择
DownThemAll!:Down
Easy DragToGo:鼠标拖拽网址之类
Fast Dial:在空表标签里面显示你加入的爱好的网站缩略图,方便又好看
Firefox Showcase:忘了...
Flagfox:在地址栏显示当前网址的国籍
Flashblock:阻止flash
Forecastfox:天气预报
FoxSaver:FF的屏保,常常有意想不到的图片出现,还可以在线投票
Personas for Firefox:FF的在线背景设置,超赞!
ScribeFire:博客离线编辑器(谢谢gcell )
Tab Mix Plus:鼠标手势以及标签的使用
Undo Close Tabs Button:撤销关闭窗口
说明ScribeFire用来写blogger的时候,需要在API url的设置里面用https,不然会连不上服务器。请参考:
用ScribeFire来写blogger博客
http://liuhongdan.blogspot.com/2008/...reblogger.html


关于字体,建议使用AR PL UKai CN,很好的字体的,见图:

...
...
待续,晚上完成!

===========================
已经没有续了,后面的找不到了,看看是不是论坛数据丢失,如果真实如此,那么找回这么多已经不错了,o(∩_∩)o...哈哈

在fedora 11中安装nvidia quadro相关显卡

坛子里的《Fedora 11 安装及配置指南》(http://bbs.fedora-zh.org/showthread.php?t=1577)上说:
Code:
未被支持的 Nvidia 显卡
RIVA TNT
RIVA TNT2/TNT2 Pro
RIVA TNT2 Ultra
Vanta/Vanta LT
RIVA TNT2 Model 64/Model 64 Pro
Aladdin TNT2
GeForce 256
GeForce DDR
Quadro
GeForce2 GTS/GeForce2 Pro
GeForce2 Ti
GeForce2 Ultra
Quadro2 Pro
详见:http://www.my-guides.net/en/content/...drivers_nvidia
其实,这个指南上关于的N卡的安装指导已经需要更新了,因为这些已经绝大部分支持了。

nvidia用户估计常去的地方是nvnews吧,地址:http://www.nvnews.net/vbulletin/forumdisplay.php?f=14,置顶帖子告知我们Current official release: 185.18.14 (x86 / x86_64)http://www.nvnews.net/vbulletin/showthread.php?t=122606,根据链接,我们可以知道185所支持的nv卡,地址:ftp://download.nvidia.com/XFree86/Li...ppendix-a.html,里面明确说支持了,ok,我们所需要的就是安装这个版本的驱动了,安装方法么,最简单的就属yum了。

关于如何安装nvidia显卡驱动,请看置顶帖子liangsuilong的《在Fedora下安装nVIDIA显示驱动》:http://bbs.fedora-zh.org/showthread.php?t=1041,我们按照这个方法安装,其实就是看看仓库中有没有支持我们显卡的驱动,这里就是nvidia的185版本驱动了,或许以后看到的版本更高。

**注意: 你必须启用了 RPM Fusion 软件仓库,请参见安装 RPM Fusion 软件仓库 章节:http://www.my-guides.net/en/content/...2/3/#yum_repos,或者按照《Fedora下安装nVIDIA显示驱动》中的方法。

我的nvidia quadro nvs 140m,刚刚安装完毕,重启,看到久违的Nvidia画面,进入系统, compiz完全ok,Emerald也完全ok,熟悉的3D桌面又回来了。另外,显卡驱动安装后,系统的启动速度又加快了好几秒,估算一下,也就20秒左右的时间就到了gdm可以输入密码登录了,o(∩_∩)o...哈哈。
我安装后的相关包信息:
Code:
[liuhongdan@dan ~]$ rpm -qa | grep 185
akmod-nvidia-185.18.14-1.fc11.i686
kmod-nvidia-185.18.14-1.fc11.i586
xorg-x11-drv-nvidia-libs-185.18.14-2.fc11.i586
xorg-x11-drv-nvidia-185.18.14-2.fc11.i586
kmod-nvidia-2.6.29.4-167.fc11.i586-185.18.14-1.fc11.i586
kmod-nvidia-2.6.29.4-167.fc11.i686.PAE-185.18.14-1.fc11.i686
[liuhongdan@dan ~]$ rpm -qa | grep nvidia
akmod-nvidia-185.18.14-1.fc11.i686
kmod-nvidia-185.18.14-1.fc11.i586
xorg-x11-drv-nvidia-libs-185.18.14-2.fc11.i586
xorg-x11-drv-nvidia-185.18.14-2.fc11.i586
kmod-nvidia-2.6.29.4-167.fc11.i586-185.18.14-1.fc11.i586
kmod-nvidia-2.6.29.4-167.fc11.i686.PAE-185.18.14-1.fc11.i686
感谢pengjiayou,感谢liangsuilong!

最后总结一句话:
yum install akmod-nvidia akmods kmod-nvidia

电力出版社真抠

      5月份的时候,在china-pub上买了一本中国电力出版社《深入理解计算机系统》(http://www.china-pub.com/18133&ref=ps),没想到纸张竟然如此的薄,甚至能从第一页看到第五页上面的字,草纸啊,草纸
^_^
      很高兴告诉大家,这本书7月份就看完了,虽然没有把习题全部做一遍,有时间在继续,先把《算法导论》看完再说,恩,还有nginx代码!

2009年4月7日星期二

crontab与环境变量

      同事用crontab写一些定时程序,发现从前台调用程序,手动调用程序都没问题,唯独crontab里面就不行,由于里面包含了我和其他人的程序,而其他人的程序被其要求更改为了绝对路径没问题了,我的没改,因此执行出错。


      由于我的程序需要改动比较多,想想就懒得去改了,有没有简单的办法一劳永逸呢?想到除了crontab以外其他地方都没问题,估计是crontab的环境变量出了问题,没有系统的环境变量,所以必须加上绝对路径。于是写了一个小程序测试了一下,果然如此。


      随后google之,发现crontab启动加载的环境变量很少,root的是/etc/crontab,也可以在/var/spool/cron/root查看,不过却发现似乎crontab一点点环境变量都没继承进去,于是自己加上环境变量试试看,ok。于是直接把# env | grep ^SHELL, # env | grep ^PATH, env | grep ^HOME这些环境变量直接放入


SHELL=/bin/bash
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:.:/root/bin
HOME=/root

0 1 * * * /xxx/....
0 1 * * * /xxx/....

      然后运行,正确。
      总结:绝对路径,或者,环境变量。

2009年2月24日星期二

C Traps and Pitfalls--1(词法陷阱)

     本章探讨的是符号和组成符号的字符之间的关系,以及有关符号含义的一些常见的误解。
     当我们阅读一个句子时,我们并不去考虑组成这个句子的单词中单个字母的含义,而是把单词作为一个整体来理解。确实,字母本身并没有什么意义,我们总是将字母组成单词,然后给单词赋予一定的意义。对于C语言或其他语言编写的程序,道理也是一样的。
     编译器中负责将程序分解为一个一个符号的那部分,一般称为”词法分析器”,在C语言中符号之间的空白将被忽略,包括空格符,制表符和换行符。

=和==
     一般而言,更为常用的操作用更为简短的表达,以节省大家的时间。故符号=作为赋值,符号==作为比较运算,因为赋值比使用的更为频繁。
     =的左边的操作数为左值(lvalue),右边的为右值(rvalue),关于lvalue和rvalue,详情请参阅《The C programming Language》(K&R/TCPL)的附录A.5和A.7。
     潜在的问题代码:
    if (x = y)
            foo();

     程序员的本意是判断(x == y)还是直接的赋值(x = y)呢?现在的gcc编译器在发现形如e1 = e2的表达式出现在条件判断的部分时,会给出相关的警告信息,如果编译的时候把警告打开的话。
    比如下面这段代码:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char **argv)
    {
            int x = 1;
            int y = 1;
            if ( x = y)
                printf(“x = y is true\n”);
            exit(0);
    }

    不打开警告的编译方法和打开警告的编译方法分别为:
    gcc -o prog prog.c
    gcc -Wall -o prog prog.c

    则可以看到如果打开警告,编译器会有提示”warning: suggest parentheses around assignment used as truth value”,如果不打开警告的话,就没有任何警告提示了。
    作为一种解决方法和一种良好的编程习惯,作者建议写作显式比较的形式:
    if ((x = y) != 0)
            foo();

    既能去除警告,也使得代码的意图一目了然,只是多了几个字符,何乐而不为!

词法分析的“贪心法”
    C语言的符号可以是单字符号,形如/,*和=,也可以是多字符符号,形如/*和==,当编译器读入一个'/'后又跟着一个'*',那么编译器是如何判断的呢?法则就是贪心法,即编译器从左到右一个字符一个字符的读入,如果该字符可能组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分;如果可能继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串已经不再可能组成一个有意义的符号。这个处理策略一般称作“贪心法”,有时也叫“大嘴法”,一句话概括来说,就是每个符号应该包括尽可能多的字符。Kernighan和Ritchie在《The C programming Language》 (K&R/TCPL)的附录A.2.1对这个方法这样描述:
    If the input stream has been separated into tokens up to a given character, the next token is the longest string of characters that could constitute a token.

    如果到某一个为止的输入流被分割成若干记号,那么,下一个记号就是后续字符序列中可能构成记号的最长的字符串。
    但是我们要注意到,虽然编译器使用的是贪心法,但是也要遵循基本的词法规则,比如lvalue和rvalue的概念,这章中的练习1-4就是a+++++b的含义是什么,这里应该使用贪心法,不过也需要考虑到lvalue和rvalue的概念,不然很容易想当然的出错,第八章中给出的答案也只是说a++的结果不能作为lvalue,编译器不接受a++作为后面的++运算的操作数,只是说明了一下,没有系统的说明出处,一会我在详细的说明一下。

字符与字符串
    这个相对容易理解多了,单引号和双引号嘛。下面说说两者的实质的区别:
    单引号:单引号字符本质上是代表一个整数,其值对应于该字符在编译器采用的字符集中的序列值。对于普通的采用ASCII字符集的编译器,如gcc,'a'就是97或0141(八进制)。
    双引号:双引号的字符串代表的是一个指向无名数组起始字符的指针,该数组被双引号之间的字符以及一个额外的二进制值为零的字符'\0'初始化。
   
    下面的语句:
    printf("Hello world\n");

   
    char hello[] = {'H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '\n', '\0'}
    printf(hello);

    两者是等价的。
    这个很好理解,用一种形而上学的理解记忆,一个串相当于N多字符的组合,要放在一起使用,当然只能用数组的形式了,也就是说串就是字符的无名数组形式了,既然无名,就只能使用指针来引用了,串就是这个指针而这个数组最后的'\0'代表串的结束(总得有一个东西来代表结束吧)。

    关于这个结束字符串的东西,在《Expert C Programming: Deep C Secrets》(《C专家编程》)中的第二章的2.1小节的小启发中说是NUL,而NULL代表空指针,表示什么也不指向,而NULLL则说明需要检查一下是不是拼写错误了。这里的NUL其实ASCII码表0值的char字面意思,NUL并没有在标准C中定义,当然如果自己想用的话,#define一下也不错。

    一句话总结就是,单引号的字符代表一个整数,双引号的则代表一个指针,混用的话编译器的类型检查功能会检测到这样的错误的,gcc就可以。
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char **argv)
    {
        printf('\n');
        exit(0);
    }


    使用gcc编译情况如下(不加-Wall参数):
    $ gcc -o prog prog.c
    prog.c: In function ‘main’:
    prog.c:6: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast

    运行情况如下:
    $ ./prog
    Segmentation fault

    因为标准C并没有指出编译器在类似错误的情况下的行为,所以常常是这种段错误了。

    另外一个就是类似char c = 'yes'的编译器行为了,gcc是后一个字符直接覆盖前一个字符,所以c就是's'了,gcc也会有警告的:

    $ cat prog.c
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char **argv)
    {
        char c = 'yes';
        printf("%c\n", c);
        exit(0);
    }

    编译情况如下:
    $ gcc -o prog prog.c
    prog.c:6:11: warning: multi-character character constant
    prog.c: In function ‘main’:
    prog.c:6: warning: overflow in implicit constant conversion
    运行结果:
    $ ./prog
    s

这章最后
    这一章的最后,还是来说说上面提到的练习1-4的a+++++b。
    按照贪心法,似乎可以理解为((a++)++)+b,不过书中的答案说a++不能作为lvalue,因此编译器不会接受a++作为后面++运算符俄操作数,为什么不能作为左值,出处在哪里?

    出处就在
《The C programming Language》(K&R/TCPL)的附录
A.7.3.4 Postfix Incrementation ... ... The result is not an lvalue.
当然前缀的也不能作为lvalue,出处就是
A.7.4.1 Prefix Incrementation Operators ... ... The result is not an lvalue. ^_^

2009年2月22日星期日

C Traps and Pitfalls--0(导读)

      冲动前言:C Traps and Pitfalls一直呆在硬盘上数载,当我开始读的时候,发现却只是1985年的那篇29页的论文,当然里面有些关于编译器的东西都改过了,所以有些Traps and Pitfalls都不存在了。于是开始看这本较新的2002中文版本,里面第0章导读的的第三个例子,就是那个数组赋值循环的例子,让我来了兴趣,遂有了此笔记系列。

      关于书籍:一本讲述C语言的书,自出版以来,历经14载,它一直都被各个书评站点(或书评人)列入“重点推荐”的清单中。尤为夸张的是,14年来,在它的18次印刷版本中,除去第二次印刷稍微修改过一些问题,以后的16次印刷,我们居然发现它的内容没有丝毫的变更!!!对于技术书籍,我想其精确性与权威性也算是奇迹了吧。

      关于作者:Andrew Koenig是AT&T大规模程序研发部(前贝尔实验室)成员。他从1986年开始从事C语言的研究,1977年加入贝尔实验室。他编写了一些早期的类库,并在1988年组织召开了第一个完全意义上的C++会议。在ISO/ANSI C++委员会成立的1989年,他就加入了该委员会,并一直担任项目编辑。他已经发表了C++方面的100多篇论文,在Addsion-Wesley出版了C Trap and Pitfalls,还应邀到世界各地演讲。他的妻子Barbara Moo现任AT&T网络体系结构部门负责人。在1983年加入贝尔实验室不久,她开始从事Fortran 77编译器的研究工作,这是第一个用C++编写的商业产品。她负责AT&T的C++编译器项目直到AT&T转让出软件开发业务。她还负责指导SIGS会议、Lund技术学院和Stanford大学。Andrew Koenig和Barbara Moo堪称C++研究领域的“第一神仙眷侣”,他们不光有着多年的C++开发、研究和教学经验,而且还亲身参与了C++的演化和变革,是对C++的变化和发展起到重要影响的人。他们两人还曾经合著了Accelerated C++: Practical Programming by Example。

      作者的第一个C程序:
#include <stdio.h>

main()
{
        printf("Hello world");
}

      执行结果却如下所示:
% cc prog.c
% a.out (注意,现在应该使用./a.out来运行这个默认的gcc编译出来的a.out了)
Hello world%

      这个结果怎么看起来和自己很多时候的那么相似呢,因为没有加上换行符'\n',所以那个unix提示符号'%'紧跟着world出来了。以后自己也要注意。

      第二个C程序例子,书上的是部分代码,我将代码补全如下:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
        int i;
        int a[10];

        for (i = 0; i <= 10; i++) {
                a[i] = 0;
                printf("a[%d] = 0\n", i);
        }

        exit(0);
}

      使用gcc编译(gcc -o array array.c)并运行这个程序,运行发现会是一个死循环!虽然我知道应该是i < 10,9是数组的界限,但是却不知道为什么i <= 10的时候会是死循环,这个让我提起了兴趣。我尝试这使用gcc -Wall -o array array.c来编译程序,以为gcc会有警告,却发现任何警告信息!答案作者是在第三章3.6节讨论的。当然,我要继续往下看。

      我很赞同作者提出的"程序设计错误实际上反应的是程序与程序员对该程序的'心智模式'两者的相异之处",赞同Howard Gardner在《心灵的新科学》(The Mind's New Science)中的观点:人们的心智模式决定了人们如何认识周遭的世界。

      从较低的层面考察,程序是由符号(token)序列组成,犹如一本书是由一个一个的单词所组成的一样,将程序分解为token的过程,称为"词法分析"。
      组成程序的这些token,又可以看成是语句和声明的序列,犹如一本书可以看成是由单词进一步结合而成的句子的集合一样,符号(token)和单词如何组成更大的单元,组成什么样的语义,取决于语法细节,理解了语法细节,还需要理解语义细节才行。
      程序的连接,预处理等,也是现在我的认知空白,接着看书吧。


2009年2月8日星期日

fedora的gba模拟器VisualBoyAdvance教程

前言:
最近在手机上玩了两天的《口袋妖怪》,gba掌机的,也想在电脑上试试看,起始以为街机就能搞定,后来发现自己的游戏知识真实贫乏啊,两种完全不同的平台!在学习中发现gba在pc上的模拟器叫VisualBoyAdvance!

Visual Boy Advance - Gamboy Advance Emulator
VBA is the best and most popular Gameboy Advance emulator around. Emulates GBA, GBC, SGB, GBA roms! Supports ZIP-ed roms, so that after downloading files from the net you don't even have to un-zip them.
VBA主页是http://vba.ngemu.com/

当然要是有前端界面不就更好,它就在这里VBA Express:
What's VBA Express? It's First, to configure VisualBoyAdvance (emulator)... EASILY! Graphics, sound, controls (keyboard and joystick), paths (to saves and captures)... You can configure all this without edit VisualBoyAdvance.cfg manually!
VBA Express主页:http://vbaexpress.tuxfamily.org/english.php

安装:
在VBA Express主页:http://vbaexpress.tuxfamily.org/english.php我们可以下载:
visualboyadvance-1.7.2-1.FC4.i386.rpm http://vbaexpress.tuxfamily.org/visu...1.FC4.i386.rpm
vbaexpress-1.2-1.i386.rpm http://vbaexpress.tuxfamily.org/vbae...1.2-1.i386.rpm
之后自己安装就可以了。

使用:
在程序菜单-->games-->VBA Express打开,然后File-->open a game-->选择自己的gba rom即可。初始键盘为Z, X, Enter, 上下左右键,其他的设置可以自己看看。

Click the image to open in full size.
Click the image to open in full size.
Click the image to open in full size.

fedora街机模拟器xmame+gxmame安装使用教程

前言:我们主要使用xmame+gxmame来做模拟器,游戏可以使用neogeo的rom和mame自己的rom等。

1.下载xmame
xmame的下载(xmame-0.106-1.fc6.i386.rpm):
RPM Information for xmame-0.106-1.fc6.i386.rpm页面:http://sulphur.freshrpms.net/rpm.html?id=348
下载地址:http://ftp.freshrpms.net/pub/freshrp...1.fc6.i386.rpm
我看了一下,似乎就只有fc6的,我的系统是fc9,没问题的。

2.下载gxmame
下载地址:ftp://rpmfind.net/linux/freshrpms/fe...2.fc4.i386.rpm
说明:仓库有gmame 0.22版本,这个版本不好,我安装了,很不好,bug很多,建议使用上面的0.35,不知道0.35是否有人打包更高系统版本,不过这个是可以用的。

3.下载neo bios等文件
使用neogeo bios 方便大家用mame模拟 Neogeo rom游戏,另外还有cpzn1和cpzn2的bios。
这里解压neogeo.7z即可得到neogeo.zip

4.roms路径以及相关文件
xmame默认的roms文件路径是/usr/share/xmame/roms,我们要把neogeo.zip, cpzn1.zip, cpzn2.zip放在这个roms文件夹里面,然后就是游戏的rom了,比如kof97.

5.终端中的配置使用
在终端直接使用
代码:
xmame kof97
来运行游戏,使用
代码:
Alt + Home/Pgup
来放大一点。使用
代码:
Alt + Pgup + PgDn
来全屏和退出全屏,使用
代码:
 Esc
退出。

第一次运行游戏的时候,提示按“ok”,那么请按键盘的"o"和"k"即可进入游戏。然后按"Tab"键来进行键盘设置,然后选择"Input ( this Game ),因为xmame为每一个游戏保存一个配置文件。然后reset game一下,以后就可以直接使用了。
在图形界面中使用:在程序菜单中打开games->gxmame,界面比较简单,请大家自己配置即可,基本上可以不需要配置就直接使用。其他设置请自己摸索,或者参考其他文章。


cpzn1.zip.tar.bz2

cpzn2.zip.tar.bz2

neogeo.7z

Click the image to open in full size.
Click the image to open in full size.
Click the image to open in full size.

我们的忠告:仅供休闲娱乐,请勿沉迷;
我们的口号:在linux下玩游戏,是为了更好地学习linux!