|
2007年3月5日
RedHat Linux操作系统修改时区的方法
Most
modern Linux distributions have user-friendly programs to set the
timezone, often accesible through the program menus or right-clicking
the clock in a desktop environment such as KDE or GNOME. Failing that
it’s possible to manually change the system timezone in Linux in a few
short steps.
It’s possible to change the system timezone in Linux in a few short steps.
Steps
1. Logged
in as root, check which timezone your machine is currently using by
executing `date`. You’ll see something like “Mon 17 Jan 2005 12:15:08
PM PST -0.461203 seconds”, PST in this case is the current timezone.
2. Change
to the directory to /usr/share/zoneinfo, here you will find a list of
time zone regions. Choose the most appropriate region, if you live in
Canada or the US this directory is the “Americas” directory.
3. If
you wish, backup the previous timezone configuration by copying it to a
different location. Such as `mv /etc/localtime /etc/localtime-old`.
4. Create
a symbolic link from the appropiate timezone to /etc/localtime.
Example: `ln -s /usr/share/zoneinfo/Europe/Amsterdam /etc/localtime`.
5. If
you have the utility rdate, update the current system time by executing
`/usr/bin/rdate -s time.nist.gov`. (This step can be skip!)
6. Set the ZONE entry in the file /etc/sysconfig/clock file (e.g. “America/Los_Angeles”)
7. Set the hardware clock by executing: ` /sbin/hwclock –systohc`
Tips
· On
some versions of RedHat Linux, Slackware, Gentoo, SuSE, Debian, Ubuntu,
and anything else that is “normal”, the command to display and change
the time is ‘date’, not ‘clock’
· On
RedHat Linux there is a utility called “Setup” that allows one to
select the timezone from a list, but you must have installed the
‘redhat-config-date’ package.
Warnings
· Some applications (such as PHP) have separate timezone settings from the system timezone.
· On
some systems, /etc/localtime is actually a symlink to the appropriate
file under the /usr/share/zoneinfo directory (rather than a copy of
that file).
· On
some systems, there is a system utility provided that will prompt for
the correct timezone and make the proper changes to the system
configuration. For example,Debianprovides the “tzsetup” utility.
Here is an example of changing the timezone: (Logged in as root)
In order to manually change the timezone, you can edit the /etc/sysconfig/clockfile and then make a new soft link to /etc/localtime. Here is an example of changing the timezone manually to “America/Denver”:
1. Select the appropriate time zone from the /usr/share/zoneinfo directory. Time zone names are relative to that directory. In this case, we will select “America/Denver”
2. Edit the /etc/sysconfig/clocktext file so that it looks like this:
ZONE=”America/Denver”
UTC=true
ARC=false
Of course, this assumes that your hardware clock is running UTC time…
3. Delete the following file: /etc/localtime (backup it when you need it !)
4. Create a new soft link for /etc/localtime. Here is an example of step 3 and step 4:
# cd /etc
# ls -al localtime
lrwxrwxrwx 1 root root 39 Mar 28 07:00 localtime -> /usr/share/zoneinfo/America/Los_Angeles
# rm /etc/localtime
# ln -s /usr/share/zoneinfo/America/Denver /etc/localtime
# ls -al localtime
lrwxrwxrwx 1 root root 34 Mar 28 08:59 localtime -> /usr/share/zoneinfo/America/Denver
# date
Fri Mar 28 09:00:04 MST 2003
针对中国时区,修改操作如下
1. 修改文件 /etc/sysconfig/clock内容:
ZONE=Asia/Shanghai
UTC=false
ARC=false
2. rm /etc/localtime
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
还有其他方法修改时区,不过是基于图形化界面的命令: tzselect 、 timeconfig
本文为镜像,原贴在此:http://www.btk4ever.com/?p=10443
朋友搬到个新地方,没有宽带了,但是能收到些加密的无线网络,挺想蹭网的,本人由于是所谓“挨踢”人士,自当义不容辞出手相助。
我也只是想了解下WEP破解这事,目的也只是提醒大家一下要加强无线网络安全,千万不要干啥非法的事情,当然有本事的话,就把屁股擦干净。
其实前两年我就知道WEP加密是极不安全的,而且也出于好奇做过密钥破解的尝试,但是由于破解软件特别挑网卡,结果自然就是半途而废了。这次到网上
再度查了点相关资料,发现这事情已然变得相当的简单了,基本上只需要 BackTrack3 就可以搞定了。Backtrack
是一个黑客操作系统,其实也算是一个linux的黑客版,主要是安装了很多实用的软件和黑客工具,偏向于安全侵入方面的。
我是下载了一个BackTrack3
的usb版本,并且下了最新的扫描工具spoonwep2,系统自带的是spoonwep也能用,但是据说新版更好使,更方面。整个过程挺简单的,机器设
置成usb可引导启动,然后启动进入usb上的BackTrack系统,都是图形界面的,打开spoonwep2工具,扫描周围的无线信号,选择信号强
的,有客户端连接,并且DATA包比较多的信号来破解吧,这样应该可以快点,据说XX分钟就能破解了。没有客户端连接的无线信号,据说有些AP也是同样可
以破解的,无非是攻击方式的变化以及花费的时间更长而已。
我的经历是,晚上10点多开始破一个无线信号,等了一个多小时,进度开始变缓慢,因为本来连着的两个客户端下线了,估计困搞去了…,很无奈,我也不
能傻等,只得也睡觉去了。第二天早上起来,1o点多的时候,才抓满了要求的数据包,整个密钥破解过程倒是瞬间完成,然后我看到的密码是”1111111″
,囧
rz,看来设无线密码的人都很懒。这个过程还是挺漫长的,可能是没选择对正确的攻击方式,导致数据包获取的过程很长。假如有客户端在BT下载,估计快很
多,要是只是qq聊天,那就要耗很久了。不过整个过程,已经相当的傻瓜化了。
这事也不能说的太细,想了解详细的人,网上查去吧,顺便提供一个教程。
至于如何加强无线安全,有这么几点(网上找的)
如果你需要你的AP很难被破解,建议:
1)用WPA 加密方式,并且使用不可能被字典猜到的密码,目前还是基本可靠的
2)如果只支持 WEP加密,那么,尽量考虑用隐藏 SSID的方式,这样可以增加破解难度
3)如果只支持 WEP加密,那么,可以考虑使用中文名字作为SSID,这样基本问题不大。
4)一般破解时候,大家都会选择常用的频道,例如 6频道,
第三步显示频道的时候,你的AP也会被列出来,那么第一个目标失败的时候,黑客往往会选择第二个容易下手的目标, 但是如果你选择了8、
4、这些奇怪的频道,那么狠客往往懒得重新进入该频道的监控模式,你就可以逃过一劫。不过, 某些廉价AP,往往对6
频道做了优化,这个频道信号最强….这就没办法了。
5)有空换换你的密码:)
还有其他几点也可以做,如减低信号、关闭DHCP、MAC地址绑定,当然这些措施也只是增加难度而已。
最后提一下,蹭网是有风险的,无线信号不加密的,人家未必就是大善人或者菜鸟,而且还有人专门钓鱼的,加大信号,设置简单密码,专门等蹭网的人来,数据包一抓,等着被玩吧。
本文为镜像,原贴在此:http://www.btk4ever.com/?p=10423
考虑把Live Space的日志转移到Wordpress
架的blog去,郁闷的是Live
Space并不支持通用的导出格式,要是一条条日志复制过去的话,这工作量也实在是够吓人的。只好到网上找解决办法了,真搞不定的话,只能放弃Live
Space的日志了。结果很不幸,被我找个一个Live Space Mover的工具,很华丽的搞定了动迁的工作。在此向作者Wei
Wei致敬了,随便介绍推广一下。
Live Space Mover 工具的说明在这里:http://b2.broom9.com/?page_id=519
这个工具是通过Python脚本抓取live space的日志和留言,保存为wordpress支持的通用xml文件。最后将文件通过wordpress后台管理提供的导入功能,将日志迁移过去。
具体操作步骤就参照作者blog里的user guide,非常详细的。
大致过程是这样:
1.安装Python的环境,并下载Beautiful Soup的类库
2.Google Code下载最近的Live Space Mover 工具(几个python脚本)
3.按照作者的要求,对space进行设置,主要是开放访问权限和设置日期格式
4.命令行方式执行脚本,开始日志抓取(脚本参数参照user guide)
–如执行过程出现超时或者假死情况(我都碰到了…),关闭重新执行脚本即可,工具有cache文件,会从断点开始继续的
5.将生成的xml文件导入wordprss
工具目前还有一点瑕疵,下面这段话来自作者的blog,关于目前工具无法解决问题的说明,看来又是live space的怨念。
After the live space updates in Dec 2008 (live space mover version 1.7), there are some limitations for comments, including:
1. can’t get the accurate time of comments, sometimes even incorrect;
2. can’t get the email and url of comment authors.
These are both due to the ridiculous design of Live Space. If you have any idea about how to solve these 2 problems, please let me know.
本文为镜像,原贴在此:http://www.btk4ever.com/?p=10025
已部署的一个JAVA程序最近需要改成定期执行,于是就放到crontab调度,结果遇到了中文乱码问题。脚本在shell环境下直接运行没有问
题。到网上收了一下,碰到这个问题的还真不少,结论是crontab执行时不会携带用户的环境变量,缺失一些系统变量。需要在脚本里额外添加缺失的环境变
量,针对中文问题,需要声明 LANG参数
在脚本开头增加:
LANG=”zh_CN.GB18030″
export LANG
由于是中文问题,设置的编码要和系统设置的一致,具体可以到/etc/sysconfig/i18n 查看对应的环境变量
本文为镜像:原帖在此: http://www.btk4ever.com/?p=10040
据说在oracle 10g的版本,在数据库实例正常启动open的情况下,直接通过命令类似" drop database 'dbname'
"这种方式就可以删除一个数据库实例。
这里说的是oracle 9i的情况下,不依赖其他工具的情况下,手工删除一个数据库实例。
操作步骤为网上查来的,并经过我验证通过,操作之前请确保该实例已经被停止,具体步骤见下:
========================
To delete a database,
First:
Select "rm -f "||name
from v$controlfile
union
select "rm -f "||name from
v$datafile
union
select "rm -f "||member from v$logfile;
Second:
Clean up above
output & make it executable
Third:
If installation
follows OFA standard:
remove directory $ORACLE_BASE/admin/$ORACLE_SID
Fourth:
Delete archive log
directory (if archive mode)
============================
找一篇靠谱的教程来跟着做,是相当重要,不然就会吃药,网上文章都是抄来抄去的,不然怎么死的都不知道个。
我比较衰,找了一篇不是很靠谱的来做,结果越到了不少小问题。
关于手工建库,参照下面两篇,应该是比较靠谱的。
===============================================
Red Hat Enterprise 3 + Oracle 10g
Release 2
$su – oracle
1--- 设置系统环境变量:
ORACLE_HOME=/opt/oracle/product/10.2
ORACLE_BASE=/opt/oracle
ORACLE_SID=dbtest
......
2--- 系统规划:
实例名称ORACLE_SID=dbtest
数据库名称DB_NAME=dbtest
3--- 手工创建如下目录:
/opt/oracle/admin/dbtest/cdump
/opt/oracle/admin/dbtest/bdump
/opt/oracle/admin/dbtest/udump
/opt/oracle/admin/dbtest/pfile
/opt/oracle/oradata/dbtest/
/opt/oracle/oradata/dbtest/archive
4--- 建立密码文件:
orapwd
file=/opt/oracle/product/10.2/dbs/orapwd_dbtest password=superman
5---修改参数文件:
格式:/opt/oracle/product/10.2/dbs/init.ora
实例:/opt/oracle/product/10.2/dbs/initdbtest.ora
内容如下:
---------------------------------------------------
dbtest.__db_cache_size=331350016
dbtest.__java_pool_size=4194304
dbtest.__large_pool_size=8388608
dbtest.__shared_pool_size=138412032
dbtest.__streams_pool_size=0
*._kgl_large_heap_warning_threshold=8388608
*.audit_file_dest='/opt/oracle/admin/dbtest/adump'
*.background_dump_dest='/opt/oracle/admin/dbtest/bdump'
*.compatible='10.2.0.1.0'
*.control_files='/opt/oracle/oradata/dbtest/control01.ctl','/opt/oracle/oradata/dbtest/control02.ctl','/opt/oracle/oradata/dbtest/control03.ctl'
*.core_dump_dest='/opt/oracle/admin/dbtest/cdump'
*.db_2k_cache_size=33554432
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=128
*.db_files=4000
*.db_name='dbtest'
*.db_recovery_file_dest_size=4294967296
*.db_recovery_file_dest=''
*.log_archive_dest='/opt/oracle/oradata/dbtest/archive'
*.log_checkpoints_to_alert=FALSE
*.open_cursors=300
*.parallel_execution_message_size=65535
*.parallel_max_servers=128
*.pga_aggregate_target=209715200
*.processes=150
*.recyclebin='OFF'
*.remote_login_passwordfile='EXCLUSIVE'
*.replication_dependency_tracking=FALSE
*.session_cached_cursors=100
*.sga_target=500m
*.shared_pool_size=100m
*.undo_management='AUTO'
*.undo_retention=0
*.undo_tablespace='UNDOTS'
*.user_dump_dest='/opt/oracle/admin/dbtest/udump'
*.workarea_size_policy='AUTO'
_allow_resetlogs_corruption=true
---------------------------------------------------
可将此文件复制到:/opt/oracle/admin/dbtest/pfile/init.ora
6---
登陆oracle:
> sqlplus “/ as
sysdba”
7---
启动实例:
SQL> startup nomount
pfile=/opt/oracle/admin/dbtest/pfile/init.ora
8---
创建数据库的脚本:
-----------------------------------------------------------
CREATE DATABASE
dbtest
LOGFILE
GROUP 1
('/opt/oracle/oradata/dbtest/redo01.log','/opt/oracle/oradata/dbtest/redo01_1.log')
size 100m reuse,
GROUP 2
('/opt/oracle/oradata/dbtest/redo02.log','/opt/oracle/oradata/dbtest/redo02_1.log')
size 100m reuse,
GROUP 3
('/opt/oracle/oradata/dbtest/redo03.log','/opt/oracle/oradata/dbtest/redo03_1.log')
size 100m reuse
MAXLOGFILES
50
MAXLOGMEMBERS
5
MAXLOGHISTORY
200
MAXDATAFILES
500
MAXINSTANCES
5
ARCHIVELOG
CHARACTER SET
UTF8
NATIONAL CHARACTER SET
UTF8
DATAFILE
'/opt/oracle/oradata/dbtest/system01.dbf' SIZE 1000M EXTENT MANAGEMENT LOCAL
SYSAUX DATAFILE
'/opt/oracle/oradata/dbtest/sysaux01.dbf' SIZE 1000M
UNDO TABLESPACE UNDOTS DATAFILE
'/opt/oracle/oradata/dbtest/undo.dbf' SIZE 500M
DEFAULT TEMPORARY TABLESPACE
TEMP TEMPFILE '/opt/oracle/oradata/dbtest/temp.dbf' SIZE
500M
;
-----------------------------------------------------------
9--- 运行如下文件(安装下面的先后顺序):
/opt/oracle/product/10.2/rdbms/admin/catalog.sql
/opt/oracle/product/10.2/rdbms/admin/catproc.sql
10--- 创建相关表空间与用户:
CREATE TABLESPACE USERS DATAFILE
'/opt/oracle/oradata/dbtest/users01.dbf' SIZE
1000M;---数据表空间
CREATE TABLESPACE INDX DATAFILE
'/opt/oracle/oradata/dbtest/indx01.dbf' SIZE
1000M;---在建立索引的时候把此表空间作为存储空间,即单独用一个表空间来存储索引,这是个好习惯,虽然我们没有办法建立一个默认的索引表空间!
CREATE USER test IDENTIFIED BY test DEFAULT
TABLESPACE users ;---测试用户
GRANT CONNECT,RESOURCE TO
test;
11--- 一点注意的地方:
1>.相关文件的目录要设置正确,有数据文件,控制文件,参数文件等,还有就是它们的位置要与控制文件中指定的要一致。
2>.init.ora中的undo_tablespace的名字必须要与create
database的相同,包括大小写等注意。否则很麻烦,报的错误你都不知道是不是在忽悠你!总之,一句话,控制文件中的内容要和init文件中的内容以及要和实际文件的实际情况要相同。
3>.分析数据库出错可以到/opt/oracle/admin/dbtest/bdump/alert_dbtest.log中查找。
===============================================
补充:
我碰到的一个问题,在普通用户sqlplus登录时,碰到下面的告警提示
Error accessing
PRODUCT_USER_PROFILE
Warning: Product user profile information not
loaded!
You may need to run PUPBLD.SQL as SYSTEM
请按照提示,以SYSTEM用户登入SQL*Plus,然后执行PUPBLD.SQL,这个文件通常在$ORACLE_HOME/sqlplus/admin目录中。
SQL>
@$ORACLE_HOME/sqlplus/admin/pupbld.sql
切割合并文件在linux下用split和cat就可以完成。下面举些实例进行说明。
1.文件切割
文件切割模式分为两种:
文本文件
二进制模式。
1.1文本模式
文本模式只适用于文本文件,用这种模式切割后的每个文件都是可读的。文本模式又分为两种:
按最大文件大小切割;
按文本行数切割。
1.1.1最大文件大小切割
split -C 5k duanxin split
将文本文件duanxin按每块最大5k的大小进行切割,不打碎行。输出文件名类似splitaa, splitab……
1.1.2 按文本行数切割
split -l 100 duanxin split
每个分块100行,不考虑大小。日志分析时应该有用。
1.2
二进制模式
split -b 5k duanxin split
每个分块(当然,最后一个不保证)大小都是5k,基本不可读。任何类型文件都可以用这种切割模式。
2.文件合并
cat split* >newduanxin
不管用什么方式切割,合并方法不变。
3.其它
split可以用-a选项指定输出文件名的长度。如
split -l 100 -a 3 duanxin
split
则输出文件出类似于splitaaa,splitaab。不指定时默认为2。
用-b或-C指定分块大小时,可用的单位有,b for
512bytes, k for 1Kbytes, m for 1 Megbytes.
参考资料
man split
-----------------------------------------------------------
找东西的时候发现网上都是讲这个的,就随手贴一下,据说分割还可以用DD命令
我的需求用split好像是搞不定的,希望从文本的指定行数进行分割,最终找到一个方法,见下:
sed -n '1001,2000p' ur-file
>newfile
随后就发现,sed超级有用,有兴趣的自己了解吧,附送一个介绍sed用法的文章:
今天晚上上网,打开网页都很困难,查了查发现开着BT,关掉以后就正常。
这种鸟事情,以前也碰到过,应该是TCP/IP并发连接数的问题,一查果然又被重置到了10。
昨天是10号,是微软每月发布安全补丁的日子,记得是有装补丁个,估计就是那个补丁搞得鬼了。
各位打了补丁的同志,去修改下系统连接数吧!
今天试图在gtalk上传个文件,捣腾半天也耍不起来,最后惊奇的发现,原来中文版的gtalk是被阉割过的,少掉了不少功能。话说,google.cn也就是谷歌,也是被阉割过的,在这个和谐的国度里,就算你输入google.com,你也去不了想去的地方,咱这里有伟大的GFW和DNS挟持。百度么,天生就阉掉的,谷歌至少还有行字“据当地法律法规和政策,部分搜索结果未予显示。”让你知道这玩意是太监,百度么看上去是个女人。
我并不是google饭,但是google有些服务我倒一直在用。gmail、gtalk、reader、bookmark、picasa,还有那个工具条,有些东西用起来还挺爽的。但是你一旦知道,你常用的东西,有些是被阉割过的,总会有点疙瘩个。当然,有些阉割不能怪罪我们伟大的和谐国,比如把gmail语言换成英文,就会多出选项个。
最后顺带提一下电影的阉割版,内地的剪刀手功力是相当的深厚,不仅可以把那玩意割掉,还不经意留下几个彩蛋,提升一下片子的深度,赞一记个。
最后的最后,问候一记GFW,上个月几个网站又上不去了,连sourceforge也走掉了,罪过罪过!
原帖地址在此:http://www.geektalks.cn/article.php?story=20080602125246318
用telnet发电子邮件的目的很多,我们暂且假设一番:如果你不幸落入恐怖份子之手,他们只有一台瘦得不行的电脑,总之除了telnet程序啥都没有,在恐怖份子去吃羊肉泡馍而疏于照看你的大好时机,你如何发电子邮件通知外界呢?
当然,首先你要有一个支持中继转发的SMTP的帐号,幸运的是,现在即使免费的邮箱也会提供这个。
假设你有一个geekx@126.com的邮箱,密码是xgeek,则会话如下:(红色的话是你要说的)
$ telnet smtp.126.com 25 # 25 为标准SMTP端口
Trying 220.181.15.111...
Connected to smtp.126.com (220.181.15.111).
Escape character is '^]'.
220 126.com Anti-spam GT for Coremail System (126com[071018])
helo 126.com # 打个招呼先
250 OK
auth login # SMTP需要认证
334 dXNlcm5hbWU6 # 这是个base64编码的明文,翻译过来是“username:"
Z2Vla3g= # base64编码的明文,翻译过来是“geekx"
334 UGFzc3dvcmQ6 # 这是个base64编码的明文,翻译过来是“password:"
eGdlZWs= # base64编码的明文,翻译过来是“xgeek"
235 Authentication successful
mail from:<geekx@126.com>
250 Mail OK
rcpt to:<superman@savetheworld.com> # 发给XXX
250 Mail OK
data #开始写信
354 End data with <CR><LF>.<CR><LF>
subject:Help!!
#这里空一行再写正文
The world is under attack,
Terrorists are eating yang—rou—pao—mo...
#写完信后空一行
. #写一个句点表示信的结束
250 Mail OK queued as smtp1,C8mowLC7fAy8GydISdAtCw==.834S2 1210522683
quit
221 Bye #SMTP小姐跟你说再见
Connection closed by foreign host.
那么,如何知道你的用户名和密码的base64编码呢?当然是预先要记在脑子里,如果实在记不下的话,用uuencode翻译一下吧:
$ echo -n 'geekx' | uuencode -m xxx # -m 指定 base64编码
begin-base64 664 xxx
Z2Vla3g=
====
好了,在恐怖份子吃完午饭回来之前,你已经成功地把信发给超人啦。
history|grep halt
cat .bash_history|grep halt
不同的系统history文件是不一样的,
一般是$HOME目录下
查找find / -name "*history"
主要是root及oracle下的
Redhat的root
/root/.bash_history
/var/log下呀
查看wtmp文件
who wtmp.n
一、一些重要的概念(关于Linux系统的一些重要特性)
由于我们用Windows太多,我就感觉我自己除了会点鼠标之外对于Windows系统没有太多的了解,甚至没有Linux多.
1、文件系统结构
2、文件类型
一切都是文件,包括普通文件、设备文件、目录等等
3、运行级别
Linux有6个运行级别
4、管道
5、重定向
6、交换分区
7、根目录下各个目录的意义
二、文本编辑
1、vi的用法
三、常用的命令
1、基本
包括:cd clear alias unalias date ls pwd man exit echo
2、文件管理
包括:cat more rm head tail grep cp mv wc find
3、目录管理
包括:mkdir rmdir rm find file du df
4、权限命令
如何设定我们用户和文件以及系统的权限。
包括:chmod chown chgrp umask
5、系统命令
包括:mount umount uname free env
uptime setup xinetd top kill 关机命令
5、常用的网络命令
关于网络管理以及使用的一些命令
四、安装与卸载(限于Redhat以及相似系统)
1、RPM命令
2、Oracle9i安装卸载以及基本管理
五、相关工具的命令
1、FTP
2、Telnet
六、常见的系统设置
1、运行级别
2、共享(NFS)
3、修改Swap
4、设定系统环境变量(JDK安装)
5、系统备份(打包、压缩以及解压缩)
6、常见的标志(权限:r w x s t 标志:l b c d)
七、Shell编程
1、Shell变量和参数
2、环境变量
3、位置参数
4、运算符
5、常用语句
6、函数
7、控制
8、运行方式
八、Linux安装
九、Crontab简单应用
以前的存档,源未知
1) 重启后生效
开启: chkconfig iptables on
关闭: chkconfig iptables off
2) 即时生效,重启后失效
开启: service iptables start
关闭: service iptables stop
需要说明的是对于Linux下的其它服务都可以用以上命令执行开启和关闭操作。
在开启了防火墙时,做如下设置,开启相关端口,
修改/etc/sysconfig/iptables 文件,添加以下内容:
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9000 -j ACCEPT
碰到了问题,找到了解决,存档一下
关键字: jdk 字符集 linux
原因:首先,JFreeChart和中文验证码的乱码问题和jsp的编码无关,是由于Java虚拟机找不到字体文件造成的,所以同类的Swing或者AWT的中文乱码问题也适用
环境:
JDK1.5(JDK版本很重要,如果是1.4.2版本的话,JRE目录下的字体配置文件不大一样)
RedHat4.0
Tomcat5.0
解决方法:
1.确认%JavaHome%/jre/lib/fonts目录下存在zysong.ttf
2.在%JavaHome%/jre/lib/fonts目录下执行"ttmkfdir -o fonts.dir"命令,重新生成fonts.dir文件
3.确认/usr/share/fonts/zh_CN/TrueType目录存在,如果不存在则mkdir创建
4.确认/usr/share/fonts/zh_CN/TrueType目录下存在zysong.ttf
5.在%JavaHome%/jre/lib目录下,执行 cp fontconfig.RedHat.3.properties.src fontconfig.properties
6.重新启动tomcat,大功告成!
需要下载zysong.ttf
Ctrl + Shift + T:打开类型:显示"打开类型"对话框来在编辑器中打开类型。"打开类型"选择对话框显示工作空间中存在的所有类型如类、接口等。
Ctrl + Shift + R:打开资源:打开"打开资源"对话框以打开工作空间中的任何资源。在Package Explorer中不必浏览文件便可快速打开任意一个文件。使用这个快捷键可以打开一个对话框,在里面输入你想查找的文件或者通配符既可。
Ctrl + O: 快速大纲:打开当前所选类型的轻量级大纲图。在一个文件中直接打开一个成员变量(如字段、方法),尤其是有许多类似的方法名的时候这个快捷键将变得非常有用。
Ctrl + L, 输入行数: 转至行:打开一个对话框,允许您输入编辑器应该跳至的行号。仅适用于编辑器。输入行号,可以快速跳转到源文件中的第N行,
Ctrl + Q:上一个编辑位置:显示上一个编辑操作的发生位置,返回到最近的修改位置。即使你查看不同的文件时,你也可以使用该快捷键来找到你最近对文件的修改位置。尤其是在文件比较大时,显得更为有用。
Ctrl + T: 快速类型层次结构:打开当前选择的类型的轻量级层次结构查看器,可以实现快速转到一个supertype或者subtype.
Ctrl + E:快速跳转到另外一个编辑器。注意Ctrl + F6也可以实现这个功能,在使用的时候可以注意一下他们的异同。
Ctrl + ./Ctrl +,:在一个文件中快速定位到一个问题(如错误、警告等)
Alt +← and Alt + →:来回跳转至你所查阅的文件
F3: 快速转到一个类型声明。同时也可以按住ctrl健并点击该超链接变量或者类或者你想查看的任何声明都可以。
更多
ctrl+space
alt+上下箭头
ctrl+alt+上下箭头
ctrl|+/
ctrl+d
以前碰到过,要tomcat开机启动的问题,后来用root用户启,但是风险很大
这次碰巧看到了解决办法,赶紧收了下来
原帖名字:ubuntu7.04 安装tomcat6
来源:http://tristonxu.spaces.live.com/blog/cns!6C727D52D9679258!382.entry
终于搞定了,如果仅仅安装tomcat,那是很容易的,问题是如何让他随ubuntu启动运行,这才是问题的关键!现在终于搞定了,唉...俺还是比较笨,居然用了两天的时间才解决,而且问题解决之后,才发现之前原来一直是在成功的门前徘徊。想想,人生何尝不是这样,有多少人用一辈子的时光在成功的门前晃荡...
呵呵~还是赶紧把它记录下来吧,年纪大了阿...
一、安装之前
1、下载tomcat
最新的tomcat是apache-tomcat-6.0.13.tar.gz,下载地址是: http://tomcat.apache.org/download-60.cgi
安装之前要先安张jdk,最好选择JDK5.0以上版本吧。
二、安装ing
1、解压apache-tomcat-6.0.13.tar.gz到安装目录下。
根据俺的实际情况,我把tmcat安装在/opt目录下
shell>sudo tar zxvf apache-tomcat-6.0.13.tar.gz /opt
解压之后,会在/opt下生成一个apache-tomcat-6.0.13文件夹
2、在/usr/local下建立一个软链接
shell>cd /usr/local
shell>sudo ln -s /opt/apache-tomcat-6.0.13 tomcat6
3、测试安装
运行启动脚本,测试tomcat是否安装成功
s hell>sudo /usr/local/tomcat6/bin/startup.sh
然后打开FF,用http://localhost:8080 访问tomcat。一般来讲,会成功的。呵呵~
三、让tomcat开机启动
根据apache网站的Document说明(这个说明也写得很差,呜呜!),要是tomcat作为一个守护程序运行,需要用到jsvc工具。(这个工具是啥玩意,俺也不懂,懒得研究,居然tomcat自带,那就最好了)
1、准备工作
Tomcat安装后,如果让Tomcat用root身份启动,Tomcat将会拥用root权限,这将可能给系统带来安全隐患,黑客可能利用这个来攻击我们的系统,所以我们得添加一个独立运行此服务的用户,用下面的命令:
shell>sudo useradd -d /usr/local/tomcat6 -s /usr/sbin/nologin tomcat
以上命令为系统增加一个tomcat用户,并且设置为nologin
设置用户tomcat5对tomcat的权限
shell>sudo chown -R tomcat:tomcat /usr/local/tomcat6
shell> sudo chown -R tomcat:tomcat /opt/apache-tomcat-6.0.13
2、安装jsvc
shell>cd /usr/local/tomcat6/bin
shell>sudo tar xvfz jsvc.tar.gz
shell>cd jsvc-src
shell>sudo sh support/buildconf.sh
如果成功,命令终端打印出下面report:
support/buildconf.sh: configure script generated successfully
[注:在此之前,我的系统安装了autoconf,可以使用shell>sudo apt-get install autoconf 进行安装]
为configure添加执行权限
shell>sudo chmod 755 configure
shell>sudo ./configure --with-java=/usr/lib/j2sdk1.6-sun (这是俺系统的JDK安装的位置)
shell>sudo make
okay!如果没有出现错误的话,jsvc就安装成功了!
3、设置启动脚本
接下来,就是把jsvc中带有的一个tomcat5.sh的一个模板复制到/etc/init.d目录下,然后根据自己的情况,进行修改。
shell>sudo cp /usr/local/tomcat6/bin/jsvc-src/native/Tomcat5.sh /etc/init.d/tomcat
上面的命令是移动文件tomcat5.sh到/etc/init.d/里面并改名为tomcat
修改/etc/init.d/tomcat文件:
shell>cd /etc/init.d
shell>sudo gedit tomcat
俺的tomcat文件修改完如下:
#!/bin/sh
##############################################################################
#
# Copyright 2004 The Apache Software Foundation.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
##############################################################################
#
# Small shell script to show how to start/stop Tomcat using jsvc
# If you want to have Tomcat running on port 80 please modify the server.xml
# file:
#
# <!-- Define a non-SSL HTTP/1.1 Connector on port 80 -->
# <Connector className="org.apache.catalina.connector.http.HttpConnector"
# port="80" minProcessors="5" maxProcessors="75"
# enableLookups="true" redirectPort="8443"
# acceptCount="10" debug="0" connectionTimeout="60000"/>
#
# That is for Tomcat-5.0.x (Apache Tomcat/5.0)
#
# Adapt the following lines to your configuration
JAVA_HOME=/usr/lib/j2sdk1.6-sun
CATALINA_HOME=/usr/local/tomcat6
DAEMON_HOME=/usr/local/tomcat6/bin
TOMCAT_USER=tomcat
# for multi instances adapt those lines.
TMP_DIR=/var/tmp
PID_FILE=/var/run/jsvc.pid
CATALINA_BASE=/usr/local/tomcat6
CATALINA_OPTS=
CLASSPATH=\
$JAVA_HOME/lib/tools.jar:\
$CATALINA_HOME/bin/commons-daemon.jar:\
$CATALINA_HOME/bin/bootstrap.jar
case "$1" in
start)
#
# Start Tomcat
#
$DAEMON_HOME/jsvc-src/jsvc \
-user $TOMCAT_USER \
-home $JAVA_HOME \
-Dcatalina.home=$CATALINA_HOME \
-Dcatalina.base=$CATALINA_BASE \
-Djava.io.tmpdir=$TMP_DIR \
-wait 10 \
-pidfile $PID_FILE \
-outfile $CATALINA_HOME/logs/catalina.out \
-errfile '&1' \
$CATALINA_OPTS \
-cp $CLASSPATH \
org.apache.catalina.startup.Bootstrap
#
# To get a verbose JVM
#-verbose \
# To get a debug of jsvc.
#-debug \
exit $?
;;
stop)
#
# Stop Tomcat
#
$DAEMON_HOME/src/native/unix/jsvc \
-stop \
-pidfile $PID_FILE \
org.apache.catalina.startup.Bootstrap
exit $?
;;
*)
echo "Usage tomcat.sh start/stop"
exit 1;;
esac
[注:需要修改的地方,我都用红色标出来]
如果在其他linux系统,这样就okay了,但是在ubuntu中,还需要进行一步,就是把在rc2.d中设置一个软链接
在/etc/rc2.d目录下建立S16apache软联接到/etc/init.d/tomcat
shell>cd /etc/rc2.d
shell>ln -s /etc/init.d/apache2 S16apache
[注:rc2.d目录下的文件要以S后就数字开头,表示启动的顺序。而rc2.d中的2,表示这个目录下文件在开机时的运行级别(runlevel)为2]
四、结束
重新启动系统
shell>sudo reboot -n
启动后,就可以在FF中直接输入http://localhost:8080。如果成功,就可以看见一直可爱的kitten拉~~~
项目开发中,碰到的问题,原先设计的字段,定为VARCHAR2类型,最大长度为4000 bytes,实际的应用中,内容往往超过两千汉字,没办法正常插入,因此改为clob大字段类型。
采用Hibernate,实现Clob和Blob对象的存取, 网上有很多解决方案,但是比较老,实际运用中,可能会碰到各种问题。下面是我采用的方案,比较简单,希望对碰到这个问题的人,有帮助。
目前oracle的driver已经支持JDBC 直接操作 CLOB了,但是使用旧的driver的时候,会遇到各种问题,如2k字符的问题。
最新的oracle10g的driver,已经解决了这些问题。我项目用 ojdbc14-10.2.0.3.0.jar 连接 oracle9i数据库,可以正常读写CLOB。
Hibernate存取Clob和Blob对象,将 clob用string方式处理。
Hibernate Annotations方式,只要映射成Lob类型就可以,对该字段的读写,就是一般的操作方式。
@Lob
public String getTxt() {
return txt;
}
好了,就是这么简单!
WIN下的tomcat5的日志是按日期来记录的.移到linux下发现tomcat/logs下只有一个catalina.out件.
时间一长.发现日志文件暴增.对于管理真是不方便.
要是能像win下的tomcat那样分日期记录就好了.思来想去就想到用cron来分割日志文件.
试试吧.
先google一下.cronolog-1.6.2.tar.gz
1.下载cronolog-1.6.2.tar.gz
2.安装
# tar zxvf cronolog-1.6.2.tar.gz
# ./configure
# make
# make install
搞定!
默认是安装在/usr/local/sbin/下.
3.配置
重点来了.注意喽!!!
在tomcat/bin/catalian.sh中找到
org.apache.catalina.startup.Bootstrap "$@" start \ >> "$CATALINA_BASE"/logs/catalina.out 2&1 &
把上面的内容改成:
修改好了.重启
#./catalina.sh start
现去看看劳动成果吧.
# ls /tomcat/logs/
就会发现logs下面多了几个如同catalina.2006.06.01.log的文件了.
最近发现服务器被人穷举扫描,网上找了办法搞定了
原贴:http://blog.chinaunix.net/u/17030/showart_315674.html
我的服务器每天都会有无数的SSH失败尝试记录,有些无聊的人一直不停的扫描,这些人真够无聊的,没事吃饱了撑着,老找些软件在那里穷举扫描,所以大家第一要记的设置一个好的够复杂的密码。
怎么样防,如果要一条一条将这些IP阻止显然治标不治本,还好有DenyHosts软件来代替我们手搞定他。
DenyHosts是Python语言写的一个程序,它会分析sshd的日志文件,当发现重复的攻击时就会记录IP到/etc/hosts.deny文件,从而达到自动屏IP的功能。
DenyHosts官方网站为:http://denyhosts.sourceforge.net
以下是安装记录(以CentOS 4.3, DenyHosts 2.5 为例)
安装
# cd /usr/local/src
# wget http://mesh.dl.sourceforge.net/sourceforge/denyhosts/DenyHosts-2.5.tar.gz
# tar -zxvf DenyHosts-2.5.tar.gz
# cd DenyHosts-2.5
# python setup.py install
|
默认是安装到/usr/share/denyhosts目录的。
配置
# cd /usr/share/denyhosts/
# cp denyhosts.cfg-dist denyhosts.cfg
# vi denyhosts.cfg
|
根据自己需要进行相应的配置(解释见下文件的配置文件)
设置启动脚本
# cp daemon-control-dist daemon-control
# chown root daemon-control
# chmod 700 daemon-control
|
完了之后执行daemon-contron start就可以了。
如果要使DenyHosts每次重起后自动启动还需做如下设置:
# cd /etc/init.d
# ln -s /usr/share/denyhosts/daemon-control denyhosts
# chkconfig –add denyhosts
# chkconfig –level 2345 denyhosts on
|
或者修改/etc/rc.local文件:
加入下面这条命令
/usr/share/denyhosts/daemon-control start
|
DenyHosts配置文件:
vi /etc/denyhosts.cfg
SECURE_LOG = /var/log/secure
#ssh 日志文件,它是根据这个文件来判断的。
HOSTS_DENY = /etc/hosts.deny
#控制用户登陆的文件
PURGE_DENY = 5m
#过多久后清除已经禁止的
BLOCK_SERVICE = sshd
#禁止的服务名
DENY_THRESHOLD_INVALID = 1
#允许无效用户失败的次数
DENY_THRESHOLD_VALID = 10
#允许普通用户登陆失败的次数
DENY_THRESHOLD_ROOT = 5
#允许root登陆失败的次数
HOSTNAME_LOOKUP=NO
#是否做域名反解
ADMIN_EMAIL = iakuf@163.com
#管理员邮件地址,它会给管理员发邮件
DAEMON_LOG = /var/log/denyhosts
#自己的日志文件
|
然后就可以启动了:
可以看看/etc/hosts.deny内是否有禁止的IP,有的话说明已经成功了。
=========================================================
原文地址 http://www.taoran.net/tech/denyhosts.html
DenyHosts是用Python2.3写的一个程序,它会分析/var/log/secure(redhat,Fedora Core)等日志文件,当发现同一IP在进行多次SSH密
码尝试时就会记录IP到/etc/hosts.deny文件,从而达到自动屏蔽该IP的目的。
DenyHosts官方网站为:http://denyhosts.sourceforge.net
一、检查安装条件
1、首先判断系统安装的sshd是否支持tcp_wrappers(默认都支持)
# ldd /usr/sbin/sshd
libwrap.so.0 => /usr/lib/libwrap.so.0 (0x0046e000)
2、判断默认安装的Python版本
# python -V
Python 2.3.4
二、已安装Python2.3以上版本的情况(以RedHat AS4为例)
1、安装DenyHosts
# cd /usr/local/src
# wget http://umn.dl.sourceforge.net/sourceforge/denyhosts/DenyHosts-2.6.tar.gz
# tar zxf DenyHosts-2.6.tar.gz
# cd DenyHosts-2.6
# python setup.py install
程序脚本自动安装到/usr/share/denyhosts
库文件自动安装到/usr/lib/python2.3/site-packages/DenyHosts
denyhosts.py自动安装到/usr/bin
2、设置启动脚本
# cd /usr/share/denyhosts/
# cp daemon-control-dist daemon-control
# chown root daemon-control
# chmod 700 daemon-control
# grep -v "^#" denyhosts.cfg-dist > denyhosts.cfg
# vi denyhosts.cfg
根据自己需要进行相应的修改
----------------denyhosts.cfg------------------------
SECURE_LOG = /var/log/secure
#RedHat/Fedora Core分析该日志文件
#其它版本linux根据denyhosts.cfg-dist内提示选择。
PURGE_DENY = 30m
#过多久后清除
DENY_THRESHOLD_INVALID = 1
#允许无效用户(/etc/passwd未列出)登录失败的次数
DENY_THRESHOLD_VALID = 5
#允许有效(普通)用户登录失败的次数
DENY_THRESHOLD_ROOT = 3
#允许root登录失败的次数
HOSTNAME_LOOKUP=NO
#是否做域名反解
----------------denyhosts.cfg------------------------
如果需要DenyHosts随系统重启而自动启动,还需做如下设置:
# vi /etc/rc.local
加入下面这条命令
/usr/share/denyhosts/daemon-control start
3、启动
# /usr/share/denyhosts/daemon-control start
三、未安装Python2.3以上版本的情况(以RedHat AS3、Python2.2为例)
1、安装Python最新版本的源码包,不必卸载原有低版本Python
# cd /usr/local/src
# wget http://www.python.org/ftp/python/2.5.1/Python-2.5.1.tar.bz2
# tar jxf Python-2.5.1.tar.bz2
# cd Python-2.5.1
# ./configure --prefix=/usr/local/python
# make
# make install
2、安装DenyHosts
# cd /usr/local/src
# wget http://umn.dl.sourceforge.net/sourceforge/denyhosts/DenyHosts-2.6.tar.gz
# tar zxf DenyHosts-2.6.tar.gz
# cd DenyHosts-2.6
# vi setup.py
将"/usr/bin/env python"替换为"/usr/local/python/bin/python",在第一行
# vi daemon-control-dist
将"/usr/bin/env python"替换为"/usr/local/python/bin/python",注意有两处
# /usr/local/python/bin/python setup.py install
程序脚本自动安装到/usr/share/denyhosts
库文件自动安装到/usr/local/python/lib/python2.5/site-packages/DenyHosts
denyhosts.py自动安装到/usr/local/python/bin
# ln -s /usr/local/python/bin/denyhosts.py /usr/bin
原帖地址: http://www.blogjava.net/Unmi/archive/2007/07/25/132391.html
做了一个 Java 程序放在 Solaris 下运行,用到许多的第三方包,有 *.zip 的和 *.jar的,放在 lib 目录下,然后写了一个 shell 脚本来运行那个 java 程序,那就要在 classpath 中包含所有在 lib 中的第三方包。
原来的做法是在 classpath中把lib目录中一个个的包文件名用冒号连缀起来,比如
classpath=.:lib/a.jar:lib/b.jar:lib/c.jar:lib/d.zip
java -classpath $classpath com.unmi.Main
碰到程序升级,在lib中增加或减少了包文件,又要再重新修改那个启动 java 程序的 shell 脚本,甚是麻烦。由此想写个 shell,功能是能列举lib目录下所有第三方包,用冒号连缀成一个 classpath 变量,这样的话,无论在 lib 目录中增减包,都不需要再次修改那个启动 java 程序的 shell 脚本,就像 tomcat,无论是 common/lib 还是 app/WEB-INF/lib 中的第三方包,即放即用。
记得在以前一个公司,有见过这样的脚本,不过记不清了,大致是用 while 循环来生成那样一个classpath 变量的。
还好在网上有高人出手相救,在 CSDN 发了一个贴:
http://community.csdn.net/Expert/topic/5671/5671131.xml?temp=.7013971
过一天就有人回复,完成这一功能的代码是:
#!/bin/sh
_jar=`ls | grep "..*\.zip$"`
_zip=`ls | grep "..*\.jar$"`
_classpath="${_jar} ${_zip}"
classpath=`echo ${_classpath} | sed -e 's/ /:/g'`
echo ${classpath}
这里根据我们前面的需求,是要列出 lib 目录下的 *.zip 或 *.jar 包,所以 shell 改写为:
#!/bin/sh
_jar=`ls lib | grep "..*\.zip$"` #列举lib目录下的 *.zip 文件
_zip=`ls lib | grep "..*\.jar$"` #列举lib目录下的 *.zip 文件
_classpath="${_jar} ${_zip}"
classpath=`echo ${_classpath} | sed -e 's/ /:lib\//g'` #包名前都要带个 lib/
echo ${classpath}
这样,你就可以使用这个 classpath 变量了
java -classpath .:${classpath} com.unmi.Main #把当前目录 . 也加到 classpath 中
在此非常感谢 mymtom(mymtom) 的回复。
最后回头来想想这也就是在原来的 JRE 版本需要手工处理这些事情,如果能用上新版 6.0 Mustang JRE,就可以用它的新特性之一,classpath 通配符,java -classpath .;lib\*.jar:lib\*.zip 了,可是相信大多数同我一样,还享受不起最新版,只能暂且麻烦一些了。
Oracle的数据库对象分为五种:表,视图,序列,索引和同义词。
视图是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改。视图基于的表称为基表。
视图是存储在数据字典里的一条select语句。 通过创建视图可以提取数据的逻辑上的集合或组合。
视图的优点:
1.对数据库的访问,因为视图可以有选择性的选取数据库里的一部分。
2.用户通过简单的查询可以从复杂查询中得到结果。
3.维护数据的独立性,试图可从多个表检索数据。
4.对于相同的数据可产生不同的视图。
视图分为简单视图和复杂视图:
简单视图只从单表里获取数据
复杂视图从多表
简单视图不包含函数和数据组
复杂视图包含
简单视图可以实现DML操作
复杂视图不可以.
视图的创建:
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name
[(alias[, alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY]
FORCE :不管基表是否存在ORACLE都会自动创建该视图;
NOFORCE :只有基表都存在ORACLE才会创建该视图:
alias :为视图产生的列定义的别名;
subquery :一条完整的SELECT语句,可以在该语句中定义别名;
WITH CHECK OPTION :
插入或修改的数据行必须满足视图定义的约束;
WITH READ ONLY :
该视图上不能进行任何DML操作。
例如:
CREATE OR REPLACE VIEW dept_sum_vw
(name,minsal,maxsal,avgsal)
AS SELECT d.dname,min(e.sal),max(e.sal),avg(e.sal)
FROM emp e,dept d
WHERE e.deptno=d.deptno
GROUP BY d.dname;
视图的定义原则:
1.视图的查询可以使用复杂的SELECT语法,包括连接/分组查询和子查询;
2.在没有WITH CHECK OPTION和 READ ONLY 的情况下,查询中不能使用
ORDER BY 子句;
3.如果没有为CHECK OPTION约束命名,系统会自动为之命名,形式为SYS_Cn;
4.OR REPLACE选项可以不删除原视图便可更改其定义并重建,或重新授予对象
权限。
视图的查询:
视图创建成功后,可以从视图中检索数据,这点和从表中检索数据一样。
还可以查询视图的全部信息和指定的数据行和列。
如:
检索数据:
SQL>SELECT * FROM dept_sum_vw;
查询视图定义:
SELECT view_name,text from user_views;
其中text显示的内容为视图定义的SELECT语句,可通过DESC USER_VIEWS
得到相关信息。
修改视图:
通过OR REPLACE 重新创建同名视图即可。
视图上的DML 操作:
DML操作应遵循的原则:
1.简单视图可以执行DML操作;
2.在视图包含GROUP 函数,GROUP BY子句,DISTINCT关键字时不能
删除数据行;
3.在视图不出现下列情况时可通过视图修改基表数据或插入数据:
a.视图中包含GROUP 函数,GROUP BY子句,DISTINCT关键字;
b.使用表达式定义的列;
c.ROWNUM伪列。
d.基表中未在视图中选择的其他列定义为非空且无默认值。
视图可用于保持数据库的完整性,但作用有限。
通过视图执行引用完整性约束可在数据库级执行约束。
WITH CHECK OPTION 子句限定:
通过视图执行的INSERTS和UPDATES操作不能创建该视图检索不到的数据行,
因为它会对插入或修改的数据行执行完整性约束和数据有效性检查。
例如:
CREATE OR REPLACE VIEW vw_emp20
AS SELECT * FROM emp
WHERE deptno=20
WITH CHECK OPTION constraint vw_emp20_ck;
视图 已建立。
查询结果:
SELECT empno,ename,job FROM vw_emp20;
EMPNO ENAME JOB
--------------------- -------------- -------------
7369 SMITH CLERK
7566 JONES MANAGER
7902 FORD ANALYST
修改:
UPDATE vw_emp20
SET deptno=20
WHERE empno=7902;
将产生错误:
UPDATE vw_emp20
*
ERROR 位于第一行:
ORA-01402:视图WITH CHECK OPTION 违反WHERE 子句
视图的删除:
DROP VIEW VIEW_NAME语句删除视图。
删除视图的定义不影响基表中的数据。
只有视图所有者和具备DROP VIEW权限的用户可以删除视图。
视图被删除后,基于被删除视图的其他视图或应用将无效。
OR REPLACE :若所创建的试图已经存在,ORACLE自动重建该视图;
Ruby中常会用到正则表达式。正则表达式是用来表达字符串的模式(pattern)的。也可以这么理解:我们使用正则表达式来表示某种搜索规则,然后使用该正则表达式来完成字符串的搜索工作。举个例子,假定有这样的搜索规则:“字符串以’FOO’开始,以’R’结束”,那么就可以使用以下正则表达式来表示该规则。
/^FOO.*R$/
Ruby用//将正则表达式括起来。^表示开头,$表示结尾,.*表示0个以上的任意字符。
现在就讲讲正则表达式的规则的写法。正则表达式中有很多上述的具有特别意义的字符。首先是下列字符。
[ ]
范围描述符。[a-z]表示从a到z之间的任意一个。
\w
英文字母和数字。即[0-9 A-Z a-z]。
\W
非英文字母和数字
\s
空字符,即[\t\n\r\f]。
\S
非空字符。
\d
数字,即[0-9]。
\D
非数字。
\b
词边界字符(在范围描述符外部时)
\B
非词边界字符
\b
退格符(0x08)(在范围描述符内部时)
*
前面元素出现0次以上
+
前面元素出现1次以上
{m,n}
前面元素最少出现m次,最多出现n次
?
前面元素出现0次或1次
|
选择
( )
群组
其他字符
该字符本身
例如,“^f[a-z]+”表示“第一个字符是f,后面是若干个从a到z之间的字符”,可以是“fobar”或“fool”等等。这种表达法就是正则表达式(regular expression)。在搜索字符串时正则表达式非常有用,因此在UNIX的世界里,正则表达式得到了广泛的应用。grep程序就是个代表。许多人是不是经常会用到它呢?
为了学会使用正则表达式,先来试试下面这个程序。请用文件名regx.rb将程序保存下来以后再运行它。
st = "\033[7m"
en = "\033[m"
while TRUE
print "str> "
STDOUT.flush
str = gets
break if not str
str.chop!
print "pat> "
STDOUT.flush
re = gets
break if not re
re.chop!
str.gsub! /#{re}/, "#{st}\\{en}"
print str, "\n"
end
print "\n"
该程序会在第一次输入的字符串中按照第二次输入的正则表达式的要求寻找合适的字符串,并将其以反色显示出来。下面是运行结果。
str> foobar
pat> ^fo+
foobar
^^^
# 实际上foo的部分被反色显示了。
再试一试。
str> abc012dbcd555
pat> \\d
abc012dbcd555
~~~ ~~~
从上例可以看出,该程序可以检测出多处符合条件的字符串。
str> foozboozer
pat> f.*z
foozboozer
~~~~~~~~
在这个例子中,正则表达式“f.*z”并非只是对应到fooz,而是一直对应到foozbooz这里。这是因为,正则表达式总是在符合条件的结果中选择较长的一个。
正则表达式甚至可以写出让人一眼看不透的模式,这可能会像谜语一样有趣。但若过分凝炼的话,以后就很难搞懂当初的想法了。
str> Wed Feb 7 08:58:04 JST 1996
pat> [0-9]+:[0-9]+(:[0-9]+)?
Wed Feb 7 08:58:04 JST 1996
~~~~~~~~
Ruby用’/’将正则表达式括起来。另外还有一些方法会自动将字符串变为正则表达式。
% ruby -le 'print "abcdef" =~ /d/'
3
% ruby -le 'print "aaaaaa" =~ /d/'
nil
‘=~’是使用正则表达式进行匹配的操作符,它返回匹配成功时的位置。
到底哪些方法可以处理正则表达式呢?关于这个问题,请查阅参考手册。
定义:escape关键字经常用于使某些特殊字符,如通配符:'%','_'转义为它们原
来的字符的意义,被定义的转义字符通常使用'\',但是也可以使用其他的符号。
实例:
SQL> select * from t11 where name like '%_%';
NAME ---------- aa_a aaa SQL> select * from t11 where name like '%\_%' escape '\';
NAME ---------- aa_a
注意:如果是 '/' 作为检索字符, 必须 用 '/' 作为转义符, 正斜扛也一样. select * from wan_test where psid like '%//%' escape '/'
通常情况下,我们使用SPOOL方法,将数据库中的表导出为文本文件的时候会采用两种方法,如下述: 方法一:采用以下格式脚本 set colsep '' ------设置列分隔符 set trimspool on set linesize 120 set pagesize 2000 set newpage 1 set heading off set term off spool 路径+文件名 select * from tablename; spool off 方法二:采用以下脚本 set trimspool on set linesize 120 set pagesize 2000 set newpage 1 set heading off set term off spool 路径+文件名 select col1||','||col2||','||col3||','||col4||'..' from tablename; spool off 比较以上方法,即方法一采用设定分隔符然后由sqlplus自己使用设定的分隔符对字段进行分割,方法二将分隔符拼接在SELECT语句中,即手工控制输出格式。 在实践中,我发现通过方法一导出来的数据具有很大的不确定性,这种方法导出来的数据再由sql ldr导入的时候出错的可能性在95%以上,尤其对大批量的数据表,如100万条记录的表更是如此,而且导出的数据文件狂大。 而方法二导出的数据文件格式很规整,数据文件的大小可能是方法一的1/4左右。经这种方法导出来的数据文件再由sqlldr导入时,出错的可能性很小,基本都可以导入成功。 因此,实践中我建议大家使用方法二手工去控制spool文件的格式,这样可以减小出错的可能性,避免走很多弯路。 本文原创,如有引用,请加链接,谢谢!
原帖地址
TFTP是用来下载远程文件的最简单网络协议,它基于UDP协议而实现。嵌入式linux的tftp开发环境包括两个方面:一是嵌入式linux宿主机的 tftp-server支持,二是嵌入式linux目标机的tftp-client支持。因为u-boot本身内置支持tftp-client,所以嵌入式目标机就不用配置了。下面就详细介绍一下linux宿主机tftp-server的安装配置。
在FC6光盘的ISO镜像中,有tftp-server的rpm安装包。 (1)安装 #mount -o loop <FC6光盘ISO镜像.iso> /mnt/CD //挂载光盘 #rpm -ivh tftp-0.42-3.1.i386.rpm //安装tftp-client #rpm -ivh tftp-server-0.42-3.1.i386.rpm //安装tftp-server #umount /mnt/CD //卸载光盘
(2)修改文件 在linux 下,不管使用的是哪一种super-server,inetd或者xinetd,默认情况下TFTP服务是禁用的,所以要修改文件来开启服务。根据(1)的安装方法,可以修改文件/etc/xinetd.d/tftp。主要是设置TFTP服务器的根目录,开启服务。修改后的文件如下:
service tftp { socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /tftpboot disable = no per_source = 11 cps = 100 2 flags = IPv4 }
说明:修改项server_args= -s <path> -c,其中<path>处可以改为你的tftp-server的根目录,参数-s指定chroot。
(3)创建tftp根目录,启动tftp-server。 #mkdir /tftpboot #chmod o+w /tftpboot #service xinetd restart 这样,tftp-server就启动了。
(4)配置防火墙 TFTP (Trivial File Transfer Protocol),中译简单文件传输协议或小型文件传输协议. 大家一定记得在2003年8月12日全球爆发冲击波(Worm.Blaster)病毒,这种病毒会监听端口69,模拟出一个TFTP服务器,并启动一个攻击传播线程,不断地随机生成攻击地址,进行入侵。另外tftp被认为是一种不安全的协议而将其关闭,同时也是防火墙打击的对象,这也是有道理的。tftp 在嵌入式linux还是有用武之地的。 打开防火墙,允许tftp访问网络。 [root@localhost /]# setup Firewall configuration--> Customize--other port 处:69:udp,保存就可以了。
你可以登陆本机测试以下,命令如下: #tftp your-ip-address tftp>get <download file> tftp>put <upload file> tftp>q #
================整理====================
######################################################## 安装过程中出现的问题及原因 现象一: tftp> get test.log Transfer timed out. 原因: tftpd服务没有启动
现象二: tftp> get test.log Error code 2: Only absolute filenames allowed 原因: 在/etc/xinetd.d/tftpd中设置的server_args为/etc/default/tftpd-hpa cat /etc/default/tftpd-hpa #Defaults for tftpd-hpa RUN_DAEMON="no" OPTIONS="-s /home/tftpd -c -p -U 077 -u tftpd" ps:实际根本就不用/etc/default/tftpd-hpa文件,它应该是用在standalone模式下的
现象三: tftp> put ex070416.log Error code 1: File not found 原因: 指定的文件不存在;或tftpd启动参数中没有指定-c选项,允许上传文件
######################################################## 其它常用选项如下: -l 使用standalone模式运行,此模式下,将会忽略-t选项 -a address:port 在standalone模式下服务所在的IP与端口,如果不指定,则在本机所有IP,/etc/service中指定的port上侦听连接 -c 允许在服务器上新建文件,否则只允许更新现有的文件。如果未指定-U或-p选项,则允许任何人上传文件 -s directory 服务器端默认的目录,默认为/var/lib/tftpdboot -u username tftpd服务以什么身份运行,默认是nobody,一般可以新建一个tftpd的账号来运行 -U umask 上传的文件的掩码,如果未指定-p则为000,如果指定了-p,则采用指定的umask -p 对于通过-u指定的用户执行的动作,不做额外的权限检查
更多权限请见man tftpd。
TFTP (普通文件传输协议或一般文件传输协议) 大家一定记得在2003年8月12日全球爆发冲击波(Worm.Blaster)病毒,这种病毒会监听端口69,模拟出一个TFTP服务器,并启动一个攻击传播线程,不断地随机生成攻击地址,进行入侵。另外tftp被认为是一种不安全的协议而将其关闭,同时也是防火墙打击的对象,这也是有道理的。不过 tftp还是有用武之地的,下面讲的文件传输和备份router配置文件都时实际应用,它也只时一种手段而已。
一、用TFTP实现文件传输 环境:服务器A :rhas11 客户机B: rhas101 首先用rpm –qa | grep tftp看一下tftp有没安装,没有的话安 装一下。 A:在服务器端设置 #vi /etc/xinetd.d/tftp service tftp { disable = no socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /test per_source = 11 cps = 100 2 flags = IPv4 }
或用chkconfig tftp on 也可以打开xinetd代理的tftp服
#mkdir /test #service xinetd restart 从启xinetd服务,因为TFTP服务受控与xinetd, xinetd是管服务的服务,它是不开端口的。 验证一下TFTP是否起来了: [root@rhas11 tftp]# netstat -nlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:32768 0.0.0.0:* LISTEN 3122/rpc.statd tcp 0 0 127.0.0.1:32781 0.0.0.0:* LISTEN 4035/xinetd tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 3103/portmap tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3324/httpd tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3255/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 3213/cupsd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 3295/sendmail: acce tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN 3415/0 tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 3324/httpd udp 0 0 0.0.0.0:32768 0.0.0.0:* 3122/rpc.statd udp 0 0 0.0.0.0:69 0.0.0.0:* 4035/xinetd udp 0 0 0.0.0.0:69 0.0.0.0:* 4012/in.tftpd udp 0 0 0.0.0.0:111 0.0.0.0:* 3103/portmap udp 0 0 0.0.0.0:754 0.0.0.0:* 3122/rpc.statd udp 0 0 0.0.0.0:631 0.0.0.0:* 3213/cupsd
A:服务器端 新建一文件file #cd /test [root@rhas11 test]# ls -l 总用量 4 -rw-r--r-- 1 root root 19 5月 15 18:26 file
B客户端:
下载: [root@rhas101 tmp]# tftp 172.31.0.11 tftp> get 1 Received 72 bytes in 0.0 seconds tftp>
上传当前目录下文件”aaa” [root@rhas101 client]# ls -l 总用量 4 -rw-r--r-- 1 root root 15 5月 20 21:49 aaa
[root@rhas101 client]# tftp 172.31.0.11 tftp> put aaa Error code 1: File not found tftp>
奇怪当前目录却是有aaa文件???让我想一下 哦,原来服务器/test目录下没有文件aaa,那就touch一个吧 [root@rhas11 test]# touch aaa [root@rhas11 test]# ls -l 总用量 4 -rw-r--r-- 1 root root 0 5月 15 18:46 aaa -rw-r--r-- 1 root root 19 5月 15 18:26 file
好了再试一试 [root@rhas101 client]# tftp 172.31.0.11 tftp> put aaa Error code 1: File not found tftp> put aaa Error code 2: Access denied tftp> 细心的读者一定想到这是权限问题 再到服务器上设置 (=========================================================================== 小插曲:#chown -R nobody.nobody /test #vi /etc/xinetd.d/tftp service tftp { disable = no socket_type = dgram protocol = udp wait = yes user = nobody server = /usr/sbin/in.tftpd server_args = -u nobody -s /test per_source = 11 cps = 100 2 flags = IPv4 } chmod 777 -R /test =========================================================================== )
#service xinetd restart
)
[root@rhas11 test]# chmod 007 aaa 其实只要有可写的权限就行了 [root@rhas11 test]# ls -l 总用量 4 -------rwx 1 root root 0 5月 15 18:46 aaa -rw-r--r-- 1 root root 19 5月 15 18:26 file
[root@rhas101 client]# tftp 172.31.0.11 tftp> put aaa Error code 1: File not found tftp> put aaa Error code 2: Access denied tftp> put aaa Sent 16 bytes in 0.0 seconds tftp>
二、 特殊应用:上传和下载路由器(或交换机)配置文件
配使用Linux的tftp功能配置cisco route 在局域网环境中,如果有Cisco 路由器和Linux服务器。也许你需要利用Linux的 TFTP服务去下载Cisco router配置文件 startup-config,在服务器上编辑后再上载 到路由器,在实现中有一些特别注意的地方。 所用软、硬件:Redhat Linux AS 3.0 ,Cisco 2611 路由器
BEIJING#copy run tftp Address or name of remote host []? 172.31.0.11 Destination filename [beijing-confg]? beijing-route !! 1968 bytes copied in 0.581 secs (3387 bytes/sec)
别忘了在tftp server 上创建beijing-route权限为777 BEIJING#copy tftp flash Address or name of remote host []? 172.31.0.11 Source filename []? beijing-route Destination filename [beijing-route]? Accessing tftp://172.31.0.11/beijing-route... Erase flash: before copying? [confirm] Erasing the flash filesystem will remove all files! Continue? [confirm] Erasing device... eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee ...erased Erase of flash: complete Loading beijing-route from 172.31.0.11 (via FastEthernet0/0): ! [OK - 1968 bytes]
Verifying checksum... OK (0x5248) 1968 bytes copied in 0.285 secs (6905 bytes/sec) BEIJING#
用tftp传输大文件时的带宽显示情宽
1、pwd 查看自己当前所在位置
2、cat 列出、合并、创建文件
cat test.txt (列出test.txt) cat test1.txt test2.txt > test3.txt (1、2合并生成3) cat test1.txt >> test2.txt (1合并到2中) cat > myfile.txt (创建myfile.txt) 3、mv file1 file2 (将file1改名为file2,如果file2已经存在,为避免改名时覆盖file2,加上-b参数会生成file2的备份,备份有个波浪号后缀)
4、cp 拷贝命令
cp file1 file2 覆盖掉file2的内容 cp -i file1 file2 会出现提示信息 cp -bi file1 file2 会备份file2 cp -r tempdir1 tempdir2 把子目录tempdir1及其中文件拷贝到tempdir2 cp -p tempdir2/tempdir1/temp1file1 tempdir3 把文件连同子目录结构一起拷贝到tempdir3 5、ln 建立硬链接和符号链接
ln file1 file2 (硬链接,file2和file1完全相同,修改其中任何一个都会影响另外一个,删除了file1后,file2仍存在) ln -s file1 file2 (符号链接,file2只是一个指向file1的假名,如果删除了file2,不影响file1,如果删除了file1,file2就没用了) ln -s /usr/local/games play (建立一个子目录的硬链接必须用符号链接,建立完符号链接后,就不用cd /usr/local/games了,只要用cd play) 6、chowd 改变文件权限
chmod 600 file1 chmod ugo-wx file(拥有者-组-其他用户直接增减权限) 7、chown 改变文件所有权
chown :users file1(把所有权分配给users用户组) chown lucy:users file1(把存取权限分配给lucy用户) 8、groups 用户名 (查看用户名属于哪个组)
9、groupadd 组名 (创建新组)
10、usermod -G/-g 组名 用户名(把一个用户加入一个组/把一个用户改为属于另一个组)
11、userdel 用户名/groupdel 组名 (删除用户/删除组)
12、scp root@202.198.31.66:/usr/local/file1 /home/ (远程拷贝)
13、history 3 (查看历史命令列表,此命令是查看刚才用过的3个命令)
14、find / -name http.conf -print (从根目录开始查找文件并列出属性)
15、grep -c word /file1 (grep查找文件内容,此命令找出file1中word串出现次数)
16、修改主机名 vi /etc/sysconfig/network,修改HOSTNAME一行为"HOSTNAME=主机名",然后运行命令" hostname 主机名"。一般还要修改/etc/hosts文件中的主机名。
17、修改IP地址和修改网关(gateway选项) vi /etc/sysconfig/network-scripts/ifcfg-eth0 18、查看机器域名(host IP) host 202.198.31.62 19、查看CPU dmesg|grep CPU 20、查看机器配置 dmesg|grep hd
编辑
作用域
|
功能
|
快捷键
|
全局
|
查找并替换
|
Ctrl+F
|
文本编辑器
|
查找上一个
|
Ctrl+Shift+K
|
文本编辑器
|
查找下一个
|
Ctrl+K
|
全局
|
撤销
|
Ctrl+Z
|
全局
|
复制
|
Ctrl+C
|
全局
|
恢复上一个选择
|
Alt+Shift+↓
|
全局
|
剪切
|
Ctrl+X
|
全局
|
快速修正
|
Ctrl1+1
|
全局
|
内容辅助
|
Alt+/
|
全局
|
全部选中
|
Ctrl+A
|
全局
|
删除
|
Delete
|
全局
|
上下文信息
|
Alt+?
Alt+Shift+?
Ctrl+Shift+Space
|
Java编辑器
|
显示工具提示描述
|
F2
|
Java编辑器
|
选择封装元素
|
Alt+Shift+↑
|
Java编辑器
|
选择上一个元素
|
Alt+Shift+←
|
Java编辑器
|
选择下一个元素
|
Alt+Shift+→
|
文本编辑器
|
增量查找
|
Ctrl+J
|
文本编辑器
|
增量逆向查找
|
Ctrl+Shift+J
|
全局
|
粘贴
|
Ctrl+V
|
全局
|
重做
|
Ctrl+Y
|
查看
作用域
|
功能
|
快捷键
|
全局
|
放大
|
Ctrl+=
|
全局
|
缩小
|
Ctrl+-
|
窗口
作用域
|
功能
|
快捷键
|
全局
|
激活编辑器
|
F12
|
全局
|
切换编辑器
|
Ctrl+Shift+W
|
全局
|
上一个编辑器
|
Ctrl+Shift+F6
|
全局
|
上一个视图
|
Ctrl+Shift+F7
|
全局
|
上一个透视图
|
Ctrl+Shift+F8
|
全局
|
下一个编辑器
|
Ctrl+F6
|
全局
|
下一个视图
|
Ctrl+F7
|
全局
|
下一个透视图
|
Ctrl+F8
|
文本编辑器
|
显示标尺上下文菜单
|
Ctrl+W
|
全局
|
显示视图菜单
|
Ctrl+F10
|
全局
|
显示系统菜单
|
Alt+-
|
导航
作用域
|
功能
|
快捷键
|
Java编辑器
|
打开结构
|
Ctrl+F3
|
全局
|
打开类型
|
Ctrl+Shift+T
|
全局
|
打开类型层次结构
|
F4
|
全局
|
打开声明
|
F3
|
全局
|
打开外部javadoc
|
Shift+F2
|
全局
|
打开资源
|
Ctrl+Shift+R
|
全局
|
后退历史记录
|
Alt+←
|
全局
|
前进历史记录
|
Alt+→
|
全局
|
上一个
|
Ctrl+,
|
全局
|
下一个
|
Ctrl+.
|
Java编辑器
|
显示大纲
|
Ctrl+O
|
全局
|
在层次结构中打开类型
|
Ctrl+Shift+H
|
全局
|
转至匹配的括号
|
Ctrl+Shift+P
|
全局
|
转至上一个编辑位置
|
Ctrl+Q
|
Java编辑器
|
转至上一个成员
|
Ctrl+Shift+↑
|
Java编辑器
|
转至下一个成员
|
Ctrl+Shift+↓
|
文本编辑器
|
转至行
|
Ctrl+L
|
搜索
作用域
|
功能
|
快捷键
|
全局
|
出现在文件中
|
Ctrl+Shift+U
|
全局
|
打开搜索对话框
|
Ctrl+H
|
全局
|
工作区中的声明
|
Ctrl+G
|
全局
|
工作区中的引用
|
Ctrl+Shift+G
|
文本编辑
作用域
|
功能
|
快捷键
|
文本编辑器
|
改写切换
|
Insert
|
文本编辑器
|
上滚行
|
Ctrl+↑
|
文本编辑器
|
下滚行
|
Ctrl+↓
|
文件
作用域
|
功能
|
快捷键
|
全局
|
保存
|
Ctrl+X
Ctrl+S
|
全局
|
打印
|
Ctrl+P
|
全局
|
关闭
|
Ctrl+F4
|
全局
|
全部保存
|
Ctrl+Shift+S
|
全局
|
全部关闭
|
Ctrl+Shift+F4
|
全局
|
属性
|
Alt+Enter
|
全局
|
新建
|
Ctrl+N
|
项目
作用域
|
功能
|
快捷键
|
全局
|
全部构建
|
Ctrl+B
|
源代码
作用域
|
功能
|
快捷键
|
Java编辑器
|
格式化
|
Ctrl+Shift+F
|
Java编辑器
|
取消注释
|
Ctrl+\
|
Java编辑器
|
注释
|
Ctrl+/
|
Java编辑器
|
添加导入
|
Ctrl+Shift+M
|
Java编辑器
|
组织导入
|
Ctrl+Shift+O
|
Java编辑器
|
使用try/catch块来包围
|
未设置,太常用了,所以在这里列出,建议自己设置。 也可以使用Ctrl+1自动修正。
|
运行
作用域
|
功能
|
快捷键
|
全局
|
单步返回
|
F7
|
全局
|
单步跳过
|
F6
|
全局
|
单步跳入
|
F5
|
全局
|
单步跳入选择
|
Ctrl+F5
|
全局
|
调试上次启动
|
F11
|
全局
|
继续
|
F8
|
全局
|
使用过滤器单步执行
|
Shift+F5
|
全局
|
添加/去除断点
|
Ctrl+Shift+B
|
全局
|
显示
|
Ctrl+D
|
全局
|
运行上次启动
|
Ctrl+F11
|
全局
|
运行至行
|
Ctrl+R
|
全局
|
执行
|
Ctrl+U
|
重构
作用域
|
功能
|
快捷键
|
全局
|
撤销重构
|
Alt+Shift+Z
|
全局
|
抽取方法
|
Alt+Shift+M
|
全局
|
抽取局部变量
|
Alt+Shift+L
|
全局
|
内联
|
Alt+Shift+I
|
全局
|
移动
|
Alt+Shift+V
|
全局
|
重命名
|
Alt+Shift+R
|
全局
|
重做
|
Alt+Shift+Y
|
在linux下用rm删除大量文件时会出现这个错误:
rm -rf 'wz-a1.2007-02*' rm -rf * -bash: /bin/rm: 参数列表过长
经过google, 发现这个方法, 特记下来, 以防以后忘记 find . -name "wz-a1.2007-02*" | xargs rm -rf 'wz-a1.2007-02*'
原帖地址:http://www.blogjava.net/kelefa/archive/2007/02/02/97528.html
摘要: 原文出处:http://www.blogjava.net/chords/archive/2006/12/14/87591.html------------------------Five Habits of Highly Profitable Software Developersby Robert J. Miller08/24/2006原文地址:http://today.java.net/pub... 阅读全文
作者: 江南白衣,原文出处: http://www.blogjava.net/calvin/archive/2007/01/27/96318.html,转载请保留出处。
Unix系统永远只会越来越多,开发人员就没必要特意学习它们的安装、配置和管理了,就全部交给集成人员吧。 但开发人员行走于Unix之间,依然有四样东西要熟练。 一、VI 虽然Unix上的文本编辑器已经越来越好用,但不在Console前面,网速也不够连XWindows的时候,还是要依赖VI。 回想VI的时代背景,发现VI对开发人员已经周到得离谱了,热键多到你双手不离键盘就能完成大半编辑工作。 建议自己制作一张自己认为有用,但又经常忘记的命令的sheet--参见附录A,拿出考试的力气把它背熟。 二、文本处理 开发人员在Unix下干得最多的除了Make和除Bug外,大概就是处理日志文件、业务文件的查错和统计了。 只会more和grep是不够的,开发老手会把awk,sed,grep,sort,uniq,wc,head,tail这些文本处理命令,通过管道玩具式的拆卸拼装,最后完成一件原本以为非编写大段代码不可的工作。周到的参数设定,让人再一次感叹那个简单的年代,这样复杂到极致的设计.......怪不得《Unix 编程艺术》的作者有那么骄傲的自觉。 比如车东的每月访问TOP10 统计脚本: awk -F '\t' '{print $4}' 2004_2.txt| grep chedong.com/tech/|uniq -c|sort -rn|head -10 以上命令的具体用法--参见附录B:文本处理命令小结,大概说明如下: - awk -F '\t' 将2004_2.txt访问纪录文件,用TAB分割,打印第4列
- grep chedong.com/tech 只列出chedong.com/tech笔记目录下的文档
- uniq -c 汇总计数
- sort -rn 按数值排序
- head -10 TOP 10
补充:这些命令几乎都支持正则表达式,学正则比较好的书是OReilly的《Mastering.Regular.Expressions.3rd 2006》 三、Bash Shell 编程 上面的纯粹命令管道拼装完成不了所有的事情,有时需要用Shell编程来配合调度。
编程是开发人员的天赋本能,不论什么语言,看看参考手册应该就能上手。 见《Bash新手指南中文版》 ,一份快速的Bash Shell编程指南。 更进一步,可以学习perl。
四、Make or AutoMake 用过Java的Ant后,想起Make就觉得很烦,很厌倦。总归还是会的,见《GNU Make 3.8.0 中文手册》 不过即使make已经精通到变态,每个人写出来的MakeFile还是千奇百怪,再看看开源项目们个个都是automake+autoconf了,我们自己也长进一点吧。手工编写MakeFile.am,让auotomake变成MakeFile.in,再让用户./configure 生成最终的MakeFile。 autotools既能跨越平台,又是标准的写法,最重要的是,编写MakeFile.am的工作量比MakeFile少多了,只要简单的定义目标文件,先要处理的子目录,需要的源文件,头文件与库文件就可以了。 入门文章 使用AutoMake轻松生成Makefile IBM DW:例解 autoconf 和 automake 生成 Makefile 文件
上面两文只作入门了解,实际的操作步骤--参见附录C:我的automake1.9步骤小结。
完整的免费电子书: 《GNU Autoconf, Automake and Libtool》 另外,ACE里还贡献了一个更厉害的MPC(Makefile, Project, and Workspace Creator ), 自动的生成MakeFile.am或者VC的项目文件。
附录A:我的VI易忘命令手册 上下左右: ctrl+u/d 上下半屏,ctrl+f/b,上下一屏 H/G屏幕头/文章末 ,0/$ 行首行末 增删改: yy/dd 复制/删除 一行,p/P:将yy/dd的内容paste出来 I/A 在行首/末添加, o/O 开新行,d0/d$ 删除到行首,行末 u:undo 查: ? 向前查找, n/N 重复上一次查找 附录B: 文本处理命令小结 awk:处理结构化的文本(每行以固定符号分成若干列),提取打印某些字段,如: ls -l|awk '{print $1}' --将ls-l结果的第一列打印出来 awk -F":" '{print $1" "$6}' /etc/passwd ,将以:分割的/etc/passwd文件的第1,6列打印出来,中间以空格分开 详见IBM DW中国的AWK实例(共3篇) 或 Bash新手指南中文版第6章。 grep:过滤,大家用得最多的命令,支持正则表达式。参数有: -i忽略大小写,-n显示line number,-c 统计在每个文件的出现次数,-l只显示符合的文件的名字。 sed:流编辑器,主要用于替换,如: sed -e '1,10s/foo/bar/g' myfile2.txt 将1到10行的文本中的foo 替换成bar,s代表替换,g代表全局替换 支持正则的替换字符串,可以只替换某个范围内的内容。 用法不算简单,详见IBM DW中国的Sed实例(共3篇)或 Bash新手指南中文版第5章。 sort:排序,参数有: -r逆序, -n 数字比较 , -M 日历比较 Feb,Dec, -f 忽略大小写 同样支持结构化文件,如 sort -t : -k 1,1 /etc/passwd,以: 分割,只按第1列排序 sort -t : -k 1,1 -k2.2,3.4 /etc/passwd ,以:分割,先按第1列排序,再按第2列的第二个字符到第3列的第4个字符排序。 uniq:去除重复行。 除了正常用法外,还有-c统计重复次数,和-u (唯一)和 -d (重复)两个参数,只显示唯一的和重复的行。 wc: 统计。 -l 行,-m 字符,-w 单词
附录C: 我的automake1.9步骤小结- 先编写MakeFile.am
- 运行autoscan,生成configure.scan
- 修改configure.scan,同时把文件改名为configure.in :
去除AC_CONFIG_HEADER([config.h])那行 加入AM_INIT_AUTOMAKE([1.9 foreign]) (其中1.9是automake的版本号) 加入AC_PROG_LIBTOOL (如果用libtool的话) 检查AC_CONFIG_FILES,如果之前没有先写齐所有MakeFile.am,autoscan就不会帮你加入,需要自己手工补充。
- libtoolize (如果用libtool的话)
- aclocal
- autoconf
- automake --add-missing
- ./configure
- make
大家需要编写的文件从Makefile转为了Makefile.am 和configure.in, ACE的Examples是很好的参考。
查看表空间的名称及大小 select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size from dba_tablespaces t, dba_data_files d where t.tablespace_name = d.tablespace_name group by t.tablespace_name;
====================================
set pages 100 col ts_name form a20 head 'Tablespace' col pieces form 9990 head 'Pcs' col ts_size form 999,990 head 'SizeMb' col largestpc form 999,990 head 'LrgMB' col totalfree form 999,990 head 'FreeMb' col pct_free form 990 head '%Free' col whatsused form 999,990 head 'Used' col pct_used form 990 head '%Used' col problem head 'Prob??' --spool /tmp/tbs_size.log
select q2.other_tname ts_name, pieces, ts_size ts_size, nvl(largest_chunk,0) largestpc, nvl(total_free,0) totalfree, nvl(round((total_free/ts_size)*100,2),0) pct_free, ts_size-total_free whatsused, nvl(100-round((total_free/ts_size)*100,2),100) pct_used, decode(nvl(100-round((total_free/ts_size)*100,0),100), 85,'+',86,'+',87,'+',88,'+',89,'++',90,'++',91,'++', 92,'++',93,'++',94,'+++',95,'+++',96,'+++',97,'++++', 98,'+++++',99,'+++++',100,'+++++','') problem from (select dfs.tablespace_name,count(*) pieces, round(max(dfs.bytes)/1024/1024,2) largest_chunk, round(sum(dfs.bytes)/1024/1024,2) total_free from dba_free_space dfs group by tablespace_name) q1, (select tablespace_name other_tname, round(sum(ddf2.bytes)/1024/1024,2) ts_size from dba_data_files ddf2 group by tablespace_name) q2 where q2.other_tname = q1.tablespace_name(+) order by nvl(100-round((total_free/ts_size)*100,0),100) desc;
====================================
查看表空间使用情况的SQL语句: SELECT a.tablespace_name "表空间名",total 表空间大小,free 表空间剩余大小, (total-free) 表空间使用大小, ROUND((total-free)/total,4)*100 "使用率 %" FROM (SELECT tablespace_name,SUM(bytes) free FROM DBA_FREE_SPACE GROUP BY tablespace_name ) a, (SELECT tablespace_name,SUM(bytes) total FROM DBA_DATA_FILES GROUP BY tablespace_name) b WHERE a.tablespace_name=b.tablespace_name
===================================== rem fsfi value compute rem fsfi.sql column fsfi format 999,99 select tablespace_name,sqrt(max(blocks)/sum(blocks))* (100/sqrt(sqrt(count(blocks)))) fsfi from dba_free_space group by tablespace_name order by 1; spool fsfi.rep; / spool off;
今天,做了一个oracle数据库的存储过程,可当中一个游标将表给锁住了。
弄了半天,一开始用kill 3444直接将进程杀死。可是命令对它没有一点作用,数据库锁一直呆在那里。
后来在google一搜,发现一篇很好文章。摘录在后面。
即刻杀死了数据库锁。方法如下:
1、查看数据库锁,诊断锁的来源及类型:
select object_id,session_id,locked_mode from v$locked_object;
2、找出数据库的serial#,以备杀死:
select t2.username,t2.sid,t2.serial#,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time;
3、杀死该session
alter system kill session 'sid,serial#'
4、that't all, it's right!
'===============================================================================
ORACLE锁的管理
2003-03 余枫
ORACLE里锁有以下几种模式:
0:none
1:null 空
2:Row-S 行共享(RS):共享表锁
3:Row-X 行专用(RX):用于行的修改
4:Share 共享锁(S):阻止其他DML操作
5:S/Row-X 共享行专用(SRX):阻止其他事务操作
6:exclusive 专用(X):独立访问使用
数字越大锁级别越高, 影响的操作越多。
一般的查询语句如select ... from ... ;是小于2的锁, 有时会在v$locked_object出现。
select ... from ... for update; 是2的锁。
当对话使用for update子串打开一个游标时,
所有返回集中的数据行都将处于行级(Row-X)独占式锁定,
其他对象只能查询这些数据行,不能进行update、delete或select...for update操作。
insert / update / delete ... ; 是3的锁。
没有commit之前插入同样的一条记录会没有反应,
因为后一个3的锁会一直等待上一个3的锁, 我们必须释放掉上一个才能继续工作。
创建索引的时候也会产生3,4级别的锁。
locked_mode为2,3,4不影响DML(insert,delete,update,select)操作,
但DDL(alter,drop等)操作会提示ora-00054错误。
有主外键约束时 update / delete ... ; 可能会产生4,5的锁。
DDL语句时是6的锁。
以DBA角色, 查看当前数据库里锁的情况可以用如下SQL语句:
select object_id,session_id,locked_mode from v$locked_object;
select t2.username,t2.sid,t2.serial#,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time;
如果有长期出现的一列,可能是没有释放的锁。
我们可以用下面SQL语句杀掉长期没有释放非正常的锁:
alter system kill session 'sid,serial#';
如果出现了锁的问题, 某个DML操作可能等待很久没有反应。
当你采用的是直接连接数据库的方式,
也不要用OS系统命令 $kill process_num 或者 $kill -9 process_num来终止用户连接,
因为一个用户进程可能产生一个以上的锁, 杀OS进程并不能彻底清除锁的问题。
记得在数据库级别用alter system kill session 'sid,serial#';杀掉不正常的锁。
条件
1
在分析
(analyze)
指定索引之后,查询
index_stats
的
height
字段的值,如果这个值
>=4 ,
则最好重建(
rebuild
)这个索引。虽然这个规则不是总是正确,但如果这个值一直都是不变的,则这个索引也就不需重建。
条件
2
在分析
(analyze)
指定索引之后,查询
index_stats
的
del_lf_rows
和
lf_rows
的值
,
如果
(del_lf_rows/lf_rows)*100 > = 20
,则这个索引也需要重建。
例子
:
SQL > analyze index IND_PK validate structure;
SQL > select name,height,del_lf_rows,lf_rows,(del_lf_rows/lf_rows) *100 from index_stats;
NAME HEIGHT DEL_LF_ROWS LF_ROWS (DEL_LF_ROWS/LF_ROWS)*100
------------------------------ ---------- ----------- ---------- -------------------------
INDX_PK 4 277353 990206 28.0096263
SQL> alter index IND_PK rebuild;
|