日历
| |||||||||
| 日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
| 1 | 2 | 3 | 4 | ||||||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 | |||
| 12 | 13 | 14 | 15 | 16 | 17 | 18 | |||
| 19 | 20 | 21 | 22 | 23 | 24 | 25 | |||
| 26 | 27 | 28 | 29 | 30 | 31 | ||||
搜索标题
最新来客
最新留言
统计信息
- 访问量: 1050
- 日志数: 13
- 图片数: 1
- 书签数: 2
- 建立时间: 2007-11-02
- 更新时间: 2008-04-14
我的最新图片
我的最新书签
我的最新日志
-
关于 "没有发现 PHP 的扩展设置mbstring"
2008-4-14
一、在php.ini文件里把extension=php_mbstring.dll 前面的";"去掉.
二、就是用extension_dir将php_mbstring.dll 所在的目录包含进去;
很简单啦
-
完整的装了遍------php--------
2008-4-08
今天终于手工装了遍php,从apache,到mysql在到php,最后又装了phpmyadmin来玩玩,快累死了,不过感觉很好。
之前一直用appserv,感觉也还可以,只不过心血来潮,想自己尝试下,最不爽的是,端口问题,花了我大量时间,80端口一直背一个程序占用,apache一直装不了,还好最后通过,netstat -abn 找到占用的程序,把它卸了,到后面一直装得比较顺。嘿嘿,继续加油!
-
在虚拟机上装 vmware tools
2008-4-06
今天又装了次redhat Linux 9 ,然后也很顺利的把vmware-linux-tools 给装上了。前些天在网上找了些资料,不过感觉没什么用,好像都是一个模子出的,后来上vmware 官网看了下他介绍的安装方式,就按着第一种,我的VM 版本是5.5。
上面虽然都是英文,嘿嘿,但我有底子,觉得很easy。
首先到VM下选install vmware tools,接着在LINux操作系统下会有一张光盘的符号,双击,里面应该会有俩文件,之前在网上看,貌似只有一个文件,可能是vmware版本不同的关系吧。
双击 .rmp 格式的文件,输入 根命令,接着会有程序更新的一些信息。
完了之后,打开终端,或者鼠标右击,新建一终端,输入,su - (这是Linux的shell命令)
接着输入:vmware-config-tools.pl
有信息提示选择一个分辨率,一般选800*600,接着提示 vmware tools安装成功.
可以在输入 vmware-toolbox &.
重启下就行了。你会发现移动鼠标不用在按ctrl+alt就可以在不同的操作系统下转换。然道弄了半天就为了,这么点小方便,其实安装vmwaretools为了什么还不是很清楚,不过这也是学习的一部分吧。
继续linux 的神秘探险之旅。猴子加油!
-
在Ubuntu 7.10上搭建LAMP(转)
2008-4-01
第一步:配置网络
因为ubuntu默认安装是通过DHCP进行的,IP地址是动态的,但服务器需要一个静态IP地址,所以这里需要修改。当然,如果安装LAMP的目的只是为了在自己机器上玩玩儿,可以忽略这一步:
sudo vi /etc/network/interfaces
修改interfaces之前,需要用ifconfig命令查看一下自己机器现在的IP地址,netmask应该都是255.255.255.0,我的路由器上的network是192.168.18.0,所以broadcast就是192.168.18.255,gateway就是192.168.18.1。除了IP地址,其他参数都可以在路由器的配置文件中看到。这样,interfaces的配置就修改为:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.18.100
netmask 255.255.255.0
network 192.168.18.0
broadcast 192.168.18.255
gateway 192.168.18.1
接着,重新启动网络:
sudo /etc/init.d/networking restart
最后,要修改主机名,把域名作为主机名,通过域名就可以访问你的主机了,比如我的就是www.maomao.com,呵呵:
sudo vi /etc/hosts
把内容修改为:
127.0.0.1 localhost.localdomain localhost
192.168.18.100 www.maomao.com
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
现在,执行:
sudo echo www.maomao.com >
/etc/hostname
sudo /etc/init.d/hostname.sh start
这样,主机名就修改好了,查看一下结果:
sudo hostname
sudo hostname -f
上面这两条命令得到的结果应该都是www.maomao.com,否则看看那一步有问题。
第二步,安装一些开发必备的软件:
sudo apt-get install binutils cpp fetchmail flex gcc libarchive-zip-perl libc6-dev libcompress-zlib-perl
libdb4.3-dev libpcre3 libpopt-dev lynx m4 make ncftp nmap openssl perl perl-modules unzip zip zlib1g-dev
autoconf automake1.9 libtool bison autotools-dev g++ build-essential
再把Quota安装好,主要用来监视磁盘使用状况的,这是可选择的:
sudo apt-get install quota
编辑/etc/fstab配置,主要是添加usrquota,grpquota到/(mount)点上去:
# /etc/fstab: static file system information.
#
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0
0
# /dev/sda1
UUID=9fc157ff-975c-4f20-9fef-6a70085abdbd / ext3 defaults,errors=remount-ro,usrquota,
grpquota 0
1
# /dev/sda5
UUID=48fb7dd8-f099-4d63-ac1b-30e886ac7436 none swap sw 0
0
/dev/scd0 /media/cdrom0 udf,iso9660 user,noauto,exec
0
0
/dev/fd0 /media/floppy0 auto rw,user,noauto,exec
0
0
接着就是启动Quota:
sudo touch /quota.user /quota.group
sudo chmod
600
/quota.*
sudo mount -o remount /
sudo quotacheck -avugm
sudo quotaon -avug
第三步,安装MySQL
sudo apt-get install mysql-server mysql-client libmysqlclient15-dev
结束的时候会要求你输入root密码,注意这里不是ubuntu的root密码,是MySQL的root密码,随便了,但是它只会要你输入一次,所以不要搞错了,免得以后又要修改:
New password for the MySQL "root" user:
<-- 我的MySQL密码
然后是修改MySQL的配置文件,让它监视所有端口,而不只是localhost的,这一步是可选的,如果只是玩玩儿的话:
sudo vi /etc/mysql/my.cnf
找到bind-address = 127.0.0.1,把它注释掉:
[
]
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address = 127.0.0.1
#
[
]
重启MySQL:
sudo /etc/init.d/mysql restart
看看它是否生效了:
sudo netstat -tap |
grep mysql
输出应该类似如下:
maomao@www:~# netstat -tap | grep mysql
tcp 0
0
*:mysql *:*
LISTEN
5286/mysqld
maomao@www:~#
第四步:安装Apache2和PHP5
sudo apt-get install apache2 apache2-doc apache2-mpm-prefork apache2-utils libexpat1 ssl-cert
sudo apt-get install libapache2-mod-php5 php5 php5-common php5-curl php5-dev php5-gd php5-idn php-pear
php5-imagick php5-imap
php5-mcrypt php5-memcache php5-mhash php5-ming php5-mysql php5-ps php5-pspell
php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl
这一步会询问Continue installing libc-client without Maildir support?,点击forward就可以了。
然后要编辑/etc/apache2/mods-available/dir.conf文件,把修改一下index的默认类型:
<IfModule mod_dir.c>
#DirectoryIndex index.html index.cgi index.pl index.php index.xhtml
DirectoryIndex index.html index.htm index.shtml index.cgi index.php index.php3 index.pl index.xhtml
</IfModule>
现在,启动一些Apache2的模块,很有用的:
sudo a2enmod ssl
sudo a2enmod rewrite
sudo a2enmod suexec
sudo a2enmod include
最后要重启Apache2:
sduo /etc/init.d/apache2 force-reload
第五步:建立一个Apache2的虚拟HOST:
这个不用说了,用处大了,即使你是玩玩儿。这样至少不用把所有PHP文件放到/var/www下面才能使用,你可以放到自己家目录下或者任何方便维护的地方。
我们要在/etc/apache2/sites-available下新建一个文件,比如这里是maomao.com.conf,内容如下:
<VirtualHost www.maomao.com>
ServerAdmin info@localhost
#我们这里要使用www.maomao.com和local.maomao.com这两个域名
ServerAlias local.maomao.com
DocumentRoot /home/maomao/public_html
#if using awstats
scrīptAlias /awstats/
/usr/lib/cgi-bin/
#指定log文件的位置
CustomLog /var/log/apache2/maomao.com-access.log combined
</VirtualHost>
然后,切换到/etc/apache2/sites-enabled/目录下,在这里建立一个链接:
sudo ln -s /etc/apache2/sites-available/maomao.com.conf maomao.com.conf
再到/etc/hosts里添加local.maomao.com:
127.0.0.1 localhost.localdomain localhost
127.0.1.1 ubuntu.localhost ubuntu
192.168.18.6 www.maomao.com local.maomao.com
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
OK,重启Apache2:
sudo /etc/init.d/apache2 reload
在
/home/maomao/public_html下建立一个phpinfo.php文件,内容为:
<?php
phpinfo();
?>
然后,打开firefox,输入:http://local.maomao.com/phpinfo.php,看看是否正常工作。
至此,LAMP就搞定了。下面是配置rails的开发环境。
第六步:建立rails开发环境
现在的rails的版本是2.0.2,使用SQLite作为默认数据库,而且似乎不启动数据库就搞不定一个基本的HelloWorld,改动实在太。。。,唉,接着来:
基本步骤是安装Ruby、SQLite、gem、rails和mongrel:
安装Ruby:
sudo apt-get install ruby1.8-dev ruby1.8 ri1.8 rdoc1.8 irb1.8 libreadline-ruby1.8 libruby1.8 libopenssl-ruby
然后建立链接:
sudo ln -s /usr/bin/ruby1.8
/usr/local/bin/ruby
sudo ln -s /usr/bin/ri1.8
/usr/local/bin/ri
sudo ln -s /usr/bin/rdoc1.8
/usr/local/bin/rdoc
sudo ln -s /usr/bin/irb1.8
/usr/local/bin/irb
查看是否正常安装:
ruby -v
安装rubygems:
可以用apt安装,但是版本是0.9.4的,还要升级,很麻烦,不如直接下载安装:
mkdir
~/sources
cd ~/sources
wget http://rubyforge.org/frs/download.php/29548/rubygems-1.0.1.tgz
tar xzvf rubygems-1.0.1.tgz
cd rubygems-1.0.1
sudo ruby setup.rb
sudo ln -s /usr/bin/gem1.8
/usr/bin/gem
看看版本:
gem -v
无论什么时候,要升级,输入:
sudo gem update
sudo gem update --system
安装SQLite:
sudo apt-get install sqlite3 libsqlite3-0 libsqlite3-dev
安装MySQL的ruby支持:
sudo apt-get install libmysql-ruby1.8
安装rake:
sudo gem install rake
安装rails:
sudo gem install rails --source http://gems.rubyonrails.org/
安装mongrel:
sudo gem install mongrel
让rails可以访问SQLite:
sudo gem install sqlite3-ruby
让rails可以访问MySQL:
sudo gem install mysql
安装imagemagick:
sudo aptitude install imagemagick librmagick-ruby1.8 librmagick-ruby-doc libfreetype6-dev xml-core
检查一下是否正确:
irb
#irb(main):001:0>
require 'RMagick'
#=>
true
#irb(main):002:0>
require 'mysql'
#=>
true
#irb(main):003:0>
exit
最后,安装postfix和subversion
sudo aptitude install postfix subversion
OK,目前足够了,下面就是建立一个简单的测试app,看看一切是否正常:
首先,家目录下建立一个新目录rails,在这个目录里打开控制台,输入:
rails -d mysql demo
这里,目的是建立一个名为demo的应用程序,但是rails 2.0.2默认的数据库是SQLite,所以要加-d mysql参数,如果使用的是SQLite,则无需这么做。
然后,进入demo目录,输入:
ruby scrīpt/generate controller App
打开app/controllers/app_controller.rb文件,内容为:
class AppController < ApplicationController
end
修改成:
class AppController < ApplicationController
def greeting
end
end
接着,在app/views/app中新建一个文件greeting.rhtml,内容是:
<html>
<head>
<title>Ruby on Rails</title>
</head>
<body>
<h1>maomao,你吃了没有!</h1>
</body>
</html>
启动phpmyadmin建立一个新的数据库,名字是demo,用户名是maomao,密码maomao,然后修改demo/config目录下的database.yml,只需修改development部分就可以了:
development:
adapter: mysql
encoding: utf8
database: demo
username: maomao
password: maomao
socket: /var/run/mysqld/mysqld.sock
最后,在demo目录下启动mongrel服务器:
ruby scrīpt/server
在firefox中输入地址:http://localhost:3000/app/greeting,如果看见“maomao,你吃了没有!”,那就搞定了。 -
在Ubuntu Linux中安装XAMPP(LAMPP)服务器套件时出现错误的解决方法
2008-4-01
在Ubuntu Linux中安装XAMPP(LAMPP)服务器套件时出现错误的解决方法
怎样安装就不说了,详情请看这里 ,官网说的很明白。在这里说下我在Ubuntu Linux中安装XAMPP(LAMPP)服务器套件时出现错误的解决方法
1、在终端安装XAMPP时出现/opt/lampp/lampp: line 74: arch: command not found的错误提示
原因:未找到
解决方法:
在终端输入sudo nano /bin/arch
在弹出的编辑框界面中增加一行uname -m 保存退出
再次在终端中输入sudo chmod +x /bin/arch
问题解决
2、如果在启动warning: World-writable config file /opt/lampp/etc/my.cnf is ignored
原因:XAMPP对my.cnf的读取权限进行了设置,不允许World-writable(字面意思是全世界都可读写)
解决方法:终端运行sudo chmod 644 /opt/lampp/etc/my.cnf
3、进入phpMyAdmin页面时显示:Wrong permissions on configuration file, should not be world writable
原因:这个不关XAMPP的事了,是phpmyadmin目录权限设置的问题,如果你把phpmyadmin的所有文件chmod 777就会出现这个提示了
解决方法:只要修改文件属性就可以了,phpmyadmin要运行在755权限下,
终端运行sudo chmod -R 755 /opt/lampp/phpmyadmin
最后2、3两项就是因为我图方便把整个lampp目录给chmod -R 777,结果问题就来了。大家以后也要注意这个问题。
如果你觉得xampp的htdocs目录放在opt/lampp/下不好,
可以先在终端运行sudo /opt/lampp/lampp security把安全问题解决了,
然后sudo cp -R /opt/lampp/htdocs /home/htdocs把整个htdocs目录复制一份放在/home下,
然后sudo chmod -R 777 /home/htdocs给我们htdocs目录的修改权限,
最后sudo gedit /opt/lampp/etc/httpd.conf修改Apache 配制文件,查找里面的/opt/lampp/htdocs全部替换改为我们刚才的htdocs目录地址/home/htdocs保存退出就可。
还补充个
如果你要用ProFTPD
那么还要修改配置文件sudo gedit /opt/lampp/etc/proftpd.conf
把里面的/opt/lampp/htdocs也改为/home/htdocs -
什么是syslogd
2008-3-01
1 什么是syslogd
syslogd可以简单地被称为记录系统活动的一个daemons。比如可以记录谁,在什么时间,在哪里,做了什么事情(像是在写记叙文啊);也可以记录您的系统曾经发生过什么事情,比如什么时候重新引导过、软硬件的错误信息等;当然也记录着您系统上运行着的服务的信息。
很多时候,有朋友上来就问,“我的X不能启动了是怎么回事啊?!”问号和叹号这样使用在语文规范上是不允许的,但是我们可以获知,他的心情是急迫的。可是为什么您不先考虑一下您做了什么更改,为什么不先看看是否有错误输出,为什么不看看日志文件?起码,日志为解决问题提供了很好的参考啊。很多人讲自己的某个设备不工作, dmesg的信息您是否认真参考了?
syslogd做的是琐碎的工作,但却是相当重要的工作。很多朋友为了提高系统的性能,节省那一点点资源就决定把这个daemons停掉。我认为,这是不可取的。
syslogd记录的日志一般在/var/log/下,当然也有存储在另外的服务器上的。因为syslogd记录的信息实在是太重要了,所以还要涉及日志安全的问题。
一般系统中日志信息:
代码:
/var/log/secure: 记录系统的安全信息,比如ssh、ftp、pop3等;
/var/log/wtmp: 记录谁曾经登陆过系统,由于本日志被编码过,所以只能用last命令查看;
/var/log/boot.log: 顾名思义,记录开启或者关闭系统及武夫的信息;
/var/log/message:系统发生的错误信息都会记录在这个日志中,比如iptables中您使用log功能的日志;
/var/log/mail:
/var/log/httpd/
/var/log/mysqld.d 等,记录的就是这些服务的日志。
2 配置syslogd的说明
2.1 启动syslogd服务
首先,您要确定您的系统是否运行着这个服务。
代码:
service [color=red]syslog[/color] status
或者:
代码:
ps -aux|grep syslog
如果您的系统中并没有运行这个服务,您可以打开它。方法很多啦。
代码:
service syslog start
如果您希望系统在下次启动的时候就运行syslogd,您可以在setup中的服务中添加。如果确定您的默认引导级别,比如3,那么您也可以在 /etc/rc.d/rc3.d/下添加以 S 开头的软连接。或者,您使用chkconfig 2345 syslog on来添加。
2.2 syslogd服务的配置文件
syslogd的配置文件一般在/etc/syslog.conf中。这个文件依然遵循你所见过的其它配置文件的规则,比如 # 是注释。您可以看看您的syslogd都在帮助您记录着什么。这是我的syslog.conf中的一部分:
引用:
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.* /dev/console
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# The authpriv file has restricted access.
authpriv.* /var/log/secure
# Log all the mail messages in one place.
mail.* /var/log/maillog
# Log cron stuff
cron.* /var/log/cron
2.3 syslog.conf的配置规则
代码:
服务名称.信息等级 存放或者显示地点
这个语法很简单呢。呵呵。逐个解释一下。
服务名称
mail http at cron kern 等等。
信息等级
代码:
info: 一些提示信息资料;
notice: 需要您注意的信息;
warn或者waring: 警告信息;
[color=black]上面三个信息虽然是提醒您注意,但是却还没有到错误的情况。下面的信息就要注意了。[/color]
error或者err: 错误信息。您需要仔细检查发生错误的原因了;
crit: 很严重的错误,到达临界点了;
alert: 警告! 是否想起了“Red Alert”?不过,在这里这可是相当严重的错误啊;
emerg或者panic:系统混乱,重做吧;
特别的:
debug: 将显示很多信息;
none: 顾名思义,什么信息也不记录。
存放或者显示地点
代码:
日志的绝对路径: 比如/var/log;
您的一个用户 ;
网络上的主机: @log.company.com
打印机: /dev/lp0
2.4 应用举例
代码:
mail.info /var/log/maillog
大于等于info的信息都会写到/var/log/maillog中。
代码:
mail.*;cron.* /var/log/mailcron mail.=warn;cron.=warn /var/log/mailcronwarn
等级为warn的信息,写进/var/log/mailcronwarn,其它的信息写进/var/log/mailcron。
代码:
*.*;mail,cron.none /var/log/message
代码:
*.*;mail.none;cron.none /var/log/message
记录除去mail和cron之外的所有服务的所有信息。
3 syslogd和系统中服务配置中日志的关系
上面已经说了,syslogd是为系统提供日志服务的。那么,我们在配置文件中定义的日志信息和syslog.conf有什么关系呢?
或者您也注意到了这段:
代码:
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages
这段话是什么意思呢?我认为是在/var/log/messages中记录除去mail、authpriv和cron之外的所有系统信息。也就是说它会记录您自己的http信息。是否这样呢?我自己安装了一个httpd,并且指定日志到另外一个文件,比如 /usr/website/log/httplog。我虽然可以在/usr/website/log/httpdlog中看到我的httpd的日志信息,但是我执行
代码:
# cat /var/log/messages|grep HTTP
却得到空。
另外,就这个问题我曾经请教一个朋友。他说syslogd不会记录你没有要求它记录的信息,虽然有上面的*.info但是这个*是不包括你自己的服务的。我问,那么iptables也没有在我的syslog.conf中要求,那为什么它会记录到/var/log/messages呢?或者是 iptables自己定义了吧。
所以,关于这段的理解我只有这样的认识。如果有错误,请您指出。
4 什么是logrotate
logrotate是对日志文件做轮换。就是把现在的log命名为log.1,然后继续写log。如果存在log.1就命名log.1为log.2然后命名log为log.1,依此类推,但并非没有尽头。这个尽头就是您在logrotate的配置文件中的定义,我的系统默认的是到4。那么对log.4做什么操作呢?删除。
syslogd是daemons方式运行的;
logrotate是按计划运行的。
5 配置logrotate的说明
5.1 配置文件的位置
/etc/logrotate.conf
/etc/logrotate.d
其中,/etc/logrotate.conf是主要配置文件,/etc/logrotate.d中的文件会被/etc/logrotate.conf 读取。如果您在/etc/logrotate.d中的配置文件没有规定具体的参数,则这些参数由/etc/logrotate来决定。
5.2 logrotate的配置规则
正如在上面5.1中所说的,logrotate的主要配置在/etc/logrotate.conf中设置,而/etc/logrotate.d中的文件是对/etc/logrotate.conf的补充。或者可以看作为了不使/etc/logrotate.conf过大而设置。logrotate的写法:
代码:
把logfile(s)写在前面,包含文件的绝对路径,可以使用空白字元分隔多个log,也可以使用统配符置换;用 { } 包含所有设定;一般包括:
prerotate 在启动 logrotate 之前执行的命令,比如 /usr/bin/charrt -a /var/log/logfile;
postrotate 在执行了 logrotate 之后执行的命令,比如 /usr/bin/charrt +a /var/log/logfile;
您可以设定执行如上两个动作,也可以不设定,这依赖于您的需要。
在prerotate与postrotate之间的动作有:
weeky #每个星期执行一次
rotate 4 #保留四个日志
create #logratoe之后再建立日志
compress #rotate之后的日志是否压缩
include /etc/logrotate.d #包含/etc/logrotate.d目录下面的轮换设置
如果您自己在/etc/logrotate.d下写了自己的轮换设置可以使用
代码:
logrotate -f yourfile
来测试。
5.3 鉴于这个文档的设置比较明了所以不在此举例。您可以参考您的 /etc/logrotate.conf 和 /etc/logrotate.d 下面的文档看看。 -
学习计划
2007-11-21
c++:
看的书:
-.基本 C++:
1.<<c++程序设计>>(谭浩强 著)(已大部分看完)
2.<<Think in C++>>(第二卷 实用编程技术 大约用42天)
{具体安排:
每天必须看12页,可以适当调节,充分利用课余时间;
}
3.<<The C++ Programming Language>> (Bjarne Stroustrup 著)
{阅读说明:
该书的作者是C++语言的作者,他的书中包括了对本语言的详细描述,所以只要是想解决任何C++能做什么和不能做什么的问题时,就可以在本书中找到满意的解答.当读者掌握了C++语言的诀窍并且准备向更专业的方向发展的时候,就可以阅读该书.}Two:深入理解 C++:
1.<<Large-scale C++ Sofuware Design>>(John Lakos著)
{可以激发读者的学习欲望,给读者介绍对于大型C++项目的实际而通用的编程技巧.}
2.<<Effective C++>>(Scott Meyers)
{它是改善设计的经典的技术书籍.它系统的归纳了许多程序员不得不煞费苦心学习的资料.}
3.<<More Effective C++>>
{是上部作品的延续,是另一部经典之作.}
4.<<Modern C++ Design>>(Andrei Alexandrescu)
{他是机遇策略设计的标准文本.汇集了很多使用摸板的高级实践方法.}Php:
1先把 HTML 看完;
2.看PHP与Mysql;
{ } -
加油
2007-11-20
好几天没看html,php感觉还很远,这几天一直颓废,
该振作了,ltz,加油!!
-
C++ 备忘录 (一)
2007-11-11
目录:
1、成员函数的重载、覆盖与隐藏?
2、用户自定义类型转换的方法?
3、声明的定义的区别?
4、类模板的使用方法总结?
5、const的修饰问题?
成员函数的重载、覆盖与隐藏?
--摘自《高质量C++/C 编程指南》
成员函数被“重载”的特征:
(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。
“覆盖”是指派生类函数覆盖基类函数,特征是:
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual 关键字。
“隐藏”规则的特征是:
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual
关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual
关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。
用户自定义类型转换的方法?首先应该明白什么是“隐式转换”和“强制转换”?
前者是指:在算数运算和关系运算中如果参与运算的操作数类型不一致,则系统自动对数据进行转换,转换的原则是将低类型数据转换为高类型数据。这种转换过程中数据的精度没有损失,但是在赋值运算中,则要求一例将右值类型转换为左值类型,这存在精度损失。
后者是指:强制转换往往是显式的转换,这种转换是暂时性的,一次性的。
在用户定义的转换中,如果要把一个类对象隐式转换成其他类型的对象,使用转换函数,形式如下:
Operator type();
这里的type 可用内置类型类类型或typedef 名取代,但是不允许type 表示数组或函数。
类型转换函数必须是成员函数它的声明不能指定返回类型和参数表.
凡是只有一个参数的类的构造函数,每一个函数都定义了一个隐式转换。可以使用explicit来告诉编译器不要使用那个显式构造函数来执行隐式类型转换。
用户定义的转换是由转换函数或构造函数执行的。正如前面已经看到的在转换函
数执行转换之后接着可以有一个“标准转换”把转换函数的结果转换成最终的目标类型。类似地,构造函数执行转换之前也可以有一个“标准转换”把要被转换的值变成构造函数参数的类型。这里“标准转换”指系统内置的转换。
声明和定义的区别?声明:一种把一个名称引入或者重新引入到某个C++作用域的构造。
定义:它也是一种声明,但该声明必须给出被声明实体的细节。 对于变量而言,这里的细节是指:为被声明实体保留存储空间。 对于class类型和函数定义而言,指的是包含有一队花括号内容的声明。 对于外部变量而言,指的是前面没有关键字extern或者在声明时就进行初始化。变量的声明有两种情况:
一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。
另一种是不需要建立存储空间的 例如:extern int a 其中 变量a是在别的文件中定义的.前者是"定义性声明 (defining declaration)"或者称为"定义(definition)",而后者是"引用性声明 (referncing declaration)" 从广义的角度来讲 声明中包含着定义,但是并非所有的声明都是定义,例如:int a 它既是声明,同时又是定义。然而对于 extern a 来讲 它只是声明不是定义。一般的情况下我们常常这样叙述,把建立空间的声明称之为"定义",而把不需要建立存储空间称之为"声明"。很明显我们在这里指的生命是范围比较窄的,也就是说非定义性质的声明. --摘自erictb的blog
编译器总是对每一个cpp文件分别进行编译,这就是为什么debug文件夹下来总是存在多个obj文件。编译器必须知道被编译的cpp文件内的所有“类型信息”,所以我们总是经常include别的头文件,然后链接器会正确链接obj文件。
C++里的函数声明“隐式”表达该函数会在别个地方定义。如果在函数前面加一个extern的话,就变成显式声明了。在变量前面使用extern的话,只是声明一个对象,而不分配内存。详细参看《C+primer》331页。
另外,extern “c”加在函数前面表示函数是用C语言写的函数, 不过他只能够压制nonmember function的“mangling”效果。同时,变量前面的extern “c”也只是表示声明。
类模板的使用方法总结?
模板参数可以是一个模板类型参数也可以是一个模板非类型参数(它代表了一个常量表达式)。显式实例声明:
在定义了模版类后,可以用template class Queue<int>显式实例声明。也可以使用template特化整个模版类或者某一个特化函数。甚至可以特化模版参数的某一个,template <int hi, int wid>class Screen
{}改写成template <int hi>class Screen<hi, 80>{}
模板有两种编译模式:“包含编译模式”和“分离编译模式”。前者要求将模板的定义放在一个头文件中,也提供一个cpp文件来包含这个头文件,这样编译器才能编译模版定义。
const的修饰问题?
类似const int* & rp、const int *、int * const这样的语句,const在其中到底修饰谁?
根据C++98标准8.3.2对引用的定义:
对于声明:
T D;
如果D具有如下形式:
& D1 //注意,&与D1之间不能有任何cv修饰符
那么标识符D1的类型为“reference to T”。
对于“const int* & rp”套用上面的格式,则:
T D;
const int* &rp;
这样,D就具有了&D1的形式,其中D1为rp。而T,则是const int*。
则
const int * & 表示:“a non-const reference to T where T is a pointer to 'const int' ”。
const int *表示:“pointer to 'const int'”。
int * const表示:“const pointer to int”。
对于引用,还有一个很重要的原则:
const 常量引用(reference to const T)可以用不同类型的对象初始化,只要能从一种类型转换到另一种类型即可,也可以是不可寻址的值如文字常量。
包括两种常见的方式:
double dval = 3.14159; const int &ir = 1024;
const int ival = 1024; const int * const &pi_ref = &ival; //需要常量指针 -
new和delete
2007-11-07
指针与c++基本原理
面向对象与传统的面向过程的区别在与:OOP强调的是在运行阶段(而不是编译阶段)进行决。运行阶段之的是程序正在运行时,便一阶段之的是编译器将程序组合起来时。
运行阶段的决策就好比度假时,选择参观那些景点取决于天气和当时的心情;而编译阶段决策更像不管在什么条件下都坚持预先设定好的日程安排。前者提供了灵活性,可以根据当时的情况进行调整。例如,考虑数据为数组分配内存的情况。传统的方法是声明一个数组。但必须的指定其长度,而究竟这哥长度该是多少呢?这点并不好确定,往往为了安全起见我们会非配较大的空间给它,但是又往往用不了这么多的空间造成了不必要的浪费。
而OOP通过将这样的决策推迟到运行阶段进行,使程序更灵活。在程序运行后,可以这次告诉它需要的元素个数,而且还可以在下次告诉它需要的元素个数。c++采用的方法是,使用关键字new请求正确数量的内存以及使用过指针来跟踪新额分配的内存的位置。
new和delete的使用
可以使用new 动态的分配内存,其格式为:
1 声明一个简单变量
typeName pointer_name = new typeName;例如:int *p=new int(其中p是数据对象,所谓数据对象--之的是为数据项分配的内存,比变量更通用)
2 声明动态数组
typeName pointer_name = new typeName[n];例如:int *psome = new int[10](new操作符返回第一个元素的地址)
使用delete来释放内存的几个规则:
1) 不要使用其来释放不是new分配的内存;
2) 不要使用其同时释放同一个内存块两次;
3) 如果使用new[]为数组分配内存,则应相应的使用delere[]来释放;
4) 如果使用new[]为一个实体分配内存,则应使用delete(无括号)来释放;
5) 对应空值指针应用delet忠告:使用new的同时一定别忘了使用delte来释放内存,避免内存泄露。




