老爸经常让我给他看看他的 Windows,不知为何无法正常播放许多视频,显示出来的总是好像热断层扫描一样的图像。最终,我在网上找到了答案:
桌面上右击属性 然后点设置 然后点高级 然后点疑难解答 然后拖上面的滑条,拖到无就肯定可以放了(来源:http://bbs.feey.cn/thread-4563-1-1.html)
原来是显卡加速的原因,我把滑块置于第三档就正常,在第四档就花了。也就是说,只要调节到“禁用所有的 DirectDraw 和 Direct3D 加速程序”就能正常播放那些视频了。
Friday, March 13, 2009
Thursday, March 12, 2009
查了下 assert.h 的用法
(本文已发布到 http://spidertiger2.blogspot.com/2009/03/asserth.html)
考上机关公勤后,这几天在公司没事,就有空研究起 Linux 下的 C 语言来。之前学得很空泛,不了解所以然,连 gcc 的 -I、-L、-l 都分不清楚,连 makefile 也不会写。于是下载了 GNU 的 coreutils 源代码进行研究。当我看 factor.c 的时候看到了一个奇怪的头文件:
#include <assert.h>
于是就 google 开了,发现 assert() 真是个好东西,可以在调试过程中帮上很大的忙。下面转贴一篇网文(来源:<http://www.cnblogs.com/phonefans/archive/2008/12/24/1361381.html>):
=========================
assert() 函数用法
assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:
#include <assert.h>
void assert( int expression );
assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,
然后通过调用 abort 来终止程序运行。
请看下面的程序清单badptr.c:
1 #include <stdio.h>
2 #include <assert.h>
3 #include <stdlib.h>
4 int main( void )
5 {
6 FILE *fp;
7
8 fp = fopen( "test.txt", "w" );//以可写的方式打开一个文件,如果不存在就创建一个同名文件
9 assert( fp ); //所以这里不会出错
10 fclose( fp );
11
12 fp = fopen( "noexitfile.txt", "r" );//以只读的方式打开一个文件,如果不存在就打开文件失败
13 assert( fp ); //所以这里出错
14 fclose( fp ); //程序永远都执行不到这里来
15 return 0;
16 }
已放弃
使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。
在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:
#include <stdio.h>
#define NDEBUG
#include <assert.h>
用法总结与注意事项:
1)在函数开始处检验传入参数的合法性
如:
1 int resetBufferSize(int nNewSize)
2 {
3 //功能:改变缓冲区大小,
4 //参数:nNewSize 缓冲区新长度
5 //返回值:缓冲区当前长度
6 //说明:保持原信息内容不变 nNewSize<=0表示清除缓冲区
7 assert(nNewSize >= 0);
8 assert(nNewSize <= MAX_BUFFER_SIZE);
9
10 }
2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败
不好: assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);
好: assert(nOffset >= 0);
assert(nOffset+nSize <= m_nInfomationSize);
3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题
错误: assert(i++ < 100)
这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行。
正确: assert(i < 100)
i++;
4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感
5)有的地方,assert不能代替条件过滤
==================
呵呵,真棒!
考上机关公勤后,这几天在公司没事,就有空研究起 Linux 下的 C 语言来。之前学得很空泛,不了解所以然,连 gcc 的 -I、-L、-l 都分不清楚,连 makefile 也不会写。于是下载了 GNU 的 coreutils 源代码进行研究。当我看 factor.c 的时候看到了一个奇怪的头文件:
#include <assert.h>
于是就 google 开了,发现 assert() 真是个好东西,可以在调试过程中帮上很大的忙。下面转贴一篇网文(来源:<http://www.cnblogs.com/phonefans/archive/2008/12/24/1361381.html>):
=========================
assert() 函数用法
assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:
#include <assert.h>
void assert( int expression );
assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,
然后通过调用 abort 来终止程序运行。
请看下面的程序清单badptr.c:
1 #include <stdio.h>
2 #include <assert.h>
3 #include <stdlib.h>
4 int main( void )
5 {
6 FILE *fp;
7
8 fp = fopen( "test.txt", "w" );//以可写的方式打开一个文件,如果不存在就创建一个同名文件
9 assert( fp ); //所以这里不会出错
10 fclose( fp );
11
12 fp = fopen( "noexitfile.txt", "r" );//以只读的方式打开一个文件,如果不存在就打开文件失败
13 assert( fp ); //所以这里出错
14 fclose( fp ); //程序永远都执行不到这里来
15 return 0;
16 }
已放弃
使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。
在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:
#include <stdio.h>
#define NDEBUG
#include <assert.h>
用法总结与注意事项:
1)在函数开始处检验传入参数的合法性
如:
1 int resetBufferSize(int nNewSize)
2 {
3 //功能:改变缓冲区大小,
4 //参数:nNewSize 缓冲区新长度
5 //返回值:缓冲区当前长度
6 //说明:保持原信息内容不变 nNewSize<=0表示清除缓冲区
7 assert(nNewSize >= 0);
8 assert(nNewSize <= MAX_BUFFER_SIZE);
9
10 }
2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败
不好: assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);
好: assert(nOffset >= 0);
assert(nOffset+nSize <= m_nInfomationSize);
3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题
错误: assert(i++ < 100)
这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行。
正确: assert(i < 100)
i++;
4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感
5)有的地方,assert不能代替条件过滤
==================
呵呵,真棒!
Saturday, January 03, 2009
硬盘分区
硬盘分区
对管理任何一种操作系统来说,为求得系统的平稳运行,硬盘分区都是必需的。对人来说,分区又意味着什么呢?合理的分区意味着速度,效率,质量。当然这仅仅只是从一个角度来说的。要平衡计算机的效率和人对文件的组织管理来分区是需要点艺术的,很难,但也不难。
《LPI 权威指南》(下面简称 LPI)中建议,分区要按计算机的实际需要作文章。Web 服务器、文件服务器和个人机分法均有所不同。LPI 给了一个针对 80 GB 硬盘一般性的建议:
Partition Type Mounted filesystem Size
/dev/hda1 Primary /boot 100 MB
/dev/hda2 Primary / 500 MB
/dev/hda3 Extended - -
/dev/hda5 Logical /usr 4 GB
/dev/hda6 Logical /var 2 GB
/dev/hda7 Logical /opt 1 GB
/dev/hda8 Logical /tmp 500 MB
/dev/hda4 Primary (swap partition) 1 GB
/dev/hdb1 Primary /home 60 GB
按照 LPI 所给的建议,我对 80 GB 和 120 GB 的硬盘作了下相应的划分:
----- 80 GB -----
Partition Type Mounted filesystem Size
/dev/sda1 Primary /boot 512 MB
/dev/sda2 Primary /usr 15 GB
/dev/sda3 Primary / 4 GB
/dev/sda4 Extended - -
/dev/sda5 Logical /var 2 GB
/dev/sda6 Logical (swap partition) 2 GB
/dev/sda7 Logical /tmp 512 MB
/dev/sda8 Logical /home others
----- 120 GB -----
Partition Type Mounted filesystem Size
/dev/sda1 Primary /boot 512 MB
/dev/sda2 Primary /usr 15 GB
/dev/sda3 Primary / 5 GB
/dev/sda4 Extended - -
/dev/sda5 Logical /var 2 GB
/dev/sda6 Logical (swap partition) 2 GB
/dev/sda7 Logical /tmp 1 GB
/dev/sda8 Logical /home others
以上仅仅是我对自己系统的一种划分,不能适应所有的情况。
对管理任何一种操作系统来说,为求得系统的平稳运行,硬盘分区都是必需的。对人来说,分区又意味着什么呢?合理的分区意味着速度,效率,质量。当然这仅仅只是从一个角度来说的。要平衡计算机的效率和人对文件的组织管理来分区是需要点艺术的,很难,但也不难。
《LPI 权威指南》(下面简称 LPI)中建议,分区要按计算机的实际需要作文章。Web 服务器、文件服务器和个人机分法均有所不同。LPI 给了一个针对 80 GB 硬盘一般性的建议:
Partition Type Mounted filesystem Size
/dev/hda1 Primary /boot 100 MB
/dev/hda2 Primary / 500 MB
/dev/hda3 Extended - -
/dev/hda5 Logical /usr 4 GB
/dev/hda6 Logical /var 2 GB
/dev/hda7 Logical /opt 1 GB
/dev/hda8 Logical /tmp 500 MB
/dev/hda4 Primary (swap partition) 1 GB
/dev/hdb1 Primary /home 60 GB
按照 LPI 所给的建议,我对 80 GB 和 120 GB 的硬盘作了下相应的划分:
----- 80 GB -----
Partition Type Mounted filesystem Size
/dev/sda1 Primary /boot 512 MB
/dev/sda2 Primary /usr 15 GB
/dev/sda3 Primary / 4 GB
/dev/sda4 Extended - -
/dev/sda5 Logical /var 2 GB
/dev/sda6 Logical (swap partition) 2 GB
/dev/sda7 Logical /tmp 512 MB
/dev/sda8 Logical /home others
----- 120 GB -----
Partition Type Mounted filesystem Size
/dev/sda1 Primary /boot 512 MB
/dev/sda2 Primary /usr 15 GB
/dev/sda3 Primary / 5 GB
/dev/sda4 Extended - -
/dev/sda5 Logical /var 2 GB
/dev/sda6 Logical (swap partition) 2 GB
/dev/sda7 Logical /tmp 1 GB
/dev/sda8 Logical /home others
以上仅仅是我对自己系统的一种划分,不能适应所有的情况。
Sunday, September 07, 2008
VIM 语法高亮设置
在 .vimrc 中输入:
if &t_Co > 1
syntax enable
endif
就可以设置让支持彩色的终端显示彩色。
vim 根据底色来选择前景色:如果底色是深色的,那么前景色为浅色的;如果底色是浅色的,那么前景色为深色的。设置方法:
: set background=dark
: set background=light
if &t_Co > 1
syntax enable
endif
就可以设置让支持彩色的终端显示彩色。
vim 根据底色来选择前景色:如果底色是深色的,那么前景色为浅色的;如果底色是浅色的,那么前景色为深色的。设置方法:
: set background=dark
: set background=light
Monday, July 28, 2008
Thursday, July 03, 2008
惊魂交换机
下午用浏览器登录了单位的 D-Link DES 3350SR 交换机,打算给它配置 VLAN。哪知道配置没成功,却让整个单位的网络都瘫痪了。我赶忙跑到弱电房,移过来一台电脑,接上 console 线,对交换机进行了软 reset。
接下来的几分钟内相安无事,网络正常...
突然,网络中断了,而且发现与弱电房同一楼层的所有电脑都死机。但是把网线拔掉电脑又正常。我一下子就慌了,很快意识到这可能跟我的操作失误有关。周围围过来的人越来越多,都在埋怨为什么上不了网。
我重新把那台电脑移了过来,再次连接交换机,然后试了下硬 reset。故障依旧。“坏了,可能把交换机弄坏了!”我心想。于是我和我的同事一起考虑问题出在哪里,反正网络不通,那就死马当活马医吧!
判断一:电压不稳
这个判断刚说就被否定了,因为其他不在这个网络上的计算机上网完全正常。而且在本网段上的电脑拔掉网线就正常,连上就死机。
判断二:查看光纤适配器,看是否是网络攻击造成的
操作:将网线直接接到光纤适配器的内部端口,设置计算机上的 IP 地址同外网的 IP 同一网段。然后 ping 外网 ip
现象:有数据回应
结论:光线适配器没问题,而且也没有网络攻击
判断三:路由器有问题
操作:恢复光纤适配器和路由器的连接,将网线直接接到路由器的内部端口
现象:网络无连接。但是当用网线连接交换机时灯是点亮的
结论:路由器内部端口可能有问题,但也可能没有问题
判断四:交换机坏了
操作:恢复路由器和交换机的连接,将网线连接到交换机上
现象:过大约 5 秒时间电脑死机
结论:交换机内部可能真的出了问题
判断五:网络可能出现阻塞,先配置下交换机
操作:将光纤适配器和路由器的连接、路由器和交换机的连接断开,用 console 连接交换机。超级终端登录。重置交换机。然后再将交换机与路由器相连。
现象:还是过大约 5 秒时间电脑死机
结论:“糟了!要赔万把块 RMB 了!”
判断六:路由器配置有问题
操作:将交换机与路由器的连接断开,用 console 连接路由器。超级终端登录。重启路由器进入 monitor# 模式,然后查看配置文档。
现象:没有异常,配置文档与原先一致
结论:路由器配置无误。(“噩梦啊!”)
判断七:路由器与交换机配合时出错
操作:还是用 console 连接路由器。连接好交换机和路由器。用超级终端登录。
现象:出现异常!终端不断显示“Another host is using mac address **:**:**:**:**:**”
结论:显然有设备和路由器的 MAC 地址冲突了!
判断八:交换机的 MAC 地址和路由器的 MAC 地址冲突
操作:重刷交换机的 firmware?不现实。(“怎么办?怎么办?!!!”)
判断九:子网中的电脑 MAC 地址和路由器的 MAC 地址冲突,有可能因为 MAC 地址欺骗
操作:将所有连接交换机的线拔下,然后一个一个插回去。判断当有哪个线路造成了计算机死机,那么可以顺藤摸瓜查到问题电脑。
现象:所有的线都插回去了,都没发现异常。而且这次计算机没有死机
结论:还用说吗?我不必赔交换机啦!
唉,这个问题真是复杂,当到网上查找这个“Another host is using mac address **:**:**:**:**:**”字串,居然没查到一例一样的问题!于是把这个问题整理一下,发到博客上来。:-)
接下来的几分钟内相安无事,网络正常...
突然,网络中断了,而且发现与弱电房同一楼层的所有电脑都死机。但是把网线拔掉电脑又正常。我一下子就慌了,很快意识到这可能跟我的操作失误有关。周围围过来的人越来越多,都在埋怨为什么上不了网。
我重新把那台电脑移了过来,再次连接交换机,然后试了下硬 reset。故障依旧。“坏了,可能把交换机弄坏了!”我心想。于是我和我的同事一起考虑问题出在哪里,反正网络不通,那就死马当活马医吧!
判断一:电压不稳
这个判断刚说就被否定了,因为其他不在这个网络上的计算机上网完全正常。而且在本网段上的电脑拔掉网线就正常,连上就死机。
判断二:查看光纤适配器,看是否是网络攻击造成的
操作:将网线直接接到光纤适配器的内部端口,设置计算机上的 IP 地址同外网的 IP 同一网段。然后 ping 外网 ip
现象:有数据回应
结论:光线适配器没问题,而且也没有网络攻击
判断三:路由器有问题
操作:恢复光纤适配器和路由器的连接,将网线直接接到路由器的内部端口
现象:网络无连接。但是当用网线连接交换机时灯是点亮的
结论:路由器内部端口可能有问题,但也可能没有问题
判断四:交换机坏了
操作:恢复路由器和交换机的连接,将网线连接到交换机上
现象:过大约 5 秒时间电脑死机
结论:交换机内部可能真的出了问题
判断五:网络可能出现阻塞,先配置下交换机
操作:将光纤适配器和路由器的连接、路由器和交换机的连接断开,用 console 连接交换机。超级终端登录。重置交换机。然后再将交换机与路由器相连。
现象:还是过大约 5 秒时间电脑死机
结论:“糟了!要赔万把块 RMB 了!”
判断六:路由器配置有问题
操作:将交换机与路由器的连接断开,用 console 连接路由器。超级终端登录。重启路由器进入 monitor# 模式,然后查看配置文档。
现象:没有异常,配置文档与原先一致
结论:路由器配置无误。(“噩梦啊!”)
判断七:路由器与交换机配合时出错
操作:还是用 console 连接路由器。连接好交换机和路由器。用超级终端登录。
现象:出现异常!终端不断显示“Another host is using mac address **:**:**:**:**:**”
结论:显然有设备和路由器的 MAC 地址冲突了!
判断八:交换机的 MAC 地址和路由器的 MAC 地址冲突
操作:重刷交换机的 firmware?不现实。(“怎么办?怎么办?!!!”)
判断九:子网中的电脑 MAC 地址和路由器的 MAC 地址冲突,有可能因为 MAC 地址欺骗
操作:将所有连接交换机的线拔下,然后一个一个插回去。判断当有哪个线路造成了计算机死机,那么可以顺藤摸瓜查到问题电脑。
现象:所有的线都插回去了,都没发现异常。而且这次计算机没有死机
结论:还用说吗?我不必赔交换机啦!
唉,这个问题真是复杂,当到网上查找这个“Another host is using mac address **:**:**:**:**:**”字串,居然没查到一例一样的问题!于是把这个问题整理一下,发到博客上来。:-)
Tuesday, July 01, 2008
D-Link DI2621 路由器密码重置
单位的一台 D-Link DI2621 的管理密码忘记了,需要重置。但路由器面板上没有 reset 按钮,只得打电话给 D-Link 的 800 热线。厂商发了封邮件给我,里面说是重置的方法。先来看一下这个方法:
1. 将数据线连接至 console 口;
2. 打开超级终端程序,连接上路由器;
3. 重启路由器;
4. 当终端显示第一串消息的时候快速输入 :config-aaa;
5. 终端将进入 monitor# 模式。
可惜里面说的方法并不适合该款路由器。我试了十几遍都不行,路由器完全没有给我足够的时间来输入这串命令!无奈,只好先上官方网站上下了份 DI2621 的说明 doc.doc。在里面提到了一个方法可以进入到 monitor# 模式:
1. 将数据线连接至 console 口;
2. 打开超级终端程序,连接上路由器;
3. 重启路由器;
4. 当终端显示第一串消息的时候按 “Ctrl + Break”键;
5. 进入 monitor# 模式。
按照这个办法还真的可以,顺利进入了管理界面。重命名 startup-config 文件之后再重启路由器。OK!可以通过 admin 用户名和空密码进入配置路由器了!
1. 将数据线连接至 console 口;
2. 打开超级终端程序,连接上路由器;
3. 重启路由器;
4. 当终端显示第一串消息的时候快速输入 :config-aaa;
5. 终端将进入 monitor# 模式。
可惜里面说的方法并不适合该款路由器。我试了十几遍都不行,路由器完全没有给我足够的时间来输入这串命令!无奈,只好先上官方网站上下了份 DI2621 的说明 doc.doc。在里面提到了一个方法可以进入到 monitor# 模式:
1. 将数据线连接至 console 口;
2. 打开超级终端程序,连接上路由器;
3. 重启路由器;
4. 当终端显示第一串消息的时候按 “Ctrl + Break”键;
5. 进入 monitor# 模式。
按照这个办法还真的可以,顺利进入了管理界面。重命名 startup-config 文件之后再重启路由器。OK!可以通过 admin 用户名和空密码进入配置路由器了!
Sunday, June 22, 2008
Blogger 又开通啦!
Blogger 被封了很长时间,终于又开通了。失去 Blogger 的日子,博客都不肯写了~~
不过今后不会再出现这种情况了,被封的日子里可以使用 gladder 插件!呵呵。
不过今后不会再出现这种情况了,被封的日子里可以使用 gladder 插件!呵呵。
Monday, May 28, 2007
Subversion 快速入门
参考文档:《使用 subversion 进行版本控制》
Subversion 存储所有版本控制的数据到一个中心版本库。一开始,我们要新建一个版本库:
$ svnadmin create /path/to/repos
$ ls /path/to/repos
假定有一些希望导入到 Subversion 版本库中的项目,那么将这些项目整理到一个叫做 Myproject 的文件夹中。并且这些项目要有 branches、tags 和 trunk 三个顶级目录。trunk 目录保存所有的数据,而 branches 和 tags 都是空的(这样做有好处):
/tmp/myproject/branches/
/tmp/myproject/tags/
/tmp/myproject/trunk/
foo.c
bar.c
Makefile
...
准备好数据后就可以使用 svn import 命令将数据导入到版本库:
$ svn import /tmp/myproject file:///path/to/repos/myproject -m "initial import"
现在版本库包含了这个目录树的数据。可以删除 /tmp/myproject 目录及其下的所有文件了。现在从 Subversion 版本库里取出一个工作拷贝:
$ svn checkout file:///path/to/repos/myproject/trunk myproject
现在可以编辑使用工作拷贝中的文件了。
* 进入工作拷贝,编辑一个文件的内容;
* 运行 svn diff 来查看修改的标准区别输出;
* 运行 svn commit 来提交你的改变到版本库;
* 运行 svn update 将你的工作拷贝与版本库“同步”。
Subversion 存储所有版本控制的数据到一个中心版本库。一开始,我们要新建一个版本库:
$ svnadmin create /path/to/repos
$ ls /path/to/repos
假定有一些希望导入到 Subversion 版本库中的项目,那么将这些项目整理到一个叫做 Myproject 的文件夹中。并且这些项目要有 branches、tags 和 trunk 三个顶级目录。trunk 目录保存所有的数据,而 branches 和 tags 都是空的(这样做有好处):
/tmp/myproject/branches/
/tmp/myproject/tags/
/tmp/myproject/trunk/
foo.c
bar.c
Makefile
...
准备好数据后就可以使用 svn import 命令将数据导入到版本库:
$ svn import /tmp/myproject file:///path/to/repos/myproject -m "initial import"
现在版本库包含了这个目录树的数据。可以删除 /tmp/myproject 目录及其下的所有文件了。现在从 Subversion 版本库里取出一个工作拷贝:
$ svn checkout file:///path/to/repos/myproject/trunk myproject
现在可以编辑使用工作拷贝中的文件了。
* 进入工作拷贝,编辑一个文件的内容;
* 运行 svn diff 来查看修改的标准区别输出;
* 运行 svn commit 来提交你的改变到版本库;
* 运行 svn update 将你的工作拷贝与版本库“同步”。
Thursday, May 17, 2007
PHP 常量的定义和使用
如果所定义的常量不在类内,则可以这样写(参考:http://www.phpe.net/manual/language.constants.php):
如果定义的常量在类内部,则应当且必须这样写(参考:http://i.92wy.com/personal_blog_show.aspx?id=39341)
("CONSTANT", "Hello world.");
echo CONSTANT; // outputs "Hello world."
echo Constant; // outputs "Constant" and issues a notice.
如果定义的常量在类内部,则应当且必须这样写(参考:http://i.92wy.com/personal_blog_show.aspx?id=39341)
class MyClass
{ const constant = 'constant value';
function showConstant() { echo self::constant."\n"; }
}
echo MyClass::constant."\n";
$class = new MyClass();
$class->showConstant();// echo $class::constant; is not allowed
Subscribe to:
Posts (Atom)