一些有用的小Trick
(这些Trick来自网络和本人的心得,而且不定期更新)
1. VIM中替换字符串
:s/tototo/fromfrom/ 替换当前行第一个 tototo 为 fromfrom
:s/tototo/fromfrom/g 替换当前行所有 tototo 为 fromfrom
:n,$s/tototo/fromfrom/ 替换第 n 行开始到最后一行中每一行的第一个 tototo 为 fromfrom
:n,$s/tototo/fromfrom/g 替换第 n 行开始到最后一行中每一行所有 tototo 为 fromfrom (n为数字,若n为.,表示从当前行开始到最后一行)
:%s/tototo/fromfrom/(等同于 :g/tototo/s//fromfrom/) 替换每一行的第一个 tototo 为 fromfrom
:%s/tototo/fromfrom/g(等同于 :g/tototo/s//fromfrom/g) 替换每一行中所有 tototo 为 fromfrom
可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔
2. GNU Readline的一些操作
这里的 C 是指按‘住’Ctrl键,M 是指按‘下’Esc键后松开。
基本操作
C-b 回退 1 字符
C-f 前进 1 字符
Del/Backspace 删除左侧字符 (#1)
C-d 删除光标下的字符
C-_/C-x C-u 撤销最后一次操作
注意: 基于不同的配置,Backspace 键可能被设置成删除光标左侧的字符而 Del 键则和 C-d 一样,删除光标下的字符。
移动光标
C-a 移动到行首
C-e 移动到行末
M-f 前进一个单词(包括数字和字母)
M-b 回退一个单词
C-l 清空屏幕,然后在顶端重新输出当前行
Killing 操作
Killing 操作是指从当前行删除文本的同时保存以供以后粘贴(Yanking)
C-k 从当前位置开始删除剩余部分
M-d 删除从光标位置到单词结束的部分;如果光标在单词之间,则删除下一个单词
M-Del 删除从光标位置到单词开始的部分;如果光标在单词之间,则删除前一个单词
C-w 删除从当前位置到上一个空白之间的部分。与 M-Del 具有不同的单词界定
Yanking 操作
C-y 粘贴最后一次 Kill 的文本到光标处
M-y 回滚粘贴记录,并且粘贴新的最顶端一条。前一条指令必须是 C-y 或 M-y
读取参数
可以传递数字参数给 Readline 命令。格式:
M-[-]digit Command
例:
M-1 0 C-d 传递 10 给 C-d,删除光标后的十个字符
M-- C-k 传递 -1 给 C-k,删除当前行中光标之前的部分
查找历史记录
两种方式:普通查找、增量查找
增量查找:
C-r 在历史记录中向前(反向)查找
C-s 在历史记录中向后(正向)查找
重复 C-r/C-s 会继续查找下一条记录
Esc/C-j 结束查找,接受查找结果为当前行
Enter 结束查找,接受结果并执行
C-g 退出查找,恢复当前行
3. 我的.inputrc文件
"\e[A": history-search-backward
"\e[B": history-search-forward
set bell-style none
set bell-style visible
4. 我的.vimrc文件(最好安装vim-full)
syntax on
if has("autocmd")
au BufReadPost * if line("'\"") > 0 && line("'\"") <= line("$")
\| exe "normal g'\"" | endif
endif
if has("autocmd")
filetype indent on
endif
set showcmd
set autoindent
set hlsearch
set cindent
set nu
set incsearch
set vb
5.防止使用rm误删除的方法
首先建立一个“回收站”文件夹,我建立的是用户目录下的trash文件夹。
mkdir ~/trash
其次编写rrm文件,别忘了给它加执行权限:
#!/bin/sh
for ddd in $*; do
mv $ddd ~/trash/`date "+%Y%m%d_%H%M%S"`.$RANDOM.$ddd
done
其次将rm在shell的profile文件中替换为rrm,在我的macbook上,编辑~/.profile文件,加入:
alias "rm"="~/bin/rrm"
在这里,我把rrm文件放在了用户目录文件夹里的bin文件夹下。
再运行source ~/.profile
OK,结束,这样就不用怕错误删除文件了。因为rm的错误使用问题,我吃过两次好大好大的亏,有了这个方法之后,我们相当于给自己定义了一个回收站,rm命令是把文件放入回收站中。
晚风吹
2008年7月14日星期一
一些有用的小Trick
ubuntu 安装ArcSDE 9.1
虽然ESRI的官方文档如何安装ArcSDE已经很详细了(英文的),而且网上也有很多参考资料,但是这里还是针对自己的习惯以及针对ubuntu,用中文做一下说明,只是为了之后自己方便查阅。
1. 安装环境
我们安装的ArcSDE版本是9.1 for Oracle 10gR2,根据ESRI的官方文档,针对Oracle 9i的可以直接用来给10g,只不过有一些改动。
1. All references to Oracle9i can be changed to Oracle10gR2.
2. All references to the sdesetupora9i command should be substituted with sdesetupora10g.
3. All references to the sdeservice –o create –d oracle9i,SID command should be substituted with sdeservice –o create –d oracle10g,SID
4. UNIX installations/System Requirements
The ArcSDE 9.1 for Oracle10gR2 release is available on the following UNIX and Linux platforms:
Solaris 64bit
AIX 64bit
Red Hat Linux
2. 安装前的准备
a. 安装好Oracle 10g,在ubuntu上安装Oracle 10g可以参考我的另一篇文档。
b. 创建并设置好sde用户。
ArcSDE需要一个名为sde的用户,这个用户其他的属性都不重要,所以我将其所属的组设置为admin,以便于使用sudo。
官方文档上说shell应当设置为/bin/sh或者/bin/csh,我这里设置成bash,也可以。
同时,将sde加入oinstall组,是为了使之能运行一些oracle命令,同时使用oracle的一些动态链接库。
创建用户
sudo useradd -g admin -G oinstall -d /home/sde -s /bin/bash -m -k /etc/skel sde
设置密码
sudo passwd sde
输入你为sde用户设置的密码。
然后su sde,登录sde用户,或者直接退出当前用户,用sde用户登录。
c. 设置环境变量。
在.bashrc文件里修改(ubuntu默认.profile文件读取.bashrc文件,而且.bashrc文件在每次登录的时候都会读取),需要设置的环境变量如下:
SDEHOME #ArcSDE安装的地方
ORACLE_HOME #Oracle安装的地方
ORACLE_SID #Oracle SID的值
TNS_ADMIN #tnsnames.ora文件所在的地方
PATH $PATH:$SDEHOME/bin:$ORACLE_HOME/bin
LD_LIBRARY_PATH $SDEHOME/lib:/usr/lib:/lib:$ORACLE_HOME/lib (All platforms except HP and IBM)
SHLIB_PATH $SDEHOME/lib:/usr/lib:/lib:$ORACLE_HOME/lib (for HP only)
LIBPATH $SDEHOME/lib:/usr/lib:/lib:$ORACLE_HOME/lib (for IBM only)
TWO_TASK #value for TWO_TASK (if ArcSDE and Oracle on different machines)
如果Oracle数据库安装在本地,那么ORACLE_HOME和ORACLE_SID是需要设置并且起作用的,而,如果设置了TWO_TASK,那么它们就不起作用。
TWO_TASK指出在远程安装的Oracle的地址。如果在本地安装的Oracle,那么就不需要指出TNS_ADMIN和TWO_TASK。
注意:ArcSDE启动的时候,giomgr进程会读取$SDEHOME/etc/dbinit.sde文件中的设置,这会覆盖掉在.profile文件中的设置。
我的环境变量的设置如下:
umask 022
export ORACLE_BASE=/opt/oracle
export SDEHOME=/home/sde/sdeexe91
export ORACLE_HOME=/opt/oracle
export ORACLE_SID=GISexport PATH=$SDEHOME/bin:$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$SDEHOME/lib:/usr/lib:/lib:$LD_LIBRARY_PATH:$ORACLE_HOME/lib/stubs
d. 创建Oracle数据库用户和tablespace。
i. 创建tablespace。
tablespace至少需要200M的空间,我们这里创建成2G,最大是unlimited。
由于Oracle推荐使用本地管理表空间,那么这里就设置成本地管理。关于本地管理和数据字典管理的定义和比较,请参阅下面的文档:
Locally Managed Tablespaces:
A tablespace that manages its own extents maintains a bitmap in each datafile to keep track of the free or used status of blocks in that data file. Each bit in the bitmap corresponds to a block or a group of blocks. When an extent is allocated or freed for reuse, the Oracle server changes the bitmap values to show the new status of the blocks.
Dictionary-Managed Tablespaces:
For a tablespace that uses the data dictionary to manage its extents, the Oracle server updates the appropriate tables in the data dictionary whenever an extent is allocated or deallocated.
Advantages of Locally Managed Tablespaces:
Locally managed tablespaces have the following advantages over dictionary-managed tablespaces:
Local management avoids recursive space management operations, which can occur in dictionary-managed tablespaces if consuming or releasing space in an extent results in another operation that consumes or releases space in a undo segment or data dictionary table.
Because locally managed tablespaces do not record free space in data dictionary tables, it reduces contention on these tables.
Local management of extents automatically tracks adjacent free space, eliminating the need to coalesce free extents.
The sizes of extents that are managed locally can be determined automatically by the system. Alternatively, all extents can have the same size in a locally managed tablespace.
Changes to the extent bitmaps do not generate undo information because they do not update tables in the data dictionary (except for special cases such as tablespace quota information).
关于这两种管理方式性能的比较可以参看http://db.rdxx.com/Oracle/2006-5/18/190634694.shtml
创建tablespace的语句是:
CREATE TABLESPACE sde DATAFILE
'/opt/oradata/GIS/SDE/SDE.dbf' SIZE 2000M
AUTOEXTEND ONNEXT 32M
MAXSIZE UNLIMITED
LOGGING
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M
SEGMENT SPACE MANAGEMENT AUTO;
在做这部之前,需要用oracle用户登录,然后在/opt/oradata/GIS/下创建SDE文夹。
其中,EXTENT MANAGEMENT LOCAL是指本地管理方式,UNIFORM 是指对于一个表来说,每次增加分配的空间大小(extent的大小)。
而NEXT是指对于tablespace来说,每次空间不够的时候再次分配的大小。
这里有一段话,可以表明这两者的一些区别:
“每次分配extent时是一个消耗资源的操作,当然是分配次数越少越好。在有些情况下,这也会直接影响性能。例如,在执行批量插入时,如果你的 extent太小,很快就要用完,就得再分配下一个,这时insert进程就只能等待系统去分配下一个extent.在这种情况下分配大一点的 extent会有助于提高性能。另外一点是extent是由连续的block组成的,extent大的话,数据存放会比较集中。这对于顺序读可能有利,但对于随机读则不见得有什么好处。并且现在数据文件基本上都是放在存储上,存储已经把空间分散到不同的磁盘上了。即使在oracle看来是连续的空间,在存储上实际也可能是分散的。
如果你的表确实很大,那就分配大一些的extent,如果表比较小就分配小一些的extent.”
我的理解是,如果tablespace的空间不足了,那么分配NEXT标明的大小。在tablespace空间足够的情况下,在往tablespace中的table里插入数据的时候,如果一次插入的数据大于UNIFORM的值,那么就需要再次分配UNIFORM规定的大小。
所以,如果每次插入的数据量比较大,那么可以考虑UNIFORM的值大一些。
SEGMENT SPACE MANAGEMENT应当设置为AUTO,这个网页http://www.databasejournal.com/features/oracle/article.php/1576991
阐述了为什么设置成AUTO的好处。
其余参数可以参看Oracle的说明,这里推荐一个网页:http://www.psoug.org/reference/tablespaces.html
同时,这里有两幅Oracle提供的图,能够很清楚的看出如何创建和修改tablespace。
创建tablespace:
修改tablespace:
ii. 创建sde用户。
使用sqlplus,创建的sql语句是:
CREATE USER sde
IDENTIFIED BY 你的密码
DEFAULT TABLESPACE sde
TEMPORARY TABLESPACE TEMP;
创建用户的sql语句很简单,关于其参数可以参看这个网页http://www.psoug.org/reference/user.html
3. 安装
a. 下载和解压
从http://support.esri.com/index.cfm?fa=downloads.patchesServicePacks.viewPatch&PID=19&MetaID=1155
下载ArcSDE 9.1 for Oracle10gR2,如果你还想打补丁,那么也在附近的网页找找,下载相应的补丁文件。
打补丁的方法本文不涉及,非常简单,稍微看一下就会了。
解压下载的sde91-ora10gR2-lx.tar.Z文件,由于ubuntu没有compress命令,所以不能用tar Zxvf xxx.tar.Z解压。
应当先uncompress sde91-ora10gR2-lx.tar.Z得到sde91-ora10gR2-lx.tar文件
然后再tar xvf sde91-ora10gR2-lx.tar 即可。
貌似也可以用gunzip解压,请参看其manual查阅解压参数。
解压之后会得到安装文件以及一些必要的文档,其实参看这些附带的文档就可以很好的完成安装,不必看我这篇文章。
b. 安装
进入解压之后的文件夹
cd linux/oracle10g/
运行
./install -load
如果你的LANG环境变量不是英语,那么就会出现一个提示,然你看目前显示的语言是否可以读(不是乱码),我的local设置的是zh_CN.UTF-8
所以出来乱码,我也不知道怎么能让显示中文正常,所以就输入no,用英文显示。
首先需要同意license,必然是yes。
接下来需要注意的是选择CD-ROM 挂载点,因为ArcSDE默认为是从光驱安装的,所以,在这里只要输入ArcSDE安装文件所在的位置就可以了。
我的是/home/sde/linux/oracle10g。
接下来输入要安装的位置,我的是/home/sde
然后接下来自己看自己需要的选择,因人而异,我一路回车下来的。
如果在安装的过程中,想回到上一个选项,那么输入'^'。
之后在/home/sde下面有sdeexe91文件夹,里面是安装的文件。
4. Post Installation
也即安装完成之后到启动服务之前的配置。
a. 设置SDE的配置文件。
修改/etc/services文件,加入:
esri_sde 5151/tcp # ArcSDE service on pinetree
但是对于ubuntu来说,5151这个端口被占用了,如下:
pcrd 5151/tcp # PCR-1000 Daemon
那么可以修改pcrd的端口,也可以修改sde的端口。在这里,我们修改pcrd的端口号为5152。
sde的服务名称为esri_sde,也可以改为别的,我们这里就用它。
同时修改$SDEHOME/etc/services.sde,也加入:
esri_sde 5151/tcp # ArcSDE service on pinetree
同时还可以根据需要修改$SDEHOME/etc下的其他文件。
dbinit.sde #正如前面提到的,这个文件下的参数会覆盖掉.profile或者.cshrc文件下的参数。设置的方法是set (variablename)=(value)
giomgr.defs #这个文件定义了sde服务器如何运行的一些参数,默认的参数在大部分情况下已经够用了。
#如何设置,请参阅ArcSDE Configuration and Tuning Guide for Oracle(安装包里附带的一个pdf文件)。
#在执行了sdesetupora10g命令之后,这个文件里的参数会被读入数据库,生成一个名为server_config的表。
#如果想要在运行了sdesetupora10g命令之后修改参数,请参阅sdeconfig命令。
dbtune.sde #这个文件定义了数据库中表的物理存储参数。同样参阅ArcSDE Configuration and Tuning Guide for Oracle文档。
#运行了sdesetupora10g命令之后,这个文件里的参数会被读入数据库,生成一个名为dbtune的表。
#如果想要在运行了sdesetupora10g之后修改参数,请参阅sdedbtune命令。
#sdeconfig命令和sdedbtune命令都可以在ArcSDE Administration Command Reference(安装包里附带的html和chm文件)中找到详细说明。
b. 修改数据库执行权限。
用sqlplus登录数据库,运行下面的命令:
grant execute on dbms_pipe to public;
grant execute on dbms_lock to public;
同时还需要修改数据库中sde用户的权限,需要给它加入下面的权限:
ALTER ANY INDEX
ALTER ANY TABLE
ANALYZE ANY
CREATE ANY INDEX
CREATE ANY PROCEDURE
CREATE ANY SEQUENCE
CREATE ANY TRIGGER
CREATE ANY VIEW
CREATE SESSION
CREATE TABLE
CREATE PROCEDURE
CREATE SEQUENCE
CREATE TRIGGER
DROP ANY INDEX
DROP ANY TABLE
DROP ANY VIEW
DROP ANY PROCEDURE
DROP ANY SEQUENCE
EXECUTE ANY PROCEDURE
SELECT ANY SEQUENCE
SELECT ANY TABLE
UNLIMITED TABLESPACE
具体的命令是:
GRANT ALTER ANY INDEX TO sde ;
GRANT ALTER ANY TABLE TO sde ;
GRANT ANALYZE ANY TO sde ;
GRANT CREATE ANY INDEX TO sde ;
GRANT CREATE ANY PROCEDURE TO sde ;
GRANT CREATE ANY SEQUENCE TO sde ;
GRANT CREATE ANY TRIGGER TO sde ;
GRANT CREATE ANY VIEW TO sde ;
GRANT CREATE SESSION TO sde ;
GRANT CREATE TABLE TO sde ;
GRANT CREATE PROCEDURE TO sde;
GRANT CREATE SEQUENCE TO sde ;
GRANT CREATE TRIGGER TO sde ;
GRANT DROP ANY INDEX TO sde ;
GRANT DROP ANY TABLE TO sde ;
GRANT DROP ANY VIEW TO sde ;
GRANT DROP ANY PROCEDURE TO sde ;
GRANT DROP ANY SEQUENCE TO sde ;
GRANT EXECUTE ANY PROCEDURE TO sde ;
GRANT SELECT ANY SEQUENCE TO sde ;
GRANT SELECT ANY TABLE TO sde ;
GRANT UNLIMITED TABLESPACE TO sde ;
在安装完成之后,为了安全起见,还需要撤销sde用户的一些权限,如下:
REVOKE ALTER ANY INDEX FROM sde ;
REVOKE ALTER ANY TABLE FROM sde ;
REVOKE ANALYZE ANY FROM sde ;
REVOKE CREATE ANY INDEX FROM sde ;
REVOKE CREATE ANY TRIGGER FROM sde ;
REVOKE CREATE ANY VIEW FROM sde ;
REVOKE DROP ANY INDEX FROM sde ;
REVOKE DROP ANY TABLE FROM sde ;
REVOKE DROP ANY VIEW FROM sde ;
REVOKE DROP ANY PROCEDURE FROM sde ;
REVOKE DROP ANY SEQUENCE FROM sde ;
REVOKE EXECUTE ANY PROCEDURE FROM sde ;
REVOKE SELECT ANY SEQUENCE FROM sde ;
这步做不做都可,对于不同的应用,个人有不同的选择。
c. 执行sdesetupora10g命令。
这个命令的作用是在数据库中生成相应的地理信息数据表,以及一些元数据表,同时设置ArcSDE存储的方式等。
要启动sde服务,这个命令必须执行成功。
sdesetupora10g的执行参数是:
-?
-h
-o upgrade [-H (sde_directory)] [-u (DB_Admin_user)] [-p (DB_Admin_password)] [-D (database)] [-s datasource] [-l (key)] [-N] [-q]
-o list [-H (sde_directory)] [-u (DB_Admin_user)] [-p (DB_Admin_password)] [-D (database)] [-s datasource] [-q]
-o install [-H (sde_directory)] [-u (DB_Admin_user)] [-p (DB_Admin_password)] [-D (database)] [-s datasource] [-l (key)] [-N] [-q]
-o update_key -l (key) [-u (DB_Admin_user)] [-p (DB_Admin_password)] [-D (database)] [-H (sde_directory)][-s datasource] [-N] [-q]
我们这里是第一次执行,而且是安装,所以用-o install参数。-o list参数列出所安装的ArcSDE版本。
这个命令的详细信息可参看ArcSDE Administration Command Reference。
运行命令:
sdesetupora10g -o install -u sde -p 你的密码
如果最后显示Successfully installed ArcSde.
那么恭喜你,最重要和最困难的一步完成了。
5. 认证
ArcSDE是收费软件,那么必然需要一个认证文件来确保你是正确合法的购买的ArcSDE,而且正确的使用。
对于我们中国人来说,对外国的版权费早在清朝的时候已经交过了,所以放心的使用“盗版”吧,不过不要让他们发现就好。
认证文件是一个.ecp文件,要用sdesetupora10g命令的-o update_key参数来注册。
其实也可以在上面安装的一步,-o install的时候,附加上-l参数来注册。
命令是:
sdesetupora10g -o update_key -l 你的.ecp文件 -u sde -p 你的密码
6. 启动ArcSDE服务
命令sdemon -o start
会让你输入
Please enter ArcSDE DBA password:
输入相应密码。
如果显示:
ArcSDE Instance esri_sde started Mon Jul 14 21:53:54 2008
而且sdemon -o status
显示的是Accepting Connections
那么恭喜你,服务已经启动了。
如果要设置随着机器自动启动,那么创建sde.sh文件,加入下面的内容:
#!/bin/sh
#
SDEHOME=/home/sde/sdeexe91
SDE_OWNR=sde
ORACLE_HOME=/opt/oracle
#
#
if [ ! -d $SDEHOME ] || [ ! -f $SDEHOME/bin/sdemon ]
then
echo "ArcSDE startup: cannot start"
exit 1
fi
#
case "$1" in
start)
#ArcSDE startup
echo -n "Starting ArcSDE: "
su $SDE_OWNR -c "export ORACLE_BASE=/opt/oracle &&
export SDEHOME=/home/sde/sdeexe91 &&
export ORACLE_HOME=/opt/oracle &&
export ORACLE_SID=GIS &&
export PATH=$SDEHOME/bin:$ORACLE_HOME/bin:$PATH &&
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$SDEHOME/lib:/usr/lib:/lib:$LD_LIBRARY_PATH:$ORACLE_HOME/lib/stubs &&
$SDEHOME/bin/sdemon -o start -p gis123"
touch /var/lock/sde
echo "OK, Started"
;;
stop)
#ArcSDE shutdown
echo -n "Shutdown ArcSDE: "
su $SDE_OWNR -c "export ORACLE_BASE=/opt/oracle &&
export SDEHOME=/home/sde/sdeexe91 &&
export ORACLE_HOME=/opt/oracle &&
export ORACLE_SID=GIS &&
export PATH=$SDEHOME/bin:$ORACLE_HOME/bin:$PATH &&
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$SDEHOME/lib:/usr/lib:/lib:$LD_LIBRARY_PATH:$ORACLE_HOME/lib/stubs &&
$SDEHOME/bin/sdemon -o shutdown -p gis123"
rm -f /var/lock/sde
echo "OK, Stopped"
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: $0 start|stop|restart"
exit 1
;;
esac
exit 0
然后:
chmod 755 sde.sh
sudo cp sde.sh /etc/init.d/
sudo update-rc.d sde.sh defaults 99
就可以了。
7. 卸载
卸载ArcSDE很简单。
首先停止服务:
sdemon -o shutdown
然后删除$SDEHOME文件夹:
rm -R $SDEHOME
最后删除掉/etc/services里相应的服务项,就可以了。
8. 其他
这里稍微提一下升级的事情,也就是打补丁的事情。
ESRI官方网站上到目前提供的是ArcSDE9.2的补丁,那么去下载了,然后参照网站上的说明做,就可以了。
这里需要注意的是,如果升级,那么还需要给sde添加前面提到的权限才可以。
本文未经许可禁止一切商业用途,有任何问题请联系thelastender@gmail.com
ubuntu 安装orcale 10g
本文描述在Ubuntu 8.04下安装Oracle 10gR2的方法,应该对于Ubuntu6.06以上的版本,安装都是没有什么问题的。
但是仍然推荐8.04版,比之前的版本有了很大幅度的提高。
1. Oracle需要有X系统,如果你没有的话,那么就安装一个你需要的X系统,我安装的Ubuntu 8.04 Desktop版本,所以用的是GNOME。如果你安装的是server版,那么可以安装fluxbox之类的轻量X系统,说句题外话,我个人还是倾向于FVWM,曾经在FreeBSD下配置了一个非常不错的FVWM,但是由于年代久远,当时的东西没有留下来,现在也没有那个时间和精力去配置,所以一直是一个遗憾。
2. 需要安装的软件以及一些配置
sudo apt-get install gcc make binutils libmotif3 lesstif2 libaio1 gawk libc6 libc6-dev alien rpm libstdc++5 sun-java6-jre gcc-3.3-base build-essential autoconf automake1.9
如果空间足够,那么可以考虑安装java-jdk。
或许不需要这么多,我是这么装的,各位可以试验一下究竟都需要什么。
安装完成之后,需要做一些修改。
sudo ln -s /usr/bin/rpm /bin/rpm
sudo ln -s /usr/bin/basename /bin/basename
sudo ln -s /usr/bin/awk /bin/awk
然后创建/etc/redhat-release,因为Oracle需要安装在获得其认证的Linux发行版上,Redhat是其中之一,那么就需要让它认为Ubunut是Redhat。
内容是Red Hat Linux release 3.1 (drupal)
你写成Red Hat Linux release 4.1 也可。
3. 创建Oracle用户和安装路径
sudo groupadd oinstall
sudo groupadd dba
sudo groupadd nobody
sudo useradd -g oinstall -G dba,admin -d /home/oracle -s /bin/bash -m -k /etc/skel oracle
oracle用户是admin的组员的原因是为了使之可以使用sudo命令。
为Oracle用户设置密码
sudo passwd oracle
创建安装和运行Oracle的文件夹。
sudo mkdir -pv /opt/oracle
sudo mkdir -pv /opt/oradata
sudo chown -R oracle:oinstall /opt/ora*
sudo chmod -R 755 /opt/ora*
4. 对系统进行调整,满足安装Oracle的条件。
修改/etc/sysctl.conf,加入下面的代码
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
然后运行
sudo /sbin/sysctl -p
修改/etc/security/limits.conf,加入
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
修改/etc/profile (如果你用的是bash的话)
if [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
umask 022
fi
注意:这里稍微解释一下umask的功能,umask的作用是决定你创建的文件或目录的缺省权限。
umask使用的对于目录的最大的权限是777,即rwxrwxrwx;而对于文件最大的权限是666,即rw-rw-rw- ;
如果我们运行命令:umask 033,则033与目录的最大权限值777进行异或运算,所以建立的新目录缺省权限为:744 ,即rwxr--r--。
而对于新建立的文件则是033与文件的最大权限值666进行异或运算,所建立的新文件的缺省权限为:644 ,即rw-r--r--。
简单的说,公式就是:对于文件夹777-umask,对于文件666-umask。
那么由于文件的最大权限是666,则可以看出,对于文件的执行权限(即x权限)使用umask命令是无法使其起作用的。
系统强制关闭文件的x缺省执行权限。如果想使文件有运行权限,只能由 chmod 命令进行设置。
检查/etc/services,确保没有使用1830到1849的端口号。
5. 配置Oracle用户的环境变量
以oracle用户登录,或者在终端下 su oracle。
这时候可能遇到No protocol specified的问题。解决方法是用root用户登录(su root),然后运行xhost +
或者直接退出当前用户的X,用oracle登录。
修改.bashrc文件,加入
umask 022
export ORACLE_BASE=/opt/oracle
export ORACLE_HOME=/opt/oracle
export ORACLE_SID=GIS #这个改成自己想要的即可
export PATH=$ORACLE_HOME/bin:$PATH
然后source .bashrc
建议使用英文环境来安装,防止乱码
export LANG="en_US.UTF-8"
export LANGUAGE="en_US:en"
6. 安装
将下载的Oracle 10g安装文件解压,进入解压后的目录
./runInstaller
然后就开始安装了,最好选择Advanced 方式安装,便于选择一些配置参数。
接下来的选项就因人而异了,最后有一个选择privilege operation system 的什么选项,然填一个oracle用户所在的组,我填的admin。
下面的图是数据库创建完成之后的图片:
最后会跳出让你执行orainstRoot.sh和root.sh的窗口,打开一个终端,用root用户执行即可,执行完了之后回到这个窗口,点OK。
记下该有的URL,然后就可以退出安装程序了。
7. 启动
这时,oracle已经启动了,例如在浏览器里输入http://localhost:1158/em,则会显示出登录的界面。
输入用户名和密码,则登录进管理页面。
在命令行下输入sqlplus "sys/你的密码 as sysdba" 则可以登录。
那么,我们需要设置一个脚本,来使oracle之后能够正常启动。
vim oracle.sh
加入下面的内容:
#!/bin/bash
#
# Run-level Startup script for the Oracle Instance and Listener
#
# chkconfig: 345 91 19
# description: Startup/Shutdown Oracle listener and instance
ORA_HOME=/opt/oracle
ORA_OWNR=oracle
# if the executables do not exist -- display error
if [ ! -f $ORA_HOME/bin/dbstart ] || [ ! -d $ORA_HOME ]
then
echo "Oracle startup: cannot start"
exit 1
fi
# depending on parameter -- startup, shutdown, restart
# of the instance and listener or usage display
case "$1" in
start)
# Oracle listener and instance startup
echo -n "Starting Oracle: "
su $ORA_OWNR -c "export ORACLE_BASE=/opt/oracle &&
export ORACLE_HOME=/opt/oracle &&
export ORACLE_SID=GIS &&
export PATH=$ORA_HOME/bin:$PATH &&
$ORA_HOME/bin/lsnrctl start"
su $ORA_OWNR -c "export ORACLE_BASE=/opt/oracle &&
export ORACLE_HOME=/opt/oracle &&
export ORACLE_SID=GIS &&
export PATH=$ORA_HOME/bin:$PATH &&
$ORA_HOME/bin/dbstart"
#$ORA_HOME/bin/lsnrctl start
#$ORA_HOME/bin/dbstart
touch /var/lock/oracle
su $ORA_OWNR -c "export ORACLE_BASE=/opt/oracle &&
export ORACLE_HOME=/opt/oracle &&
export ORACLE_SID=GIS &&
export PATH=$ORA_HOME/bin:$PATH &&
$ORA_HOME/bin/emctl start dbconsole"
#$ORA_HOME/bin/emctl start dbconsole
echo "OK"
;;
stop)
# Oracle listener and instance shutdown
echo -n "Shutdown Oracle: "
su $ORA_OWNR -c "export ORACLE_BASE=/opt/oracle &&
export ORACLE_HOME=/opt/oracle &&
export ORACLE_SID=GIS &&
export PATH=$ORA_HOME/bin:$PATH &&
$ORA_HOME/bin/lsnrctl stop"
su $ORA_OWNR -c "export ORACLE_BASE=/opt/oracle &&
export ORACLE_HOME=/opt/oracle &&
export ORACLE_SID=GIS &&
export PATH=$ORA_HOME/bin:$PATH &&
$ORA_HOME/bin/dbshut"
#$ORA_HOME/bin/lsnrctl stop
#$ORA_HOME/bin/dbshut
rm -f /var/lock/oracle
su $ORA_OWNR -c "export ORACLE_BASE=/opt/oracle &&
export ORACLE_HOME=/opt/oracle &&
export ORACLE_SID=GIS &&
export PATH=$ORA_HOME/bin:$PATH &&
$ORA_HOME/bin/emctl stop dbconsole"
#$ORA_HOME/bin/emctl stop dbconsole
echo "OK"
;;
reload|restart)
$0 stop
$0 start
;;
*)
echo "Usage: $0 start|stop|restart|reload"
exit 1
esac
exit 0
注意,执行的时候,无论是./oracle.sh start|stop 还是sudo ./oracle.sh start|stop 都可以,因为已经export了环境变量了。
注意,这里的dbstart和dbshut都是为了给脚本用的,正确的方法是 sqlplus "sys/你的密码 as sysdba"
然后startup或者shutdown
那么,为了使dbstart和dbshut可以使用,需要修改/opt/oracle/bin/dbstart,
将ORACLE_HOME_LISTNER的值改为oralce的安装路径,在这里是/opt/oracle。
同时还需要修改/etc/oratab文件,将最后的那个N改成Y。
手动启动:
启动和停止监听:
lsnctl start
lsnctl stop
启动和停止数据库:
dbstart
dbshut
或者sqlplus "sys/你的密码 as sysdba"
startup
shutdown
启动和关闭企业管理器:
emctl start dbconsole
emctl stop dbconsole
如果需要启动的时候就运行,那么先
chmod 755 oracle.sh
同时需要将oracle.sh复制到/etc/init.d下面:
sudo cp oracle.sh /etc/init.d/
然后:
sudo update-rc.d oracle.sh defaults 97
经过总结,企业管理器启动和关闭都比较慢,所以可以在oracle.sh文件中注释掉相应的条目,然后启动之后手动打开即可。
OK,应该没有什么问题了。
本文未经许可禁止一切商业用途,有任何问题请联系thelastender@gmail.com
2008年5月1日星期四
一个关于字典排序的问题
题目是这样的:
现在有1,2,3,4,5,6,7,8,9,九个数,任意组合排成一个数,这个数中任两位都不一样,这些组合按照字典顺序排列,举例来说,123456789是第一个,123456798是第二个,123456879是第三个,依次下去,现在要求编写一个程序,问第i个数字是什么?
这个问题用到组合数学中的基本知识,无奈这个是计算机系的课程,电子系完全就不沾边,所以我当时也不可能答出来,现在,通过向Tarazed咨询,我写出下面的解法,这个解法是Tarazed告诉我的,非常感谢他,他的Blog在这里。
9个数的排列太多,我们先考虑123三个数字的排列,它们可能的排列如下:
123
132
213
231
312
321
那么,我们考虑其中每个数的百位和十位它右边的数比它小的个数,对于123来说,百位1右边是2和3,比它小的数的个数是0个,十位2右边是3,比它小的数的个数是0个,我们把这两个0几下来,作为一个中介数:00,和123结合起来写作:
123 00
那么相应,我们把剩下的数的中间数也写出来:
132 01
213 10
231 11
312 20
321 21
好,中间数都写完了,那么我们观察这些中介数的排列,我们可以看出,这些数是2进制的(逢二进一)0,1,2,3,……但是又和二进制不同,最高位可以是2,那么这种数在组合数学中是有专门名称的,叫做递增进位制数,它的特点是,从右向左,编号依次为第一位,第二位,第三位,……,第n位,而第n位的进位制是n+1进制,对应上面两位的数,第一位进位制是2进制,所以它最大是1,第二位进位制是3,所以它最大是2,那么我们根据这样的进位制,可以看出,这种中介数转化成十进制之后,就是0,1,2,3,4,5,那么这不就是我们要的第几个数吗?在组合数学中,证明了每一个中介数和相应的排列是一一对应的,那么,我们就可以根据要求的第几位数,得到它的中介数,然后进一步找到其对应的组合,而从第几位数推到中介数是很简单的,现在的问题,就是如何能通过中介数,得到相应得排列。
我们这次用1,2,3,4,四个数字的排列作为例子,我们先按照上面的方法,写出其排列对应的中介数,如下:
1234 000
1243 001
1324 010
1342 011
1423 020
1432 021
……
我们就写这么多,然后我们将4,3,2,1写下来:
4 3 2 1
————————
比如说我们得到的是021这个中介数,那么我们从左往右数021这个数,第一个得到的是0,那么我们从右往左数4321,数0个数,得到的是1,将其标记为1,因为它是我们第一个得到的,如下:
4 3 2 1
————————
1
数021,第二个得到的是2,那么我们还剩下432,从右往左数2位,得到的是4,那么我们把第二个得到的4标记为2,如下:
4 3 2 1
————————
2 1
再数021,第三个得到的是1,那么我们还剩下32,从右往左数1位,得到3,标记为3,如下:
4 3 2 1
————————
2 3 1
最后剩下的2我们标记为4,如下:
4 3 2 1
————————
2 3 4 1
下面的一行,是得到的排列序号,我们按照下面一行的序号1234,写出对应的上面一行的数,1对应的1,2对应的4,3对应的3,4对应的2,写出来如下:
1432
这个数正好是中介数021对应的排列。
通过中介数的生成和反推排列,我们解决了这个问题,我用C写了个小程序,输入要求的第i个数,得到相应的排列。
程序如下:
/* This program is written by Ender.
* If you have any question,please send email to thelastender@gmail.com
* File name: da.c
* Compile and Link: gcc -c da.c -o da.o && gcc da.o -o da
* */
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#define LENGTH 12
#define MAX_NUM 4000000000U
void getSISN(int * S, unsigned long n); //get the steadily increase scale number(得到递增进位制数,我只知道这么翻译了)
char TABLE[2][LENGTH] = { {'a','b','c','d','e','f','g','h','i','g','k','l'},
{0,0,0,0,0,0,0,0,0,0,0} };
int main(int argc,char * argv[])
{
if(argc < 2)
{
goto error1;
}
int l = strlen(argv[1]);
if(l > 10)
{
goto error2;
}
int i ;
unsigned long n = 0;
for(i=0;i
int c = argv[1][i];
if(isdigit(c))
{
n = n*10 + (c - 48);
if(l == 10 && i == 0)
{
if( (c-48) >= 4 )
{
goto error2;
}
}
}
else
{
goto error2;
}
}
fprintf(stderr,"You want to find the %luth arrange type.\n",n);
int S[LENGTH] ;
for(i=0;i
S[i] = 0;
}
getSISN(S,n);
fprintf(stderr,"The intermediary number is:\t");
for(i=(LENGTH-1);i>=0;i--)
{
fprintf(stderr,"%d ",S[i]);
}
fprintf(stderr,"\n");
i = LENGTH - 1;
while(S[i] == 0)
{
i--;
}
//fprintf(stderr,"i is %d.\n",i);
char * a = calloc(i+2,sizeof(char));
int len = i;
int k = 0;
int x = 0;
int y = 0;
for(i=len;i>=0;i--)
{
x = 0;
y = 0;
k = 0;
while(x < (S[i]+1))
{
if(TABLE[1][k] == 0)
{
x++;
}
else
{
y++;
}
k++;
}
a[i+1] = TABLE[0][x+y-1];
TABLE[1][x+y-1] = 1;
}
i=0;
while(TABLE[1][i] != 0 && i < l+2)
{
i++;
}
a[0] = TABLE[0][i];
fprintf(stderr,"Length is:\t%d.\n",len+2);
fprintf(stderr,"Result is:\t");
for(i=(len+1);i>=0;i--)
{
fprintf(stderr,"%c ",a[i]);
}
fprintf(stderr,"\n");
free(a);
goto successed;
error1:
fprintf(stderr,"Usage: %s [number]\n",argv[0]);
return 1;
error2:
fprintf(stderr,"error:\tInput format error\n");
fprintf(stderr,"error:\tThe biggest number supported is %u.\n",MAX_NUM);
fprintf(stderr,"error:\tand no other character\n");
return 2;
successed:
return 0;
}
void getSISN(int * S, unsigned long n)
{
int l = 0;
int k = 2;
unsigned long m;
m = n;
do
{
S[l] = m % k;
m = m / k;
l++;
k++;
}while(m != 0);
return ;
}
编译:
gcc -c da.c -o da.o && gcc da.o -o da
运行:
da [你要的第i个排列数]
这个程序并没有要求输入的时候指定位数,但是限制了最大的输入数字为3999999999,得到的结果如果不满足位数,那么将你所要的排列的最高n位(这里n是程序结果的位数),按照程序结果排列,把其他的位数按照从小到大排列在这n位前面即可,例如,如果你要求12345,五位数字的第5个排列,那么你运行程序 da 5,得到的结果是:
You want to find the 5th arrange type.
The intermediary number is: 0 0 0 0 0 0 0 0 0 0 2 1
Length is: 3.
Result is: c b a
然后你选出12345的高3位是345,按照c b a的顺序排列,是5 4 3,那么最后你要的12345的第五个排列是12543。
这篇文章包括程序版权归Ender所有,禁止商业用途,有任何问题联系thelastender@gmail.com
2008年4月30日星期三
如何在VMware Fusion下虚拟的Ubuntu Hardy 8.04中安装VMware Tools
Ubuntu 8.04(代号Hardy Heron)发布了,无奈我用的是MacBook,又不想Triple Boot,所以只好在VMware Fusion里安装Ubuntu,基本的安装很简单,我这里就不说了,那么我们进入正题,如何在安装好的Ubuntu里安装VMware Tools。
本文参考了Peter Cooper的Blog上的How to Install VMware Tools on Ubuntu Hardy 8.04 under VMware Fusion 以及ubuntuforum上的PabloCardoso的文章,在这里感谢他们的工作。
首先升级你的系统,安装build-essential以及内核头文件(这个好像默认已经安装),以及一些其他编译需要的文件,这些内容通过Google或者其他途径都能很容易找到,这里不再赘述。
点击VMware Fusion上面Virtual Machine->Install VMware Tools,然后将VMwareTools-version-tar.gz复制到桌面。
如果这个时候解压,安装的话,一般到运行vmware-config-tools.pl时,会出现类似如下的错误:
In file included from /tmp/vmware-config8/vmblock-only/linux/os.h:35,
from /tmp/vmware-config8/vmblock-only/linux/block.c:26:
/tmp/vmware-config8/vmblock-only/./include/compat_wait.h:78: error: conflicting types for ‘poll_initwait’
include/linux/poll.h:65: error: previous declaration of ‘poll_initwait’ was here
In file included from /tmp/vmware-config8/vmblock-only/linux/vmblockInt.h:40,
from /tmp/vmware-config8/vmblock-only/linux/block.c:29:
/tmp/vmware-config8/vmblock-only/./include/vm_basic_types.h:184: error: conflicting types for ‘uintptr_t’
include/linux/types.h:40: error: previous declaration of ‘uintptr_t’ was here
make[2]: *** [/tmp/vmware-config8/vmblock-only/linux/block.o] Error 1
make[1]: *** [_module_/tmp/vmware-config8/vmblock-only] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-2.6.24-16-generic’
make: *** [vmblock.ko] Error 2
make: Leaving directory `/tmp/vmware-config8/vmblock-only’
Unable to build the vmblock module.
总之是不能根据内核生成相应的模块,那么我们采取如下措施:
sudo apt-get install build-essential libgtk2.0-dev
sudo apt-get install libproc-dev libdumbnet-dev xorg-dev
cd Desktop/
wget http://mesh.dl.sourceforge.net/sourceforge/open-vm-tools/open-vm-tools-2008.04.14-87182.tar.gz
上面这步是安装一些编译需要的文件,同时下载最新的open-vm-tools。
接下来,解压:
tar xzvf VMware*.gz #如果你已经解压了之前的VMwareTools-version.tar.gz,那么这步可以不做
#但是建议将之前的删掉,重新执行这步
tar xzvf open-vm-tools*.gz
然后编译生成相应的模块:
cd open-vm-tools-2008.04.14-87182/
./configure && make
cd modules/linux/
在modules/linux/文件夹里,我们有vmblock, vmhgfs, vmmemctl, vmsync 和 vmxnet 模块,我们把它们打包,替换掉VMwareTools原来的模块:
for i in *; do mv ${i} ${i}-only; tar -cf ${i}.tar ${i}-only; done
cd ../../..
mv -f open-vm-tools-2008.04.14-87182/modules/linux/*.tar vmware-tools-distrib/lib/modules/source/
然后我们运行VMwareTools的安装程序,一路回车下去(除非你知道你在做什么):
cd vmware-tools-distrib/
sudo ./vmware-install.pl
当这个完成之后,重启Ubuntu,包括网络,显卡,hgfs(共享文件),主机向客户机拖拽文件等功能都可以使用了。
现在还剩下一个问题,就是Mac上,两个手指在触摸板上滑动是滚动页面,在Ubuntu客户机里却不行,那么,我们在重启Ubuntu之前,修改/etc/X11/xorg.conf文件,把其中相应的部分改成如下的样子:
Section "InputDevice"
Identifier "Configured Mouse"
Driver "mouse"
Option "Protocol" "IMPS/2"
Option "CorePointer"
Option "Device" "/dev/input/mice"
EndSection
然后保存,这时重启,那么所有的功能都没有问题了。
本文由Ender在2008年5月1日凌晨完成,禁止用作商业用途,有问题请联系thelastender@gmail.com
Nokia手机主题制作
今天左右无事,学习了一下Nokia的主题制作,我的手机系统是S40的,本想去下载网上流传的Nokia Series 40 Theme Studio 2.2,但是去http://www.forum.nokia.com看了一下,发现并没有下载,这样子找了好半天,才发现有一个称作Carbide.ui 3.2 Theme Edition的东西,点这里可以下载,看了好久,才发现Nokia 好像没有再发布Series 40 Theme Studio,而是用这个Carbide.ui Theme Edition取代了它,而且它支持S40系统,所以我就下载了它。
下载很快,安装之后,打开发现和Eclipse惊人的像,这才明白这个玩意是怎么做出来的,不过做的也和Eclipse一样,很友好,又充满了可自己定制的挑战,所以花了一段时间研究了一下,制作主题很简单,看它自带的说明就可以完成,我给自己的手机做了个主题,下面的图就是:
我只是改了一些基本的参数,没有做一些深层次的改变,它还支持程序图标,动画切换等的修改,总之很好很强大,实际装上主题之后发现很不错,等之后有空,做一个很强大的主题。
另外,我还研究了一下Nokia的主题文件.nth,其实就是一个zip压缩文件,里面主要的就是一个theme.xml文件,其他的都是这个文件引用的资源,这个文件形如下面:
一开始用一个xml30.dtd定义了文档类型,而30估计就是S40第三代用户界面的意思,这个xml30.dtd应该在所有S40第三代用户界面的手机上都有,而下面的Untitiled-1.jpg是我添加的文件,qgn_bg_sk_left.png则应该也是所有S40系统上都有的文件了。那么可以根据这些信息写一个自己的主题制作软件,也并不是不行。
算是对Nokia的S40主题制作有了一些浅显的了解了,S60没用过,所以也不想去尝试,就像前面说的,之后有空,好好做一个完整的主题。