暂无

暂无
posts - 3, comments - 0, trackbacks - 0, articles - 0

2008年4月24日

第一部分 软件安装
分2种:二进制形式的软件分发包、源代码形式的软件包

二进制包:事先编译好,优点是操作容易,缺点是不灵活
1:*.rpm格式的软件包,rpm(redhat package manager),一般命令为:
安装:rpm -ivh *.rpm,i 安装,v 校验,h 用散列符显示安装进度
卸载:rpm -e packagename,e 卸载
2:*.tar.gz/*.tgz、*.bz2形式的二进制软件包
安装:tar -zxvf *.tar.gz 或  tar -jxvf *.bz2
卸载:手工操作
*.tar.gz/bz2文件是用tar工具打包、用gzip/bzip2压缩,安装时直接解压缩即可,可用tar ztvf *.tar.gz 或 tar jtvf *.bz2获取安装清单,tar的参数z是调用gzip解压,x是解包,v是校验,f是显示结果,y是调用bzip2解压,t是列出包的文件清单,更多命令请参照man tar

源代码格式的分发包:
提供了程序源代码的发布形式,需用户自己编译成为二进制代码并安装,使用灵活,可用于多硬件/操作平台/编译环境
1:*.src.rpm格式
安装: rpm -rebuild *.src.rpm,将源代码编译并在/usr/src/dist/RPMS下生成二进制的rpm包
cd /usr/src/dist/RPMS
rpm -ivh *.rpm
卸载:同二进制格式
2:*.tar.gz/*.tgz、*.bz2格式
安装:tar -zxvf *.tar.gz 或 tar -jxvf *.tar.bz2 先解压,然后进入解压后的目录:
./configure 配置
make 编译
make install 安装
卸载:make uninstall 或 手动删除
有些软件包的源代码在编译安装后可以用make install命令来进行卸载,如果不提供此功能,则软件的卸载必须手动删除。由于软件可能将文件分散地安装在系统的多个目录中,往往很难把它删除干净, 那你应该在编译前进行配置,指定软件将要安装到目标路径:./configure --prefix=目录名,这样可以使用“rm -rf 软件目录名”命令来进行干净彻底的卸载。

第二部分 linux常用命令(直接粘贴)
参照:http://hi.baidu.com/hmos/blog/item/53db9f82a26c90be6c81195f.html

一. 启动,关机,登入,登出相关命令
<login> 登录
<logout> 登出
<exit> 登出
<shutdown> 停止系统
<halt> 停止系统
<reboot> 重启动
<poweroff> 切断电源
<sync> 把内存里的内容写入磁盘
<lilo> 安装lilo启动管理程序
<grub> 安装lilo启动管理程序


二. Shell相关命令
<chsh> 切换Shell
<history> 显示命令履历
<alias> 设置命令别名
<unalias> 取消命令别名
<which> 显示命令所在位置
<type> 查询命令种类
<echo> 显示字符串或者变量内容
<set> 设置/显示Shell变量
<printenv> 显示环境变量
<export> 设置环境变量
<env> 设置临时环境变量
<unset> 释放环境变量
<setenv> 设置环境变量
<unsetenv> 释放环境变量
<source> 执行文件当中的命令
<man> 查询命令手册
<info> 查询超文本命令手册
<whatis> 显示命令简介
<apropos> 通过关键字查询手册


三. 用户管理相关命令
<su> 切换到其他用户
<useradd> 追加用户
<adduser> 追加用户
<userdel> 删除用户
<usermod> 修改用户设置
<chfn> 修改用户私人信息
<groupadd> 追加组
<groupdel> 删除组
<groupmod> 修改组设置
<passwd> 更改密码
<whoami> 显示用户名
<logname> 显示登录用户帐号
<users> 显示所有登录用户信息
<who> 查询登录用户信息
<w> 查询登录用户信息
<id> 显示指定用户的ID信息
<groups> 显示指定用户的所属组
<finger> 显示指定用户的个人信息
<mesg> 开关与他人收发消息
<write> 给其他用户发消息
<wall> 给所有用户发消息
<talk> 和其他用户聊天


四. 系统消息相关命令
<date> 显示/设置当前时间
<uptime> 显示系统运行时间
<arch> 显示机器的核心构架(如i386)
<uname> 显示操作系统信息
<tty> 显示终端名
<last> 显示登录/登出在履历
<lastb> 显示非法登录信息
<dumpkeys> 显示当前键盘配置
<loadkeys> 变更键盘配置
<df> 查询磁盘使用信息
<du> 查询磁盘使用信息
<dmesg> 显示系统启动消息
<script> 保存输入输出到文件


五. 文件操作相关命令
<ls> 显示文件列表
<tree> 显示目录树
<pwd> 显示当前路径
<cd> 更改当前路径
<pushd> 追加路径到目录堆栈
<popd> 从目录堆栈删除路径
<dirs> 显示目录堆栈的内容
<mkdir> 创建路径
<rmdir> 删除路径
<cp> 复制文件/目录
<rm> 删除文件/目录
<mv> 移动文件/目录,修改文件名
<chown> 更改文件/目录的所有者
<chgrp> 修改文件/目录的所有组
<chmod> 修改文件/目录的权限
<touch> 更改文件时间
<ln> 建立文件/目录链接
<find> 查找文件
<whereis> 显示文件存在的路径名
<file> 查询文件种类
<size> 查询文件大小


六. 文件编辑相关命令
<cat> 显示文件内容
<tee> 输出到文件和屏幕
<more> 分屏显示文件内容
<less> 分屏显示文件内容
<head> 显示文件头部内容
<tail> 显示文件尾部内容
<fold> 折叠显示长行
<sort> 排列文件的行
<cmp> 比较文件内容
<diff> 显示文件差异
<nkf> 更改日语文件编码
<dd> 变更文件之后复制
<wc> 统计文本单词数,文件大小等
<split> 分割文件
<paste> 以行连接文件
<join> 以字段连接文件
<grep> 查询文字
<uniq> 过滤重复部分显示文件内容
<tr> 替换文字
<sed> 替换文字


七. 压缩/解压缩相关命令
<ar> 压缩/解压缩文件
<tar> 压缩/解压缩文件
<compress> 压缩/解压缩文件
<uncompress> 解压缩
<gzip> 压缩/解压缩文件
<gunzip> 解压缩
<zcat> 显示压缩文件的内容
<lha> 压缩/解压缩文件
<uuencode> 把二进制文件编码为文本文件
<uudecode> 把经过编码的文本文件还原为二进制文件


八. MS-DOS工具集[mtools]命令
<mdir> 显示文件列表
<mcd> 改变当前目录
<mmd> 新建目录
<mrd> 删除目录
<mdeltree> 删除目录树
<mcopy> 复制文件
<mdel> 删除文件
<mmove> 移动文件
<mren> 更改文件或目录名
<mattrib> 修改文件属性
<mtype> 显示文件内容
<mdu> 查询文件或目录大小
<minfo> 显示磁盘信息
<mformat> 以MS-DOS方式格式化磁盘
<mlabel> 设置磁盘标签


九. 控制外部设备相关命令
<mount> mount上设备
<umount> 解除已经mount上的设备
<eject> 弹出(CD/DVD等)
<fdformat> 格式化软盘
<fdisk> 配置/显示硬盘分区
<mkfs> 格式化磁盘分区
<fsck> 检查/修复磁盘错误
<lpr> 打印到打印机
<lprm> 中断打印任务
<lpq> 显示打印任务的状态
<lpc> 管理/控制打印任务
<ifconfig> 显示/设定NIC配置


十. 进程及任务管理相关命令
<ps> 显示正在运行的进程
<jobs> 显示后台运行任务
<fg> 把任务切换到前台
<bg> 把任务切换到后台
<kill> 中止进程或任务
<killall> 中止进程或任务
<wait> 等待进程或任务的结束
<at> 设置定时执行任务
<atq> 显示尚未执行的任务
<atrm> 删除定时执行任务
<batch> 在系统负荷减轻的时候执行任务
<nice> 改变优先度并执行任务
<nohup> 在后台执行任务,Logout之后也不退出
<sleep> 休眠一定的时间


十一. 网络管理相关命令
<netstat> 显示当前网络连接状况
<route> 显示/设置路由
<host> 显示网络主机情况
<hostname> 显示/设置当前主机的名字
<ping> 确认和远程机器的连接情况
<traceroute> 显示路由信息
<rwho> 查询网上机器的登陆用户
<ruptime> 查询网上机器的系统运行时间
<rlogin> 登陆到远程机器
<telnet> 用telnet登陆到远程机器
<rsh> 给远程机器发送命令
<rcp> 在远程机器之间复制文件
<mail> 收取邮件
<sendmail> 发送邮件
<mailq> 确认邮件队列
<ftp> 用ftp传输文件


十二. 其他命令
<cal> 显示日历
<clear> 清屏
<gcc> 编译C语言代码
<as> 汇编
<bc> 计算
<rpm> Redhat的包管理
<dpkg> Debian的包管理
<installpkg> Slackware的包安装(删除命令则是removepkg)
<XF86Setup,turboxfg,Xconfigurator> 配置 X 服务器
<startx> 启动 X-Window 系统

附:组合命令
重定向,如
$ ls -l /bin > ls-output
$ more ls-output

管道命令,如
$ cat file1 file2 | sort | uniq
管道命令连接着一个命令的标准输出和另一个命令的标准输入

经常被用于管道的命令
awk, fold, grep, head, nnkf, pr, sed, sort, tail, tee, tr, uniq, wc

第三部分 linux shell

第四部分 ubuntu文件简介

第五部分 ubuntu内核介绍

posted @ 2008-04-24 11:02 rail 阅读(2104) | 评论 (0)编辑 收藏

文章来源:http://tb.blog.csdn.net/TrackBack.aspx?PostId=368920
http://blog.csdn.net/domando/archive/2008/03/07/2157269.aspx

Linux系统中,软件通常以源代码或者预编译包的形式提供。
软件源代码需要您亲自编译为二进制的机器代码才能够使用,安装比较耗时,不过您可以自行调节编译选项,决定您需要的功能或组件,或者针对您的硬件平台作出优化。
预编译的软件包,通常是由软件的发布者进行编译,您只要将软件拷贝到系统中就可以了。考虑到预编译软件包的适用性,预编译软件包通常不会针对某种硬件平台优化。它所包含的功能和组件也是通用的组合。

Ubuntu系统中,软件通常以“deb”格式的包文件发布,它是一种预编译软件包。deb包中除了包含已编译的软件,通常还包括软件的拷贝路径、对其它软件包的依赖关系纪录、一个比较通用的配置文件以及软件的描述、版本、作者、类别、占用空间等信息。

deb软件包命令遵行如下约定:
soft_ver-rev_arch.deb
soft为软件包名称,ver为软件版本号,rev为Ubuntu修订版本号,arch为目标架构名称
例如:azureus_2.4.0.2-0ubuntu2_all.deb

您需要使用“dpkg”命令来管理deb软件包:
dpkg -i | --install xxx.deb 安装deb软件包
dpkg -r | --remove xxx.deb 删除软件包
dpkg -r -P | --purge xxx.deb 连同配置文件一起删除
dpkg -I | -info xxx.deb 查看软件包信息
dpkg -L xxx.deb 查看文件拷贝详情
dpkg -l 查看系统中已安装软件包信息
dpkg-reconfigure xxx 重新配置软件包

有些时候,您使用“dpkg”安装一个软件包,系统会提示您该软件包依赖其它软件包。这时,您先安装其它软件包,直到满足依赖关系为止。或者同时安装多个软件包
dpkg -i aaa.deb bbb.deb ccc.deb


APT
===
如果一个软件依赖关系过于复杂,使用“dpkg”来安装它,并不是一个明智的选择,这个时候您就需要用到APT软件包管理系统。APT可以自动的检查依赖关系,通过您预设的方式来获得相关软件包,并自动安装配置它。事实上,在多数情况下,我们推荐您使用APT软件包管理系统。
APT系统需要一个软件信息数据库和至少一个存放着大量deb包的软件仓库,我们称之为“源”。“源”可以是网络服务器,安装CD或者本地软件仓库。您需要修改“/etc/apt/sources.list”文件,使APT系统能够连接到“源”。
您可以在以下页面中获得网络安装源的列表,并且根据您的网络环境,选择速度较快的源。
http://wiki.ubuntu.org.cn/%E5%BF%AB%E9%80%9F%E8%AE%BE%E7%BD%AE%E6%8C%87%E5%8D%97/DapperDrake

APT系统主要包括“apt-get”和“apt-cache”等命令。它们通常都是复合命令,包含若干个子命令。
apt-get install xxx 安装xxx
   -d 仅下载
   -f 强制安装
apt-get remove xxx 卸载xxx
apt-get update 更新软件信息数据库
apt-get upgrade 进行系统升级
apt-cache search 搜索软件包
        
Tips:建议您经常使用“apt-get update”命令来更新您的软件信息数据库

源码包
======
对于绝大多数软件,我们建议您使用APT系统来安装它。在少数情况下,例如某软件没有以deb包的格式发布,或者您需要定制适合自己的软件,您可以通过编译源代码的方式安装它。

首先您需要下载软件的源码包,并且将它解包为一些源代码文件。并了便于管理,我们建议您将下载的源码包移动到“/usr/local/src/”目录下,并在这里解包。
sudo mv xxx.tar.gz /usr/local/src 移动源码包
cd /usr/local/src       进入“/usr/local/src/”目录
sudo tar -xzvf xxx.tar.gz    解包源码
cd xxx_ver/          进行解包后的源码目录

源码目录中通常有一个“configure”脚本,用来配置即将开始的编译过程。您可以执行它
sudo ./configure [--prefix=/usr/loca/xxx ......]
它会自动检测软件的编译环境和依赖关系,并且生成“Makefile”文件。
   您可以使用带参数的命令“./configure --help”,或者阅读“INSTALL”文件,查看该脚本允许的参数。例如使用“--prefix=/usr/local/xxx”参数,将软件的安装目录设定为“/usr/local/xxx/”。(如果您一定要将软件安装在一个目录下,我们建议您安装在这里)

现在执行“make”命令,系统会根据“Makefile”文件中的设定,通过“make”工具调用编译器和所需资源文件,将源代码文件编译成目标文件。
sudo make

执行“make install”命令,“make”工具会自动将连接目标文件,将最终生成的文件拷贝到“Makefile”文件设定的路径中,并且完成更改文件的属性,删除残留文件等活动。
sudo make install

现在,您的编译安装已经完成,为了更方便的使用它,需要给程序的可执行文件作一个符号链接。
sudo ln -sf /usr/local/xxx/exe /usr/local/bin/exe

---------------------------------------------------------------------------------------------------
LINUX软件包的一般安装方法
在LINUX的世界里,软件的安装主要的是有两种方式,一种是rpm包,还有一种就是tar包。对于这两种包,一般的安装方法是这样的:
1)rpm包的安装
安装rpm包时需要一个参数就是-i.也就是就是可以用这样的命令来安装:
rpm -i *.rpm
但是我们在安装时总是希望能看到一些信息,这时就可以用这样的命令:
rpm -ivh *.rpm
这时就会显示出软件包的安装进度以及安装中的信息等。
如果想要安装的软件包系统中已经存在而只需要升级安装一下的话可以这样来做:
rpm -U *.rpm
这样就会升级系统中已经存在软件包了。
而御载一个已安装的软件包的命令是这样的:
rpm -e packagename
要想列出系统已经安装的rpm包的清单可以输入下面的命令:
rpm -qa
但是此时列出的清单会是很长的,而我们所需要的只是其中的一个,这时我们可以用下列的命令来达到我们的目的:
rpm -qa |grep -i 'name'
在软件包的安装过程中我们有可能用到的参数如下:
--force 强行安装
-v 用符号“#”来显示安装进度
--percent 用百分比来显示安装进度
-nodeps 忽视已丢失的依赖性文件强行进行安装
-test 这个参数并不进行实际的安装,而只是检查软件包能否成功安装
-v 告诉RPM报告每一步的情况
2)tar包
tar包有两种格式,一种是.tar.gz,另一种就是tar.bz2.这两种包的安装方法一般是这样的:
解压:这两种包要有用两个不同的命令来解包,分别是:
tar -xzvf *.tar.gz
tar -xvjf *.tar.bz2
解压以后进入解压出来的目录,看一下里面的东西,一般而言这样的包里会有README文件的,打开看一下的他的安装方法。一般来说这样的包安装一般是下面的步骤:
make
make install
这样就会将软件包安装上了。
3)除了这样的安装方法,还有的软件是以可执行的二进制的文件的形式给出的。这时只要执行这个二进制文件就可以将这个软件安装上的。
4)在Debian中采用的软件包管理机制是与众不同的,在这里可以使用世界各地的镜像站点进行软件包安装和更新,方法一般来说是这样的:
配置镜像站点:vi /etc/apt/source.list
在这个文件里加入你所使用的镜像站点。然后执行apt-get update,这样就会连接站点读取软件包的信息,然后执行apt-get upgrade,这样就可以进行升级了。或者是执行apt-get install pakeagename,这样就可以安装你想要的软件包了。

posted @ 2008-04-24 10:46 rail 阅读(8776) | 评论 (0)编辑 收藏

2008年4月15日

很多事情都可以总结为WWWH问题。也就是What When Why & How。java异常恰巧是其中之一。


首先,java的异常是什么?抛去官方冗长的定义,我觉得异常或者说exception,其实可以理解为这样一句话:“wow!!这可不是我期待的状态”。


如果这样理解异常,那么对于何时使用异常也就再清楚不过了。那就是,只有当出现了不在正常流程之中的某种状态,这个时候就应该使用异常了。比如连接超时、传入的参数为null或者数据无法插入到数据库。


那么,为什么我们要使用异常呢?理由其实很简单,为了更加简洁的代码或者说为了OO。如果java没有异常,我们会怎么处理呢?
if(aMethod() == -1 )
{
//do someting
}
else
{
//do someting
}
有了异常以后,我们怎么做呢?
try
{
aMethod();
}catch(MyException e){
//do someting
}
或者
public anotherMethod() throws MyException
{
aMethod();
}
这里只列举了一个最简单的例子。如果aMethod()这个方法到处都需要调用,这种好处就会更显著了。


至于我们需要不需要使用异常呢?答案必然是肯定的。但是网上也有一些声音说,异常是一种耗费性能的操作,应该少使或者尽量不使。我认为,这跟没有很好的理解如何使用异常有关系。


下面我就来说说,最重要的一点,也就是how,如何使用异常。


首先,我们来看看,当发生异常的时候,JVM做了什么?



为了抛出异常,JVM 发出 athrow 字节码指令。 athrow 指令引起 JVM 将异常对象弹出执行堆栈。然后 JVM 搜索当前执行堆栈帧来寻找第一个 catch 子句,这个子句可以处理该类的一个异常或者其超类的一个异常。如果在当前的堆栈帧里没有找到 catch block ,那么当前堆栈帧就被释放,异常在下一个堆栈帧的上下文中被重新抛出,如此这般,直到找到包含匹配的 catch 子句的堆栈帧,或者是到了执行堆栈的底部。最后,如果没找到适当的 catch 块,所有的堆栈帧都会被释放,线程在 ThreadGroup 对象有了处理异常的机会后被终止(参考 ThreadGroup.uncaughtException )。如果找到了适当的 catch 块,程序计数器会重置到那一

块代码的第一行。 (注:1)



从上面的描述可以看出,抛出异常是一种代价很高的操作。有的人可能要问了,如果只是为了简洁的代码或者OO,这种代价值得吗?我的回答是,不值得!!!这点和我上面说的并不冲突。如果有一点经济学的知识,一定会知道边际量这个概念,说白了就是我多花一个单位的成本,是否可以带过我多于一单位的收益。将这点用到编程上也是通用的。
我们可以考虑这样一段代码
for(int i=0;i<list.size();i++)
{
AClass myClass = list.get(i);
if(myClass.aValue!=null && !"".equals(myClass.aValue))
{
//do something
}
}


这段代码很好的处理了参数不正常的情况。但有一个问题,每次循环程序都需要判断参数是否正常。假设我们知道大部分的参数都是正常的,那么这些操作就显得有些浪费了。如果改成
for(int i=0;i<list.size();i++)
{
AClass myClass = list.get(i);
try
{
//do something
}catch(Exception e){}
}
这样只有当很小几率发生错误的时候,我们就可以节省一些操作。这也就是经济学上说的边际收益大于边际成本的时候,只有这个状态,我们才应该这样使。反观另外一个状态,如果我们不能确定参数是否大部分为正常或者我们确定大部分参数都不会为正常,那么就应该使用第一种方法。总之,这点是需要灵活掌握的。


另外一个值得注意的地方就是,不要将异常用于流程跳转,异常就是指异常的状态,而不是控制语句。如果你能注意这点,你就已经避免了90%的错误异常应用。举个例子。inputStream#read大家一定都用过,为什么read方法要返回-1作为读取到文件尾的状态,而不是用异常,就是这个道理。



关于如何使用异常的另外一点就是,我们如何catch异常。这一点其实也很简单,总结为一句话就是,如果你不知道如何处理这个异常,那么就不要catch这个异常。


我们经常会遇见这样一种情景:我们调用了某个接口,这个接口抛出了一个checkedexception。这个时候就是考验你的时候了,catch还是throw 这是个问题。我的经验是,如果你觉得这个异常是一个可恢复的异常,比如参数错误,那么你就需要catch这个

exception,然后告诉用户重新输入。如果这个exception是一个不可恢复的exception,比如SQLException,那么你干脆就不要处理它,把它留给底层去处理,让底层定向到统一的异常页面。当然,这种操作并不是严格的,你也可以catch这个exception,然后返回到你自己的异常页面。


最值得注意的是,永远不要没有理由的私吞exception。比如
try
{



}catch(Exception e){
//do nothing
}
如果你确定可以这种做,那么没有关系。但是如果你不能,千万一定不要这么做,如果你这么做了,很有可能导致无法定位异常,把自己或者别人搞到死。



关于如何使用异常的最后一个问题就是runtimeexception 或者 checkedexception,这是个问题!


很长一段时间,我也曾困惑于这个问题,记得以前看过一本书,好像是java夜未眠,记不清楚了。里面说,要尽量使用runtimexception,但是当我这样做的时候,问题就来了,调用我接口的人不知道我的方法会抛出什么异常,也就无从处理了,这样就导致了程序的不健壮。其实这个问题需要根据你的业务进行判断,没有什么尽量或者最好。一个简单的原则是如果希望客户程序员有意识地采取措施,那么抛出checkedexception.举两个例子
public void aMethod(String s)
{
if(s==null) throw new Runtimeexception();
}
public void otherMethod(String uri) throws NoSuchFileException
{
try
{
File file = new File(uri)
}catch(IOException e)
{
throw new NoSuchFileException()
}
}


看出点什么了吗?你肯定很奇怪为什么都是参数不正确,第一个方法抛出的是一个RuntimeException而第二个是一个CheckedException。因为s为null是一个我们非期待的参数,而这种状态可能并不是经常出现的,属于一种非业务错误或者不可恢复异常,我们不需要明确的通知客户程序员。



而第二个不同,第二个异常代表用户输入了某种错误的参数,而这个异常需要客户程序员去通知用户。所以要求客户程序员去catch这样exception。


以上是我对异常的一些理解,如果大家有不同意见可以进行讨论


参考资料
1.关注性能: 异常的异常:http://www-128.ibm.com/developerworks/cn/java/j-perf02104/index.html
2.异常设计----何使用异常的原则 http://www.cnblogs.com/javaVillage/articles/384483.html

posted @ 2008-04-15 19:00 rail 阅读(299) | 评论 (0)编辑 收藏