2009年5月7日星期四

Linux系统信息查看命令

系统
# uname -a               # 查看内核/操作系统/CPU信息
# head -n 1 /etc/issue   # 查看操作系统版本
# cat /proc/cpuinfo      # 查看CPU信息
# hostname               # 查看计算机名
# lspci -tv              # 列出所有PCI设备
# lsusb -tv              # 列出所有USB设备
# lsmod                  # 列出加载的内核模块
# env                    # 查看环境变量

资源
# free -m                # 查看内存使用量和交换区使用量
# df -h                  # 查看各分区使用情况
# du -sh <目录名>        # 查看指定目录的大小
# grep MemTotal /proc/meminfo   # 查看内存总量
# grep MemFree /proc/meminfo    # 查看空闲内存量
# uptime                 # 查看系统运行时间、用户数、负载
# cat /proc/loadavg      # 查看系统负载

磁盘和分区
# mount | column -t      # 查看挂接的分区状态
# fdisk -l               # 查看所有分区
# swapon -s              # 查看所有交换分区
# hdparm -i /dev/hda     # 查看磁盘参数(仅适用于IDE设备)
# dmesg | grep IDE       # 查看启动时IDE设备检测状况

网络
# ifconfig               # 查看所有网络接口的属性
# iptables -L            # 查看防火墙设置
# route -n               # 查看路由表
# netstat -lntp          # 查看所有监听端口
# netstat -antp          # 查看所有已经建立的连接
# netstat -s             # 查看网络统计信息

进程
# ps -ef                 # 查看所有进程
# top                    # 实时显示进程状态

用户
# w                      # 查看活动用户
# id <用户名>            # 查看指定用户信息
# last                   # 查看用户登录日志
# cut -d: -f1 /etc/passwd   # 查看系统所有用户
# cut -d: -f1 /etc/group    # 查看系统所有组
# crontab -l             # 查看当前用户的计划任务

服务
# chkconfig --list       # 列出所有系统服务
# chkconfig --list | grep on    # 列出所有启动的系统服务

程序
# rpm -qa                # 查看所有安装的软件包

2009年5月6日星期三

DB2之grant

记住下面几个例子就好了,执行之前要连上一个db
db2 grant dbadm on database to user db2admin
db2 grant insert on table sales to group grp1

db2 revoke dbadm on database from user db2admin

网络命令netstat

先记住两个常用的用法
netstat -a
netstat -an

注意只关心listening的就好了
-an会只列出ip和port, -a有些可能只列出service name
service name到...drivers/etc/services里去找对应的端口

2009年4月28日星期二

DB2 之sysadm与dbadm

sysadm与dbadm是DB2中的两个重要的authority
sysadm是Instance的最高authority, 将拥有instance上的所有权限
dbadm是一个db的最高authority, 将拥有一个db上的所有权限

在v95及其之前,sysadm将隐含拥有sysadm的authority

SQL Server隔离级别

下面四种隔离级别允许不同类型的行为。

隔离级别脏读不可重复读取幻像
未提交读
提交读
可重复读
可串行读

2009年4月23日星期四

db2 设置最大连接数

连接到数据库后,用get db cfg for database查看一下maxappls和avg_appls的数值。
用update db cfg for database using maxappls number试试把maxappls设置得更大些。
---------------------------------------------------------------

在控制中心也可以设置
list applications all 可以看到当前的进程

2009年4月22日星期三

Oracle 隔离级别

 

Dirty Read 

NonRepeatable Read 

Phantom Read 

Read uncommitted

Possible

Possible

Possible

Read committed

Not possible

Possible

Possible

Repeatable read

Not possible

Not possible

Possible

Serializable

Not possible

Not possible

Not possible


2009年4月17日星期五

Java多线程

1.多线程中有主内存和工作内存之分, 在JVM中,有一个主内存,专门负责所有线程共享数据;而每个线程都有他自己私有的工作内存, 主内存和工作内存分贝在JVM的stack区和heap区。

2.线程的状态有'Ready', 'Running', 'Sleeping', 'Blocked', 和 'Waiting'几个状态,
'Ready' 表示线程正在等待CPU分配允许运行的时间。


3.线程运行次序并不是按照我们创建他们时的顺序来运行的,CPU处理线程的顺序是不确定的,如果需要确定,那么必须手工介入,使用setPriority()方法设置优先级。

4.我们无从知道一个线程什么时候运行,两个或多个线程在访问同一个资源时,需要synchronized

5. 每个线程会注册自己,实际某处存在着对它的引用,因此,垃圾回收机制对它就“束手无策”了。

6. Daemon线程区别一般线程之处是:主程序一旦结束,Daemon线程就会结束。

7. 一个对象中的所有synchronized方法都共享一把锁,这把锁能够防止多个方法对通用内存同时进行的写操作。synchronized static方法可在一个类范围内被相互间锁定起来。

8. 对于访问某个关键共享资源的所有方法,都必须把它们设为synchronized,否则就不能正常工作。

9. 假设已知一个方法不会造成冲突,最明智的方法是不要使用synchronized,能提高些性能。

10. 如果一个"同步"方法修改了一个变量,而我们的方法要用到这个变量(可能是只读),最好将自己的这个方法也设为 synchronized。

11. synchronized不能继承, 父类的方法是synchronized,那么其子类重载方法中就不会继承“同步”。

12. 线程堵塞Blocked有几个原因造成:

(1)线程在等候一些IO操作 
(2)线程试图调用另外一个对象的“同步”方法,但那个对象处于锁定状态,暂时无法使用。

13.原子型操作(atomic), 对原始型变量(primitive)的操作是原子型的atomic. 意味着这些操作是线程安全的, 但是大部分情况下,我们并不能正确使用,来看看 i = i + 1 , i是int型,属于原始型变量:

(1)从主内存中读取i值到本地内存. 
(2)将值从本地内存装载到线程工作拷贝中. 
(3)装载变量1. 
(4)将i 加 1. 
(5)将结果给变量i. 
(6)将i保存到线程本地工作拷贝中. 
(7)写回主内存. 

注意原子型操作只限于第1步到第2步的读取以及第6到第7步的写, i的值还是可能被同时执行i=i+1的多线程中断打扰(在第4步)。

double 和long 变量是非原子型的(non-atomic)。数组是object 非原子型。



14. 由于13条的原因,我们解决办法是:

class xxx extends Thread{

//i会被经常修改
private int i;

public synchronized int read(){ return i;}

public synchronized void update(){ i = i + 1;}

..........

}

15. Volatile变量, volatile变量表示保证它必须是与主内存保持一致,它实际是"变量的同步", 也就是说对于volatile变量的操作是原子型的,如用在long 或 double变量前。
注意:volatile不一定能保证原子性,如果用jdk1.5, 采用AtomicInteger来实现原子整数

16. 使用yield()会自动放弃CPU,有时比sleep更能提升性能。

17. sleep()和wait()的区别是:wait()方法被调用时会解除锁定,但是我们能使用它的地方只是在一个同步的方法或代码块内。

18. 通过制造缩小同步范围,尽可能的实现代码块同步,wait(毫秒数)可在指定的毫秒数可退出wait;对于wait()需要被notisfy()或notifyAll()踢醒。

19. 构造两个线程之间实时通信的方法分几步:
(1). 创建一个PipedWriter和一个PipedReader和它们之间的管道;
PipedReader in = new PipedReader(new PipedWriter())
(2). 在需要发送信息的线程开始之前,将外部的PipedWriter导向给其内部的Writer实例out
(3). 在需要接受信息的线程开始之前,将外部的PipedReader导向给其内部的Reader实例in
(4). 这样放入out的所有东西度可从in中提取出来。

20. synchronized带来的问题除性能有所下降外,最大的缺点是会带来死锁DeadLock,只有通过谨慎设计来防止死锁,其他毫无办法,这也是线程难以驯服的一个原因。不要再使用stop() suspend() resume()和destory()方法

21. 在大量线程被堵塞时,最高优先级的线程先运行。但是不表示低级别线程不会运行,运行概率小而已。

22. 线程组的主要优点是:使用单个命令可完成对整个线程组的操作。很少需要用到线程组。

23. 从以下几个方面提升多线程的性能:

检查所有可能Block的地方,尽可能的多的使用sleep或yield()以及wait();

尽可能延长sleep(毫秒数)的时间;

运行的线程不用超过100个,不能太多;

不同平台linux或windows以及不同JVM运行性能差别很大。

2009年3月24日星期二

曾国藩12条

曾国藩写过很多关于为人处世的家书,他的部分家书得到很多读者的青睐。

他为自己立下课程十二条:

  1. 主敬:整齐严肃,清明在躬,如日之升。
  2. 静坐:每日不拘何时,静坐四刻,正位凝命,如鼎之镇。
  3. 早起:黎明即起,醒后勿沾恋。
  4. 读书不二:一书未完,不看他书。
  5. 读史:念三史(指《史记》、《汉书》、《后汉书》),每日圈点十页,虽有事不间断。
  6. 谨言:刻刻留心,第一工夫。
  7. 养气:气藏丹田,无不可对人言之事。
  8. 保身:节劳、节欲、节饮食。
  9. 日知其所无:每日读书,记录心得语。
  10. 月无忘其所能:每月作诗文数首,以验积理的多寡,养气之盛否。
  11. 作字:饭后写字半时。
  12. 夜不出门。

2009年3月21日星期六

SQLServer之查找column上的constraint

SQLServer如果column有default value, 竟然会自动创建一个constraint, 名字是随机取的,因此drop column前要先drop这些constraint, 但是知道有哪些关联constraint可不容易:

select
col.name,
col.column_id,
col.default_object_id,
OBJECTPROPERTY(col.default_object_id, N'IsDefaultCnst') as is_defcnst,
dobj.name as def_name
from sys.columns col
left outer join sys.objects dobj
on dobj.object_id = col.default_object_id and dobj.type = 'D'
where col.object_id = object_id(N'dbo.dsyh858375307642')
and dobj.name is not null

2009年3月18日星期三

DB2之执行sql脚本

最普通情况:
db2 -tvf yourfile.sql  脚本中用分号隔开每条语句, !开头的语句表示clp命令

换个分隔符@:
db2 -td@ -vf yourfile.sql 

DB2之db2trc

除了db2diog.log之外的详细trace, 一般是给developer来debug的
一个普通流程:
db2trc on; #打开trace
db2trc clr; #清空之前的trace
do your things
db2trc dump trace.dmp; #导出trace
db2trc off; #关闭trace
db2trc flw trace.dmp trace.flw; #转成flw格式
db2trc fmt trace.dmp trace.fmt; #转成fmt格式

参考:

2009年3月16日星期一

Java的隐藏与覆盖

五大原则:

1. 实例方法被覆盖,静态方法被隐藏

2. 试图用子类的静态方法隐藏父类中同样标识的实例方法是不合法的,编译器将会报错

3. 试图用子类的实例方法覆盖父类中同样标识的静态方法也是不合法的,编译器会报错

4. 静态方法和最终方法(带final的方法)不能被覆盖

5. 实例变量和类变量能被隐藏,被子类的同名变量成员隐藏, “super”可以访问父类中被隐藏的实例变量



2009年3月12日星期四

DB2中有用的系统视图

参考:http://www.devx.com/dbzone/Article/29585/1954

SYSCAT.TABLES
Column Name Data Type Description
TABSCHEMA VARCHAR(128) Stores the schema name on which the database object is defined
TABNAME VARCHAR(128) Stores the name of the database object, such as table, view, nickname, or an alias
TYPE CHAR(1) Identifies the database object as a table, view, alias, or a nickname (The type value 'T' means table; 'V' means view; 'N' means nickname; and 'A' means alias.)
COLCOUNT SMALLINT Number of columns in the table or view
KEYCOLUMNS SMALLINT Number of columns that constitute the primary key
KEYINDEXID SMALLINT Index ID for the primary key
KEYUNIQUE SMALLINT Number of unique constraints in the table or view



SYSCAT.VIEWS
Column Name Data Type Description
VIEWSCHEMA VARCHAR(128) Schema name for the view
VIEWNAME VARCHAR(128) Name of the view
DEFINER VARCHAR(128) User who created the view
VIEWCHECK CHAR(1) Type of view checking defined for this view:
  • N = means no check option
  • L = means local check option
  • C = means cascaded check option
  • READONLY CHAR(1) Defines whether the view is read only or not:
  • Y = means read only
  • N = means view is not read only
  • VALID CHAR(1) Determines the validity of the view:
  • Y = means view is valid
  • X = means view is invalid
  • TEXT CLOB(64K) DDL text for view


    SYSCAT.INDEXES
    Column Name Data Type Description
    INDSCHEMA VARCHAR(128) Name of the schema on which the index is defined
    INDNAME VARCHAR(18) Index name
    DEFINER VARCHAR(128) User who created the index
    TABSCHEMA VARCHAR(128) Stores the schema name of the table on which the index is defined
    TABNAME VARCHAR(128) Stores the name of the table for which index is defined
    COLNAMES VARCHAR(640) List of columns in the index
    UNIQUERULE CHAR(1) Determines whether the index is unique or not:
  • D = means duplicate allowed
  • P = means primary index
  • U = means unique index
  • INDEXTYPE CHAR(4)
  • CLUS = means clustered index
  • REG = means regular index
  • DIM = means dimension block index
  • BLOK = means block index




  • SYSCAT.TRIGGERS
    Column Name Data Type Description
    TRIGSCHEMA VARCHAR(128) Name of the schema on which the trigger is defined
    TRIGNAME VARCHAR(18) Trigger name
    DEFINER VARCHAR(128) User who created the index
    TABSCHEMA VARCHAR(128) Stores the schema name of the table for which the trigger is defined
    TABNAME VARCHAR(128) Name of table for which the trigger is defined
    TRIGTIME CHAR(1)
  • A = means after trigger
  • B = means before trigger
  • I = means instead of trigger
  • TRIGEVENET CHAR(1) Event for which the trigger is defined:
  • I = means INSERT
  • D = means DELETE
  • U = means UPDATE
  • GRANULARITY CHAR(1) Determines whether the trigger is executed per statement or per row:
  • S = means once per statement
  • R = means once per row
  • TEXT CLOB(64K) Full text of the trigger statement




    2009年3月9日星期一

    项目中的教训

    1, 每个迭代没有及时的review, 造成无法快速的响应变化

    2, 虽然defect被良好的跟踪记录了,但是需求和设计的更新没有有效的跟踪和记录,每次更新设计文档的时候都很混乱。应该一开始就用wiki来写文档,每次做review或者讨论的结果都应该及时更新wiki.

    3, 既然团队缺少明确的leader,我应该主动承担leader的一些任务,比如及时更新记录每次review和讨论的结果,这个我做的相当不够

    2009年3月7日星期六

    WAS之Node、Profile、Server与Cell

    关于 Node、Profile 与 Server:
    这三个概念比较容易混淆,我们拿出来对比说明:Node=Profile。Node 是管理上使用的概念,Profile 是实际的概要文件,它们代表同一事物。Server 就是所谓的 Application Server Instance , 这是我们实际要布署 Application 的地方。在IBM WAS ND 产品中受管节点的 Node Agent 目的就是让 Deployment Manager Server 可以透过 Node Agent 来管 Node (Profile) 中的 Application Server Instance,一个 Node (Profile) 中可以有多个 Application Server Instance。

    如果是非 ND 版本 , 则属于 Single Server 版本,那么一个 Node (Profile) 中只能有一个 Application Server Instance,如果你希望在一台机器上有多个 Application Server Instance,那就只能透过创建多个 Profile (Node) 来达成,但这些 Node (Porfile) 彼此独立没有管理上的关系 (RelationShip),只要使用的 TCP/IP Port 不要冲突即可。

    Cell:
    单元是整个分布式网络中一个或多个节点的逻辑分组。单元是一个配置概念,是管理员将节点间逻辑关联起来的实现方法。管理员根据具体的业务环境,制定对其整体系统集成环境有意义的条件来定义和组织构成单元的节点。就一般情况来说,可以将单元看作是最大的作用域。

    参考:http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0705_qihong/index.html

    2009年3月3日星期二

    读《轻松scrm之旅》

    这两天一口读完的这本书,如同读金庸小说血脉贲张,梳理下points:

    1. 迭代(sprint)分的小些比较好,每个sprint都是调整的机会,sprint多了调整的机会也多了,在每个sprint都要完成几个story

    2. 工作task化, story都要细分成task,task是最小的work item(8-10 person-hour工作量最好), 团队成员自主来选择task, 用task面板来管理task, 大家在task面板上能看到所有task的状态.


    3. 每天开scrum每日会议,时间不超过15分钟,大家都站着开,看着task面板轮流发言。每个人回答3个问题,1我昨天做啥了,2今天打算怎么做,3遇到什么困难。会议时间一定要控制,如果有细节应该会下讨论。scrum会议能保证团队之间互相了解,并且及早发现问题。

    4. sprint结尾的review会议非常重要,然后应该紧接着开下个sprint的plan会议。这两个会议是scrum中最最重要的两件事情。

    5. 文档要尽量少而精,最好用wiki来维护

    6. 虽然文档少,但是可以采用结对编程的方法使新人快速上手,结对编程最好用共享桌面或共享IDE的工具来实现。组员之间也应该采用结对的方式来做code review,最好一老带一新。

    7. 第N+1个sprint测试第N个sprint的内容

    2009年3月2日星期一

    今天一点体会

    DCUT上周终于结束了,虽然还留下几个特费劲的defects. 今天release meeting的时候,老板突然提出我们的实现不够smart,哎~,老板说的确实有些道理,可是怎么现在才提出来啊。这次的开发确实有很多不足:

    1. 所谓的迭代根本没起到作用,虽然每个迭代结束都更改了点设计,但是没有认真的做迭代Review和下个迭代的Plan,这两件事至关重要,要是老板的comments上个迭代能提出来就好了

    2. 迭代点不能拖延,做不完的任务应该放到下个迭代,每个迭代点是个非常好的调整机会

    3. Test team介入的还是晚了,导致他们前期无事可做,现在又赶不上进度

    4. Dev Team没有了leader,导致大家讨论太少,code review也做的不够,我应该主动来push

    2009年2月20日星期五

    Linux之FTP

    ftp 命令表
    序号 命 令 功 能
    1 ! 执行本地 shell 命令
    2 $ 执行宏功能
    3 account 发送帐号口令到远程服务器
    4 append 附加到文件中
    5 ascii 设置 ASCII 码传输类型
    6 bell 命令完成时响铃
    7 binaey 设置二进制码传输类型
    8 bye 结束并退出 ftp
    9 case 触发远程文件名大小写变化功能
    10 cd 改变远程工作目录
    11 cdup 把远程工作目录改为其父目录
    12 close 结束 ftp
    13 cr 触发回车换行功能
    14 delete 删除远程文件
    15 debug 触发调试方式
    16 dir 列远程目录
    17 disconnect 结束 ftp
    18 form 设置文件传输格式
    19 get 取文件
    20 glob 触发本地文件名元字母扩展功能
    21 hash 为每个传输缓区触发#号打印功能
    22 help 显示求助信息
    23 lcd 改变本地工作目录
    24 ls 列远程工作目录内容
    25 macdef 定义宏功能
    26 mdelete 删除远程主机上的多个文件
    27 mdir 列多个远程目录的内容
    28 mget 取多个文件
    29 mkdir 在远程主机上建新目录
    30 mls 列多个远程目录的内容
    31 mode 设置文件传输方式
    32 mput 发送多个文件
    33 nmap 设置或取消文件名映射机制
    34 ntrans 设置或取消文件名字符变换机制
    35 open 连接远程主机
    36 prompt 触发交互提示功能
    37 proxy 在辅助控制连接上执行一条 ftp 命令
    38 put 发送一个文件
    39 pwd 显示远程机器上的工作目录
    40 quit 结束并退出 ftp
    41 quote 发送任意 ftp 命令
    42 recv 取文件
    43 remotehelp 取远程主机的求助信息
    44 rename 重新命名远程文件
    45 reset 清除应答队列
    46 rmdir 删除远程主机的一个目录
    47 runique 触发用本地唯一文件名存储功能
    48 send 发送一个文件
    49 sendport 为每个数据连接触发使用 PORT
    50 status 显示当前状态
    51 struct 设置文件传输结构
    52 sunique 触发远程唯一主机文件存储功能
    53 tenex 设置 tenex 文件传输类型
    54 trace 触发分组跟踪功能
    55 type 设置文件传输类型
    56 user 发送新的用户信息
    57 verbose 触发 verbose 方式
    58 xmkdir 生成远程主机目录
    59 xpwd 显示远程主机工作目录
    60 xrmdir 删除远程主机目录
    61 ? 显示本地 ftp 求助信息
    不同的系统,上述命令可能有所差异,可用“?”获得帮助!

    2009年2月19日星期四

    Class.forName()与ClassLoader.loadClass()

    Class.forName()与ClassLoader.loadClass()都可以装载一个类,区别如下

    1. ClassLoader.loadClass()更加底层

    2. Class.forName()除了会load这个类一下还会clazz.newInstance()

    3. 因此 Class.forName()保证了class里面的static块会执行或者初始化

    4. JDBC driver的驱动注册正是在class的static块中完成的

    2009年2月18日星期三

    AOP术语

    Aspect :切面是要实现的交叉功能,是应用系统模块化的一个切面或者领域。切面的最常见的例子是日至记录。
    Join point:连接点是应用程序执行过程中插入切面的地点。这个地点可以是方法调用、异常抛出等
    Advice:通知是切面的具体实现。它通知应用系统新的行为。如日至文件通知包含了实现日至功能的代码。
    Point cut:切入点定义了通知应该应用在哪些连接点。一些AOP框架允许动态创建切入点
    Introduction:引入允许你已存在类添加新的方法和属性。可以在不更改类的前提下引入。
    Target:目标对象是被通知对象。
    Proxy:代理是通知应用程序到目标对象后创建的对象。
    Weaving:织入是将切面应用到目标对象从而创建一个新的代理对象的过程。

    不忙的时候才是最重要的时候!

    最近两个月被手头的工作弄的晕头转向,学习和作息计划经常被打乱,如果之前不忙的时候抓紧时间把该看该学该做的事情都解决了,现在能好过的多啊

    忙的时候就应该专心致志的做好手上的事情,不忙的时候也一定要抓紧时间做好准备

    2009年2月17日星期二

    各种数据库的分页查询

    DB2
    SELECT * FROM (Select 字段1,字段2,字段3, rownumber() over (ORDER BY 排序用的列名 ASC) AS rn from 表名) AS a1 WHERE a1.rn BETWEEN 10 AND 20

    Oracle
    SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40) WHERE RN >= 21

    SQL Server
    select top @pagesize * from table1 where id not in (select top @pagesize*(@page-1) id from table1 order by id) order by id

    MySQL
    select * from table LIMIT 5,10

    SQLPlus登陆

    方法一:(注意必须用双引号把后面的引上)
    sqlplus "user/pwd@dbname as sysdba"

    方法二:
    sqlplus /nolog
    conn user/pwd@dbname as sysdba

    2009年2月16日星期一

    Shell脚本

    参考:http://www.gbunix.com/htmldata/2005_04/14/18/article_1149_1.html

    1.Linux中有好多中不同的shell,但是通常我们使用bash.
    程序必须以下面的行开始(必须方在文件的第一行):
    #!/bin/sh
    符号#!用来告诉系统它后面的参数是用来执行该文件的程序。

    2.当编辑好脚本时,如果要执行该脚本,还必须使其可执行。
    chmod +x filename

    3.注释,
    在进行shell编程时,以#开头的句子表示注释


    4.
    变量

    在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。要赋值给一个变量,您可以这样写:

    变量名=值

    取出变量值可以加一个美元符号($)在变量前面, 在字符串里用${a}

    2009年2月15日星期日

    SQL之DROP COLUMN的workaround

    如果数据库(db2 v8, db2z, db2i)不提供drop column(有的特殊字段也不能drop的,如xml字段),怎么办呢?

    原来的表是t1
    1. 创建表t1', 它不含有应该drop的column
    2. insert into t1' select x,x,x from t1
    3. drop table t1
    4. rename t1' to t1

    DB2之RENAME

    用来改table, view和index的名字

    例如
    RENAME TABLE test.table1 TO newname

    注意新名字里面不要带schema

    2009年2月11日星期三

    Linux之export和shell的关系

    参考:http://doc.linuxpk.com/3862.html
    摘录要点:
    0、export是将自定义变量变成系统环境变量
    1、执行脚本时是在一个子shell环境运行的,脚本执行完后该子shell自动退出;
    2、一个shell中的系统环境变量才会被复制到子shell中 (用export定义的变量);
    3、一个shell中的系统环境变量只对该shell或者它的子shell有效,该shell结束时变量消失(并不能返回 到父shell中)。
    4、不用export定义的变量只对该shell有效,对子shell也是无效的。
    5、一个脚本直接执行和用source执行不一样:直接执行一个脚本文件是在一个子shell中运行的,而source则是在当前shell环境中运行的

    Linux之profile文件zz

    对整个生效的
    etc/profile
    对根的宿主生效
    /root/.bash_profile
    对普通用户生效的
    /home/abc/.bash_profile

    Linux之Source命令zz

    Source命令也称为“点命令”,也就是一个点符号(.)。source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录
    用法:source filename 或 . filename

    还有一个用法,执行多个命令,有点类似shell脚本,参考:http://tech.ccidnet.com/art/305/20080116/1343957_1.html

    2009年2月10日星期二

    Linux之环境变量

    方法1:修改/etc/profile

    (1)用文本编辑器打开/etc/profile

    (2)在profile文件末尾加入:

    JAVA_HOME=/usr/share/jdk1.5.0_05

    PATH=$JAVA_HOME/bin:$PATH

    CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

    export JAVA_HOME

    export PATH

    export CLASSPATH

    (3)重新登录


    方法2:直接用export

    只需在shell终端执行下列命令(换个shell就失效了):

    export JAVA_HOME=/usr/share/jdk1.5.0_05

    export PATH=$JAVA_HOME/bin:$PATH

    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

    2009年2月9日星期一

    Informix之初体验

    看了一评论说Informix10是不能再糟糕的产品,昨天装了Informix11,发现这款产品也很让人抓狂啊。装的时候被胡乱装了一堆东西,装完后开始菜单一堆东西,而且装的时候有些组件的默认路径竟然是temp,太弱智了啊,以下是我的一点总结:

    1. 装完后会创建一个server,名字类似ol_ids_1150_1,也就相当于一个instance,然后这个server会作为一个服务,到windows/system32/drivers/etc/services里去找他的对应得端口,这个server的名称在JDBC URL里会用到

    2. 没有图形界面的管理工具,有个叫做dbaccess的文本管理界面,极土无比让人发指,但是也有一些第三方的web管理工具

    3. Jdbc驱动还要安装一下才能用,到安装文件目录里去找安装文件吧,URL的形式为jdbc:informix-sqli://localhost:9088/mydb:INFORMIXSERVER=ol_ids_1150_1
    驱动名:com.informix.jdbc.ifxDriver

    4. Infocenter: http://publib.boulder.ibm.com/infocenter/idshelp/v111/index.jsp

    2009年2月3日星期二

    Linux之chkconfig(zz)

    chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息

    列出系统所有的服务启动情况:
    # chkconfig –list

    想列出mysqld服务设置情况:
    #chkconfig –list mysqld

    设定mysqld在等级3和5为开机运行服务:
    # chkconfig –level 35 mysqld on
    –level 35表示操作只在等级3和5执行,on表示启动,off表示关闭

    设定mysqld在各等级为on:
    # chkconfig mysqld on
    “各等级”包括2、3、4、5等级
    等级0表示:表示关机
    等级1表示:单用户模式
    等级2表示:无网络连接的多用户命令行模式
    等级3表示:有网络连接的多用户命令行模式
    等级4表示:不可用
    等级5表示:带图形界面的多用户模式
    等级6表示:重新启动

    如何增加一个服务:
    首先,服务脚本必须存放在/etc/ini.d/目录下;
    其次,需要用chkconfig –add servicename来在chkconfig工具服务列表中增加此服务,此时服务会被在/etc/rc.d/rcN.d中赋予K/S入口了。
    最后,你就可以上面教的方法修改服务的默认启动等级了。

    删除一个服务:
    # chkconfig –del servicename

    DB2之SQL优化

    这个题目太大,先开个头, 后面再补充

    1. 用索引(废话), 建了索引还要经常RUNSTATS

    2. exists比in快

    3. 少用select *, 不但慢还不好维护

    4.

    2009年2月2日星期一

    Linux之用户和组

    参考文章:http://fedora.linuxsir.org/main/?q=node/91

    1. User
    1.1 配置文件
    /etc/passwd 注:用户(user)的配置文件;
    /etc/shadow 注:用户(user)影子口令文件;

    1.2 常用命令
    useradd/adduser 注:添加用户
    passwd 注:为用户设置密码
    usermod 注:修改用户命令,可以通过usermod 来修改登录名、用户的家目录等等;
    finger 注:查看用户信息工具
    id 注:查看用户的UID、GID及所归属的用户组
    chfn 注:更改用户信息工具
    su 注:用户切换工具
    sudo 注:sudo 是通过另一个用户来执行命令(execute a command as another user)
    whoiam 查看当前用户
    groups 查看当前用户所在的组


    2. Group
    2.1 配置文件
    /etc/group 注:用户组(group)配置文件;
    /etc/gshadow 注:用户组(group)的影子文件;

    2.2 常用命令
    groupadd 注:添加用户组;
    groupdel 注:删除用户组;
    groupmod 注:修改用户组信息
    groups 注:显示用户所属的用户组

    SQL之BETWEEN...AND

    只有一点要说,BETWEEN …AND…搜索的是闭区间

    2009年1月26日星期一

    Association

    1. Association(关联), 最质朴的关系,A类有一个B类成员变量,就是Assocication

    2. Aggregation(聚合),Association的一种,无环的Association就是Aggregation

    3. Composition(合成),Aggregation的一种,比聚合强,不能共享的Aggregation就是Composition

    4. Dependency(依赖),一般而言,局部变量,方法的参变量,静态方法调用所产生的对其他类的引用成为依赖

    2009年1月22日星期四

    Eclipse之alt+/失灵

    在 Window - Preferences - General - Keys 内
    1、把word completion的快捷键设置alt+C
    2、把Content Assist的快捷键由ctrl+space改成alt+/

    DB2之FETCH FIRST

    注意是FETCH FIRST不是FETCH
    相当于SQL Server的top语句,
    SELECT * FROM TABLE1 FETCH FIRST 100 ROWS ONLY

    DB2之Table Volatile

    当一个表在执行期变化很大时,就是说一会儿空一会儿满,可以考虑设置volatile来优化它,这样优化器会通过索引来扫描它从而优化性能
    ALTER TABLE  VOLATILE CARDINALITY 

    2009年1月21日星期三

    Eclipse之Console中的乱码

    在Run...的“common” 选项卡(Tab)中设置
    里面有一项叫做Console Encoding,默认是设置成项目的Encoding,如果我们的控制台输出的字符是UTF-8编码的话,就需要在这里UTF-8;同理,可以根据实际情况改成其他的编码方式。

    我设成UTF-8就能显示正确了

    2009年1月20日星期二

    Linux之SVN

    今天只是勉强装上了SVN,但是并没有连通,哎,下次再来
    原帖:http://www.cnblogs.com/lansh/archive/2008/02/14/1068999.html

    按原帖安装会遇到点麻烦,下面是我修正过的

    1. svn服务器安装

    操作系统: Redhat Linux AS4

    安装包获取:
    下载http://subversion.tigris.org/downloads/subversion-1.4.0.tar.gz和http: //subversion.tigris.org/downloads/subversion-deps-1.4.0.tar.gz。

    编译:
    以root用户登录。
    将subversion-1.4.0.tar.gz和subversion-deps-1.4.0.tar.gz传到服务器。

    tar xfvz subversion-1.4.0.tar.gz
    tar xfvz subversion-deps-1.4.0.tar.gz
    cd subversion-1.4.0
    ./configure --prefix=/opt/svn --without-berkeley-db –with-zlib
    (注:以svnserve方式运行,不加apache编译参数。以fsfs格式存储版本库,不编译berkeley-db)
    make clean
    make
    make install

    make时候可能会出错,需要到更改 neon/src/Makefile中的
    CFLAGS = -fPIC -g -02

    vi /etc/profile,在/etc/profile最后加入:
    PATH=$PATH:/opt/svn/bin
    export PATH

    测试:
    svnserve –version

    如果显示如下,安装成功:
    svnserve, version 1.4.0 (r21228)
    compiled Oct 12 2006, 10:18:56

    Copyright (C) 2000-2006 CollabNet.
    Subversion is open source software, see http://subversion.tigris.org/
    This product includes software developed by CollabNet (http://www.Collab.Net/).

    The following repository back-end (FS) modules are available:

    * fs_fs : Module for working with a plain file (FSFS) repository.

    2. svn配置
    建立版本库目录,可建多个:
    mkdir -p /opt/svndata/repos1
    mkdir -p /opt/svndata/repos2

    建立版本库:
    svnadmin create /opt/svndata/repos1
    svnadmin create /opt/svndata/repos2

    修改版本库配置文件:
    版本库1:
    vi /opt/svndata/repos1/conf/svnserve.conf

    内容修改为:
    [general]
    anon-access = none
    auth-access = write
    password-db = /opt/svn/conf/pwd.conf
    authz-db = /opt/svn/conf/authz.conf
    realm = repos1

    版本库2:
    vi /opt/svndata/repos2/conf/svnserve.conf

    内容修改为:
    [general]
    anon-access = none
    auth-access = write
    password-db = /opt/svn/conf/pwd.conf
    authz-db = /opt/svn/conf/authz.conf
    realm = repos2

    即除realm = repos2外,其他与版本库1配置文件完全相同。如果有更多的版本库,依此类推。

    配置允许访问的用户:
    vi /opt/svn/conf/pwd.conf

    为了简化配置,2个版本库共用1个用户配置文件。如有必要,也可以分开。

    注意:对用户配置文件的修改立即生效,不必重启svn。

    文件格式如下:
    [users]
    <用户1> = <密码1>
    <用户2> = <密码2>

    其中,[users]是必须的。下面列出要访问svn的用户,每个用户一行。示例:
    [users]
    alan = password
    king = hello

    配置用户访问权限:
    vi /opt/svn/conf/authz.conf

    为了简化配置,3个版本库共用1个权限配置文件/opt/svn/conf/pwd.conf。如有必要,也可以分开。文件中定义用户组和版本库目录权限。

    注意:
    * 权限配置文件中出现的用户名必须已在用户配置文件中定义。
    * 对权限配置文件的修改立即生效,不必重启svn。

    用户组格式:
    [groups]
    <用户组名> = <用户1>,<用户2>
    其中,1个用户组可以包含1个或多个用户,用户间以逗号分隔。

    版本库目录格式:
    [<版本库>:/项目/目录]
    @<用户组名> = <权限>
    <用户名> = <权限>

    其中,方框号内部分可以有多种写法:
    /,表示根目录及以下。根目录是svnserve启动时指定的,我们指定为/opt/svndata。这样,/就是表示对全部版本库设置权限。
    repos1:/,表示对版本库1设置权限
    repos2:/occi, ,表示对版本库2中的occi项目设置权限
    repos2:/occi/aaa, ,表示对版本库2中的occi项目的aaa目录设置权限

    权限主体可以是用户组、用户或*,用户组在前面加@,*表示全部用户。权限可以是w、r、wr和空,空表示没有任何权限。

    示例:
    [groups]
    admin = alan

    [/]
    @admin = rw

    [repos1:/occi/aaa]
    king = rw

    [repos2:/pass]
    king =

    删除无用文件:
    rm /opt/svndata/repos1/conf/authz
    rm /opt/svndata/repos1/conf/passwd
    rm /opt/svndata/repos2/conf/authz
    rm /opt/svndata/repos2/conf/passwd

    3. 启动svn
    建立启动svn的用户:
    useradd svn
    passwd svn
    根据提示为用户svn设置密码

    允许用户svn访问版本库:
    chown –R svn:svn /opt/svndata
    chown –R svn:svn /opt/data

    启动svn
    su - svn -c "svnserve -d --listen-port 9999 -r /opt/svndata"

    其中:
    su – svn表示以用户svn的身份启动svn
    -d表示以daemon方式(后台运行)运行
    --listen-port 9999表示使用9999端口,可以换成你需要的端口。但注意,使用1024以下的端口需要root权限
    -r /opt/svndata指定根目录是/opt/svndata

    检查:
    ps –ef|grep svnserve

    如果显示如下,即为启动成功:
    svn    6941   1 0 15:07 ?    00:00:00 svnserve -d --listen-port 9999 -r /opt/svndata

    4. 以服务方式启动svn

    在文件/etc/services
    添加一行:
    svn 3690/tcp # SVN
    在文件夹/etc/xinetd.d/创建文件svn,内容为
    service vnc
    {
    disable = no
    socket_type = stream
    protocol = tcp
    wait = no
    user = root
    server = /usr/local/bin/svnserve
    server_args = -i -r /opt/svndata
    }
    运行/etc/rc.d/init.d/xinetd restart
    使上面的配置生效。

    Linux之CVS

    今天装SVN失败,还是装了CVS
    原帖:http://www.chinaitpower.com/A/2003-12-22/66055.html
    下面只摘录出安装过程:

    首先确保系统安装有cvs:
    [root@mail xinetd.d]# rpm -qa|grep cvs
    cvs-1.11.1p1-3
    如果命令输出类似于上面的输出则说明系统已经安装有cvs,否则就需要从安装光盘中安装cvs的rpm包。

    一 创建CVS属主用户:
    # useradd -d /cvsroot cvs
    # chmod 771 /cv sroot

    二、建立CVS仓库(初始化cvs)

    # su cvs
    $ cvs -d /cvsroot init
    $exit
    #

    四、启动cvs服务器

    在/etc/xinetd.d/目录下创建文件cvspserver,内容如下:
    # default: on
    # description: The cvs server sessions;

    service cvspserver
    {
    socket_type = stream
    wait = no
    user = root
    server = /usr/bin/cvs
    server_args = -f --allow-root=/cvsroot pserver
    log_on_failure += USERID
    only_from = 192.168.0.0/24
    }
    其中only_from是用来限制访问的,可以根据实际情况不要或者修改。
    修改该文件权限:
    # chmod 644 cvspserver
    然后重新启动xinetd:
    # /etc/rc.d/init.d/xined restart
    然后察看cvs服务器是否已经运行:
    [root@mail xinetd.d]# netstat -lnp|grep 2401
    tcp 0 0 0.0.0.0:2401 0.0.0.0:* LISTEN 7866/xinetd
    则说明cvs服务器已经运行。

    五、创建用来访问cvs的用户

    前面创建的cvs用户是cvs仓库管理用户,而为了让用户访问则还需要一个访问用户:
    # useradd cvspub
    # usemod -G cvs cvspub
    这里添加了一个用户cvspub,并且将该用户添加到cvs组中。

    2009年1月17日星期六

    Linux之权限

    参考:http://linux.chinaitlab.com/safe/38178.html

    1. 每个文件属于一个用户和一个组, 这是 Linux 中权限模型的核心

    2. ls -l 完整列出文件或者目录信息,可以看到下面的
    drwxr-xr-x 6 root root 4096 2008-12-25 22:51 windows

    2.1 首字符d表示目录, 其他可能的首字符:-常规文件, l符号链接, c字符专门设备文件, b块专门设备文件, p先进先出, s套接字
    2.2 第一个3元组rwx表示文件所有者有读写执行的权限
    第二个3元组r-x表示文件所有组有读和执行的权限
    第二个3元组r-x表示文件其他用户有读和执行的权限
    2.3 6代表链接数
    2.4 root root表示所有者为root, 所有组为root

    3. 改变文件属性和权限的3个命令
    chown, 改所有者,只有root可以用
    chgrp, 改所有组
    chmod, 改权限

    4. 数字模式
      rwx 7
      rw- 6
      r-x 5
      r-- 4
      -wx 3
      -w- 2
      --x 1
      --- 0

    所以777 == rwxrwxrwx
    0777这种4位权限的第一位数用来设置 suid sgid sticky位, 他的模式数字 on on on 7 on on off 6 on off on 5 on off off 4 off on on 3 off on off 2 off off on 1 off off off 0

    5. umask
    当一个进程创建一个文件时,会给他一个默认参考权限,他就是umask,
    umask也是个命令来设置umask, umask 0077表示对此文件关闭0077权限,将确保组和其他用户对于新创建的文件绝对没有任何权限

    6. suid/sgid
    当设置了一个可执行程序的“suid”这一位时,它将代表可执行文件的所有者运行,而不是代表启动程序的人运行
    看考suid/sgid的介绍

    2009年1月16日星期五

    DB2之Special registers

    Special register类似系统方法,可以在sql直接用,最知名的莫过于CURRENT TIMESTAMP,CURRENT DATE了,所以到文档里去找查询系统时间的系统方法是找不到的。

    所有Special registers的定义:http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=/com.ibm.db2.udb.admin.doc/doc/r0008404.htm

    DB2之JDBC

    1. 首先有两种driver, 旧的和新的
    • 旧的 CLI 驱动程序 (称CLI driver) 类名为COM.ibm.db2.jdbc.app.DB2Driver,物理表示是 db2java.zip 文件
    • 新的 JDBC 通用驱动程序 (称Universal driver, 也可称JCC driver)类名为com.ibm.db2.jcc.DB2Driver, 物理表示是 db2jcc.jar 文件, 对于不同的系统还需要个license的jar
    2. DB2 dirver有4种类型Type1-Type4,真够乱其实有用的主要是Type2和Type4

    Type2需要客户端装了DB2客户端并且把源数据库catalog过来,jdbc会调用本地库
    URL Pattern:jdbc:db2:databasename
    CLI和Universal driver都支持Type2

    Type4是纯java, 不用装任何额外的东西
    URL Pattern:jdbc:db2://ServerIP:50000/databasename
    注意了只有Universal driver才支持Type4

    除此之外Type1没啥用,Type3只有CLI支持,但类名不太一样

    参考:
    http://www.ibm.com/developerworks/db2/library/techarticle/dm-0512kokkat/
    http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0512kokkat/index.html

    2009年1月15日星期四

    Linux之系统目录

    列几个常用的

    /etc 放配置文件,里面有很多子目录针对各方面的配置,如group, user之类
    /dev 放设备文件
    /bin 放命令,这个容易
    /sbin 也放命令,但放的都是高级命令,普通用户都用不了
    /root root的home
    /home 其他用户的home, 每个用户在里面都有个目录
    /lib 放系统需要的库,好懂
    /usr 就是linux下的Program Files, 用户安的很多都放在/usr/local
    /var 包括系统一般运行时要改变的数据

    2009年1月14日星期三

    DB2之runstats

    注意是runstats,目的就是向DB2的优化器提供信息,这样DB2在执行SQL等命令时可以根据表的实际情况做出优化,选择最好的ACCESS PLAN。
    表:
    RUNSTATS ON TABLE <表名>
    索引:
    RUNSTATS ON TABLE <表名> FOR INDEXES ALL
    表和索引:
    RUNSTATS ON TABLE <表名> AND INDEXES ALL
    一个用法:
    发生大量修改(更新、插入、删除)后,先运行RUNSTAT,再REORGCHK一下,对有必要需要表REORG的运行REORG命令。然后在用RUNSTAT统计信息这样表的使用空间和使用效率都可以得到交好的提高

    2009年1月13日星期二

    vi之三种模式

    1. 命令行模式(command mode)

      进入vi之后,是处于「命令行模式(command mode)」, 在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,

    2. 插入模式(Insert mode)

      只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。

    3). 底行模式(last line mode)

      一般我们在使用时把vi简化成两个模式,就是将底行模式(last line mode)也算入命令行模式command mode)。在「命令行模式(command mode)」下,按一下「:」冒号键进入「Last line mode」,然后可以做以下事情:
    : w filename (输入 「w filename」将文章以指定的文件名filename保存)
    : wq (输入「wq」,存盘并退出vi)
    : q! (输入q!, 不存盘强制退出vi)

    Linux之find

    功能虽然很强大,但先记住下面这个就够了

    $find /opt/ -name "db2*" //在opt目录下找出db2开头的文件

    2009年1月11日星期日

    DB2之db2set

    db2set是用来设置db2实例的profile registries,总之profile registries要比实例的configuration parameters要大一点,比系统环境变量小一点

    1. db2set -lr //列出所有profile registries

    2. db2set registry_variable = value //设值

    3. db2set registry_variable = //恢复成默认值

    DB2之catalog

    参考:http://hi.baidu.com/%BF%B5%BD%A1/blog/item/94e70708062ff433e9248887.html

    1. 把远程机器catalog到一个node
    db2 catalog tcpip node p570 remote 172.10.10.10 server 50000
    节点其实就是把远程服务器映射到本地,类似指向远程服务器和实例的地址指针

    2. 把远程数据库catalog到这个node上
    db2 catalog db REMOTEDB at node p570
    可以理解为把远程服务器实例下的数据库映射到本地为一个别名

    备注:在catalog之前保证远程实例的profile  variables中DB2COMM=TCPIP,用下面的命令设置
    db2set DB2COMM=TCPIP

    2009年1月9日星期五

    Linux之管道命令

    其实就是一个 |
    它表示左边的命令的输出是右边命令的输入
    例如: ps -ef | grep db2*
    当然一条命令还可能有更多|, 左边输入右边输出,这就是为啥叫管道

    Linux之grep

    grep其实就是一个查询工具,使用正则表达式
    可以这么用
    ls -al | grep sys* //列出sys开头的文件
    也可以这么用
    ps -ef | grep sys* //列出sys开头的进程

    2009年1月8日星期四

    DB2之查看错误代码

    db2 ? SQL30081N

    看trace
    /home/db2inst1/sqllib/db2dump/db2diag.log

    2009年1月7日星期三

    Linux之查看当前用户

    1. $who //就这么简单
    2. $w //更简单
    3. $whoami //yes, who am I
    4. $who am i //真的可以啊
    5. $logname
    6. $last $last n //上次和上几次的用户
    7. $tty //报告所有连接的设备

    Linux之ps

    #ps -ef //查看所有进程和详细信息

    #ps -ef | grep db2 //查看db2的所有进程

    //TODO 补充更多...

    Linux之后台运行程序

    1.在命令结尾放个&如
    #/home/start.sh &

    2.nohup
    #
    nohup /home/start &

    前一种只对守护进程长期有效,即使关掉终端也不会停掉,后一种使所有进程都长期后台执行

    Linux之cat

    作用:把文件或屏幕内容输出到一个文档

    1. cat file1 > file2 输出文件1到文件2
    2. cat file1 file2 >> file3 把俩文件连起来输出到第三个
    3. cat > file1, 然后在屏幕上输入,按ctrl+c结束
    4. cat /dev/null > file1, 清空file1

    参数:
    -n 或 --number 由 1 开始对所有输出的行数编号
    -b 或 --number-nonblank 和 -n 相似,只不过对于空白行不编号
    -s 或 --squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行
    -v 或 --show-nonprinting

    2009年1月5日星期一

    Linux之清空文件

    1. cat > 文件名
    2. 然后ctrl-c

    或者
    cat /dev/null > 文件名

    用于清空log很管用

    2009年1月4日星期日

    Sofware之Jarnal

    打草稿软件,可以给PDF做批注
    link: http://www.dklevine.com/general/software/tc1000/jarnal.htm

    在linux下有类似的xournal
    link: http://xournal.sourceforge.net/

    DB2之Instance管理

    1.创建
    db2icrt instance_name //windows

    db2icrt -u fanced_user instance_name //linux or unix
    User-defined functions and stored procedures, by default, are created in fenced mode so that these processes run in a different address space than the DB2 engine

    2.删除
    db2idrop -f instance_name

    3.查看
    db2ilist //list

    4.Migration
    db2imigr instance_name //从32位migrate到64位

    5.Update
    db2iupdt instance_name //打了fix pack就需要update

    Word之转大小写

    Shift+F3

    2009年1月3日星期六

    Linux之删除文件和目录

    rm myfile.txt 删除文件
    rm -rf myfolder 强制删除整个目录,包括所有子目录和文件, -f的意思是强制没有提示, -r是第归