随笔-159  评论-114  文章-7  trackbacks-0
  2005年10月24日
     摘要: 最近在funplus做游戏,进而研究了一个新型架构。之前做游戏都是自己使用java搭建架构,经过几年的积累确实也达到了最初的设想,多进程,进程内多线程,无锁,0延迟纯jdbc写库。对于单服架构来说,已经趋近于极致。今年小游戏盛行,如海盗来了,疯狂游戏那家公司,全部使用的都是go+mongodb实现的,因为go的语言级别支援高并发,这点是java无法比拟的。不过java开源项目多,有很多的高手铺垫了...  阅读全文
posted @ 2018-11-13 14:29 北国狼人的BloG 阅读(1560) | 评论 (0)编辑 收藏
好久不写blog了,我都已经从完美-》创业-》创业失败-》开心网-》创业-》创业失败-》蓝港-》funplus走了很多的历程了。
posted @ 2018-11-13 11:31 北国狼人的BloG 阅读(156) | 评论 (0)编辑 收藏
那我给你解释下RSA吧,尽量让你看懂:
*RSA是非对称加密体系,也就是说加密用一个公钥,解密用一个私钥,这2个密钥不同,这点非常非常重要。

其实RSA非常简洁,但很美

流程
1,寻找2个大的素数p,q  n=p*q=33  N=(p-1)*(q-1)=20
公钥e一般是3 私钥d要通过公钥e去算出来
e*d=1(mod N) 就是说e和d的乘积模N得1 也就是e和d关于模N互为逆元
3*7=1(mod 20) 可知d=7

加密的明文设为M 加密后的密文设为c
加密过程:C=M^e(mod n)
解密过程:M=C^d(mod n)

举个具体的例子 假如M=2
加密过程:C=2^3(mod 33)=8(mod 33)
解密过程:M=8^7(mod 33)=2097152(mod 33)=2(mod 33) 可以看出和和本来的明文是相同的。

原理可以理解为 M=M^(ed)  (mod n)
本例中 e*d=21  也就是是M^21次方等于M
RSA这个特性是数论中的费马定理推出的

在讲讲细节 比如楼主加密的是26的字母 就当明文的值是从1到26
就拿n=33说吧 加密后的密文的值是1到33 这很正常
但是解密后 一定和明文的值相同 也就是1到26

实际情况中 公钥e是公开的 私钥d是保密的
比如甲要给乙发个东西 乙的公钥由于是公开的 所以甲知道 但甲不知道乙的私钥
甲先用乙的公钥加密  之后 这个密文只能用乙的私钥 由于乙的私钥是保密的 只有他自己知道 所以保证了安全

RSA最大的安全问题是 n的分解 只要把n分解为p*q 则N=(p-1)(q-1)
根据 e*d=1(mod N) 就可以通过e算出d 那么私钥都被人算出来了 也就没安全性而言了
不过可惜的是 大数分解是一个单向的函数 你算知道p,q算n很容易,但是知道n算出p,q相当难

强调一句 n是加密解密用的 N是知道e算d的

楼主也没说你要干嘛 想看懂就这么多
如果要实现这个算法:
必须知道2点:
1.p,q这个两个大素数的生成,这牵扯到素性检验,数论中是一章的内容,没法和你展开
2.取模运算,由于加密解密过程可能取一个数的几十次方的模数,所以这个必须用简便的算法来化解复杂度,也就是模重复平方算法。

如果要编程中使用,太容易了
去下个dll
在java中 直接有可用于RSA的类 相当容易


 

对称加密算法,非对称加密算法 

 
 

常见的加密算法可以分成三类,对称加密算法,非对称加密算法和Hash算法。

对称加密

指加密和解密使用相同密钥的加密算法。对称加密算法的优点在于加解密的高速度和使用长密钥时的难破解性。假设两个用户需要使用对称加密方法加密然后交换数据,则用户最少需要2个密钥并交换使用,如果企业内用户有n个,则整个企业共需要n×(n-1) 个密钥,密钥的生成和分发将成为企业信息部门的恶梦。对称加密算法的安全性取决于加密密钥的保存情况,但要求企业中每一个持有密钥的人都保守秘密是不可能的,他们通常会有意无意的把密钥泄漏出去——如果一个用户使用的密钥被入侵者所获得,入侵者便可以读取该用户密钥加密的所有文档,如果整个企业共用一个加密密钥,那整个企业文档的保密性便无从谈起。

常见的对称加密算法有DES、3DES、Blowfish、IDEA、RC4、RC5、RC6和AES

非对称加密

指加密和解密使用不同密钥的加密算法,也称为公私钥加密。假设两个用户要加密交换数据,双方交换公钥,使用时一方用对方的公钥加密,另一方即可用自己的私钥解密。如果企业中有n个用户,企业需要生成n对密钥,并分发n个公钥。由于公钥是可以公开的,用户只要保管好自己的私钥即可,因此加密密钥的分发将变得十分简单。同时,由于每个用户的私钥是唯一的,其他用户除了可以可以通过信息发送者的公钥来验证信息的来源是否真实,还可以确保发送者无法否认曾发送过该信息。非对称加密的缺点是加解密速度要远远慢于对称加密,在某些极端情况下,甚至能比非对称加密慢上1000倍。

常见的非对称加密算法有:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)

Hash算法

Hash算法特别的地方在于它是一种单向算法,用户可以通过Hash算法对目标信息生成一段特定长度的唯一的Hash值,却不能通过这个Hash值重新获得目标信息。因此Hash算法常用在不可还原的密码存储、信息完整性校验等。

常见的Hash算法有MD2、MD4、MD5、HAVAL、SHA

加密算法的效能通常可以按照算法本身的复杂程度、密钥长度(密钥越长越安全)、加解密速度等来衡量。上述的算法中,除了DES密钥长度不够、MD2速度较慢已逐渐被淘汰外,其他算法仍在目前的加密系统产品中使用

posted @ 2012-03-15 15:37 北国狼人的BloG 阅读(1152) | 评论 (0)编辑 收藏

千橡与我,一个公司与员工之间就像恋人一样,从最早的相识,相爱,拼搏,挽留,平淡,最终不再继续走下去。

其实都还相爱,但必须面对现实,不再会被记忆和离开时产生的痛苦蒙蔽自己的双眼。

posted @ 2011-08-28 13:49 北国狼人的BloG 阅读(1169) | 评论 (0)编辑 收藏
netstat -nlpt 看80端口有没有httpd服务
ps aux | grep httpd 看有没有httpd进程

locate httpd

service httpd status

service httpd configtest
posted @ 2011-01-19 16:26 北国狼人的BloG 阅读(1103) | 评论 (0)编辑 收藏

javac

 

用法:javac <选项> <源文件>
其中,可能的选项包括:
  -g                                                       生成所有调试信息
  -g:none                                             不生成任何调试信息
  -g:{lines,vars,source}                    只生成某些调试信息
  -nowarn                                            不生成任何警告
  -verbose                                           输出有关编译器正在执行的操作的消息
  -deprecation                                    输出使用已过时的 API 的源位置
  -classpath <路径>                          指定查找用户类文件的位置
  -cp <路径>                                       指定查找用户类文件的位置
  -sourcepath <路径>                       指定查找输入源文件的位置
  -bootclasspath <路径>                  覆盖引导类文件的位置
  -extdirs <目录>                               覆盖安装的扩展目录的位置
  -endorseddirs <目录>                   覆盖签名的标准路径的位置
  -d <目录>                                        指定存放生成的类文件的位置
  -encoding <编码>                          指定源文件使用的字符编码
  -source <版本>                              提供与指定版本的源兼容性
  -target <版本>                                 生成特定 VM 版本的类文件
  -version                                            版本信息
  -help                                                 输出标准选项的提要
  -X                                                      输出非标准选项的提要
  -J<标志>                                          直接将 <标志> 传递给运行时系统

jar


用法:jar {ctxu}[vfm0Mi] [jar-文件] [manifest-文件] [-C 目录] 文件名 ...
选项:
    -c  创建新的存档
    -t  列出存档内容的列表
    -x  展开存档中的命名的(或所有的〕文件
    -u  更新已存在的存档
    -v  生成详细输出到标准输出上
    -f  指定存档文件名
    -m  包含来自标明文件的标明信息
    -0  只存储方式;未用ZIP压缩格式
    -M  不产生所有项的清单(manifest〕文件
    -i  为指定的jar文件产生索引信息
    -C  改变到指定的目录,并且包含下列文件:
如果一个文件名是一个目录,它将被递归处理。
清单(manifest〕文件名和存档文件名都需要被指定,按'm' 和 'f'标志指定的相同顺序。
示例1:将两个class文件存档到一个名为 'classes.jar' 的存档文件中:
       jar cvf classes.jar Foo.class Bar.class
示例2:用一个存在的清单(manifest)文件 'mymanifest' 将 foo/ 目录下的所有
           文件存档到一个名为 'classes.jar' 的存档文件中:
       jar cvfm classes.jar mymanifest -C foo/ .

java



用法: java [-选项] 类 [参数...]
           (执行一个类)
   或者 java [-选项] -jar jar文件 [参数...]
           (执行一个jar文件)
其中,可能的选项包括:
    -client       选择 "client" VM(ginger547:应该是指Virtual Machine)
    -server     选择 "server" VM
    -hotspot      与 "client" VM同义  [不赞成]
                  默认情况的VM是client.
    -cp <一个文件夹和zip/jar文件组成的类搜索路径>
    -classpath <一个文件夹和zip/jar文件组成的类搜索路径>
                 一个由文件夹,JAR压缩文件,或者ZIP压缩文件组成的用来搜索类的列表
    -D<名字>=<值>
                  设置一个系统属性
    -verbose[:class|gc|jni]
                  使详细输出变的可用
    -version      打印产品版本然后退出
    -version:<值>
                  只运行指定版本
    -showversion  打印产品版本后继续
    -jre-restrict-search | -jre-no-restrict-search
                  在版本搜索的时候,包含/排除用户私人的JRE
    -? -help      打印帮助信息
    -X            打印非标准选项帮助
    -ea[:<包名>...|:<类名>]
    -enableassertions[:<包名>...|:<类名>]
                 使断言可用
    -da[:<包名>...|:<类名>]
    -disableassertions[:<包名>...|:<类名>]
                  是断言不可用
    -esa | -enablesystemassertions
                  使系统级断言可用
    -dsa | -disablesystemassertions
                  使系统级断言不可用
    -agentlib:<库名>[=<选项>]
                  加载本地代理库<库名>,例如. -agentlib:hprof
                  同时可查看, -agentlib:jdwp=help和 -agentlib:hprof=help
    -agentpath:<路径名>[=<选项>]
                  通过全路径名来加载本地代理库
    -javaagent:<jar路径>[=<选项>]
                 加载Java编程语言代理,可查看 java.lang.instrument

posted @ 2010-12-09 12:55 北国狼人的BloG 阅读(1904) | 评论 (0)编辑 收藏
http://game-develop.net/blog/?p=17
posted @ 2010-12-01 13:33 北国狼人的BloG 阅读(269) | 评论 (0)编辑 收藏

select a.id,a.nickname from t_player a , t_player b where a.id != b.id and a.nickname = b.nickname

查询重复数据 都列出来

select id,nickname from t_player group by nickname having count(*) > 1;

查询所有重名的数据 只列出不同的。


如果想删除相关数据,那样非得要用in了。最好写程序,用prepareStatement去更新,in是不能用索引的,所以超级慢,所以程序优化相关数据库的操作是很有必要的。
posted @ 2010-08-19 17:27 北国狼人的BloG 阅读(1142) | 评论 (0)编辑 收藏
这个软件又好用,又实用,能缩放,比Captivate 好用多了。

posted @ 2010-06-29 16:58 北国狼人的BloG 阅读(1197) | 评论 (0)编辑 收藏

 传统我们都是定一个类型,带T的

public class RandomSelection<T> {

  
private java.util.Random random = new Random();

  
private ArrayList<T> list;

  
public RandomSelection() {

     list 
= new ArrayList<T>();

  }


  
public void add(T element) {

     list.add(element);

  }


  
public T getRandomElement() {

     
int index = random.nextInt(list.size());

     
return list.get(index);

  }



}


直接来使用。当我们new RandomSelection<String>()  new RandomSelection<Integer>() 的时候,里面的方法的类型,也就确定了。

public interface ISomeReason<extends Enum<X>> {

   
public X getImplClassType();

}

实现一个子类。这里看到继承是传入了接口泛型中的X参数,参数就是实现类自己的类型。

public enum ATypeReason implements ISomeReason<ATypeReason> {

   ABC(
1),
   DEF(
2),

   ;
   
int index;

   
private ATypeReason(int param)
   
{
      
this.index = param;
   }


   
public int getIndex()
   
{
       
return this.index;
   }


   @Override
   
public ATypeReason getImplClassType() {
      
return this
   }


}

你也可以直接实现,不传入X,那么在使用这个类型的实例去传入某一个指定类型的方法参数时,会提示错误,不利于代码健壮性。

public class MainTest {

   
public static void useATypeReason(ISomeReason<ATypeReason> reason)
{
    sysout(reason.getImplClassType().getIndex());
}


   
//ATypeReason的类型没有指定泛型参数适用于掉这个接口
   public static void dontCareParamType(ISomeReason<?> reason)
   
{
      sysout(reason.getImplClassType());
      
//不能调用
       sysout(reason.getImplClassType().getIndex());
   }


}

你可以把ISomeReason接口定义如下,更严格。

public interface ISomeReason<extends Enum<E> & ISomeReason<E>> {

   
public E type();

}

posted @ 2010-06-29 14:08 北国狼人的BloG 阅读(1124) | 评论 (0)编辑 收藏
-Xms256m -Xmx512m
posted @ 2010-06-04 18:32 北国狼人的BloG 阅读(854) | 评论 (0)编辑 收藏
CountDownLatch使得使用CountDownLatch.await()的线程(当前线程)阻塞直到所有其它拥有CountDownLatch的线程执行完毕(countDown()结果为0)。例子如下:


第18行:endLatch.await()使得主线程(main)阻塞直到endLatch.countDown()为零才继续执行,在每个线程执行完毕的时候都调用一下countDown()(第37行),所以当所有线程都执行完毕后countDown()变为零,这个时候主线程开始继续执行。

运行结果如下:(每次运行的结果可能不同)

可以试试,把第18行注释掉,执行结果如下:(每次的运行结果可能不同)


可以看到所有的线程并没有执行完毕就打印出了"All threads are finished."
posted @ 2010-05-15 14:45 北国狼人的BloG 阅读(1211) | 评论 (0)编辑 收藏
装了linux 到虚拟机就要实现文件传送和下载

使用ssh     securecrt  rz 上传 sz 下载

vi /etc/ssh/sshd_config

Port 22
Protocol 2
PermitRootLogin yes
PasswordAuthentication yes

/etc/init.d/sshd restrat

service sshd status

netstat -an|grep 22

发现没有端口22,日阿


解决方法:
______________________________________
一、开启SSH
以root用户登录Linux,打开终端,运行: /etc/init.d/sshd restrat
______________________________________
二、关闭防火墙
1.在终端运行 setup
2,.选择 firewall 回车
3.按tab键切换到disablede项,然后按空格键选择,然后再按tab键切换到ok,按空格件选择
4.按tab键切换到quit,按空格件选择
然后用客户端ssh登录Linux
______________________________________
三、关闭防火墙的另一种方式
/etc/init.d/iptables stop
______________________________________
补充:
红旗linux的某些版本,不允许root用户远程登陆的,需要修改设置#vi /etc/ssh/sshd_config 中
PermitRootLogin no
#这就不允许root用户远程登录,要修改成PermitRootLogin yes 并重启sshd服务才行的
#service sshd restart



再拿SecureCRT 连接,必能连。


VMWARE 采用HOST ONLY ,先保证能Ping通。

posted @ 2010-05-06 11:37 北国狼人的BloG 阅读(930) | 评论 (0)编辑 收藏
 改一个文件
 /etc/inittab
 把这一行,5改成3
id:3:initdefault:
 然后重启机器,就好了
posted @ 2010-05-05 18:56 北国狼人的BloG 阅读(176) | 评论 (0)编辑 收藏

今天看到一个as3 的性能tip
取反(Sign flipping using NOT or XOR)


另人奇怪的是这个居然快了300%!

i = -i;
//相当于:
i = ~i + 1;
//或者
i = (i ^ -1) + 1;


但对位操作有点生疏了。

其实就是     0010      正2    取反 变成 1101    但计算是以补码保存的。所以真值是什么?求反+1,按道理,真值求反+1是补码,应该逆操作,-1求反,但他妈的二进制牛鼻之处,先-1求反,跟求反+1竟然是一样的。所以补码再次进行求反+1就是真值了。


这下你明白了么?再不明白,你就看下面的,看完还不明白,就不要搞计算机了。



在计算机内,定点数有3种表示法:原码、反码和补码

所谓原码就是前面所介绍的二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。

   反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。

1、原码、反码和补码的表示方法

(1)    原码:在数值前直接加一符号位的表示法。

例如:      符号位  数值位

[+7]原=   0    0000111  B

[-7]原=   1    0000111  B

     注意:a. 数0的原码有两种形式:

             [+0]原=00000000B    [-0]原=10000000B

           b. 8位二进制原码的表示范围:-127~+127

(2)反码:

     正数:正数的反码与原码相同。

     负数:负数的反码,符号位为“1”,数值部分按位取反。

例如:     符号位 数值位

     [+7]反=  0   0000111  B

     [-7]反=  1   1111000  B

注意:a. 数0的反码也有两种形式,即

         [+0]反=00000000B

         [- 0]反=11111111B

      b. 8位二进制反码的表示范围:-127~+127

(3)补码的表示方法

1)模的概念:把一个计量单位称之为模或模数。例如,时钟是以12进制进行计数循环的,即以12为模。在时钟上,时针加上(正拨)12的整数位或减去(反拨)12的整数位,时针的位置不变。14点钟在舍去模12后,成为(下午)2点钟(14=14-12=2)。从0点出发逆时针拨10格即减去10小时,也可看成从0点出发顺时针拨2格(加上2小时),即2点(0-10=-10=-10+12=2)。因此,在模12的前提下,-10可映射为+2。由此可见,对于一个模数为12的循环系统来说,加2和减10的效果是一样的;因此,在以12为模的系统中,凡是减10的运算都可以用加2来代替,这就把减法问题转化成加法问题了(注:计算机的硬件结构中只有加法器,所以大部分的运算都必须最终转换为加法)。10和2对模12而言互为补数。

同理,计算机的运算部件与寄存器都有一定字长的限制(假设字长为8),因此它的运算也是一种模运算。当计数器计满8位也就是256个数后会产生溢出,又从头开始计数。产生溢出的量就是计数器的模,显然,8位二进制数,它的模数为28=256。在计算中,两个互补的数称为“补码”。

2)补码的表示:

    正数:正数的补码和原码相同。

    负数:负数的补码则是符号位为“1”,数值部分按位取反后再在末位(最低位)加1。也就是“反码+1”。

例如:       符号位 数值位

      [+7]补=   0   0000111  B

      [-7]补=   1   1111001  B

补码在微型机中是一种重要的编码形式,请注意:

a.             采用补码后,可以方便地将减法运算转化成加法运算,运算过程得到简化。正数的补码即是它所表示的数的真值,而负数的补码的数值部份却不是它所表示的数的真值。采用补码进行运算,所得结果仍为补码。

b.            与原码、反码不同,数值0的补码只有一个,即       [0]补=00000000B。

c.             若字长为8位,则补码所表示的范围为-128~+127;进行补码运算时,应注意所得结果不应超过补码所能表示数的范围。

2.原码、反码和补码之间的转换

由于正数的原码、补码、反码表示方法均相同,不需转换。

在此,仅以负数情况分析。

(1)    已知原码,求补码。

例:已知某数X的原码为10110100B,试求X的补码和反码。

解:由[X]原=10110100B知,X为负数。求其反码时,符号位不变,数值部分按位求反;求其补码时,再在其反码的末位加1。

1  0  1  1  0  1  0  0   原码

1  1  0  0  1  0  1  1   反码,符号位不变,数值位取反

                     1   +1

1  1  0  0  1  1  0  0   补码

故:[X]补=11001100B,[X]反=11001011B。

(2)    已知补码,求原码。

分析:按照求负数补码的逆过程,数值部分应是最低位减1,然后取反。但是对二进制数来说,先减1后取反和先取反后加1得到的结果是一样的,故仍可采用取反加1 有方法。

例:已知某数X的补码11101110B,试求其原码。

解:由[X]补=11101110B知,X为负数。求其原码表示时,符号位不变,数值部分按位求反,再在末位加1。

1  1  1  0  1  1  1  0   补码

1  0  0  1  0  0  0  1   符号位不变,数值位取反

                     1   +1

1  0  0  1  0  0  1  0   原码

1.3.2  有符号数运算时的溢出问题

请大家来做两个题目:

两正数相加怎么变成了负数???
1)(+72)+(+98)=?

0 1 0 0 1 0 0 0 B    +72

     +  0 1 1 0 0 0 1 0 B    +98

        1 0 1 0 1 0 1 0 B    -42

两负数相加怎么会得出正数???
2)(-83)+(-80)=?

1 0 1 0 1 1 0 1 B    -83

     +  1 0 1 1 0 0 0 0 B    -80

        0 1 0 1 1 1 0 1 B    +93

   思考:这两个题目,按照正常的法则来运算,但结果显然不正确,这是怎么回事呢?

   答案:这是因为发生了溢出。

如果计算机的字长为n位,n位二进制数的最高位为符号位,其余n-1位为数值位,采用补码表示法时,可表示的数X的范围是   -2n-1≤X≤2n-1-1

当n=8时,可表示的有符号数的范围为-128~+127。两个有符号数进行加法运算时,如果运算结果超出可表示的有符号数的范围时,就会发生溢出,使计算结果出错。很显然,溢出只能出现在两个同符号数相加或两个异符号数相减的情况下。

对于加法运算,如果次高位(数值部分最高位)形成进位加入最高位,而最高位(符号位)相加(包括次高位的进位)却没有进位输出时,或者反过来,次高位没有进位加入最高位,但最高位却有进位输出时,都将发生溢出。因为这两种情况是:两个正数相加,结果超出了范围,形式上变成了负数;两负数相加,结果超出了范围,形式上变成了正数。

而对于减法运算,当次高位不需从最高位借位,但最高位却需借位(正数减负数,差超出范围),或者反过来,次高位需从最高位借位,但最高位不需借位(负数减正数,差超出范围),也会出现溢出。

在计算机中,数据是以补码的形式存储的,所以补码在c语言的教学中有比较重要的地位,而讲解补码必须涉及到原码、反码。本部分演示作何一个整数的原码、反码、补码。过程与结果显示在列表框中,结果比较少,不必自动清除,而过程是相同的,没有必要清除。故需设清除各部分及清除全部的按钮。测试时注意最大、最小正负数。用户使用时注意讲解不会溢出:当有一个数的反码的全部位是1才会溢出,那么它的原码是10000...,它不是负数,故不会溢出。

    在n位的机器数中,最高位为符号位,该位为零表示为正,为一表示为负;其余n-1位为数值位,各位的值可为零或一。当真值为正时,原码、反码、补码数值位完全相同;当真值为负时,原码的数值位保持原样,反码的数值位是原码数值位的各位取反,补码则是反码的最低位加一。注意符号位不变。

      总结:提示信息不要太少,可“某某数的反码是某某”,而不是只显示数值。

posted @ 2010-04-29 15:52 北国狼人的BloG 阅读(839) | 评论 (1)编辑 收藏
安装MySQL之前,先检查是否已经有没用的旧有MySQL

不卸载,有乱七八糟的问题会出现

rpm -qa|grep mysql -i

发现老版本的,就卸载

rpm ---nodeps --allmatches mysql-4.1.22-2.e14

下面开始安装,强制安装丫的

rpm -ivh MysqlServer.rpm --nodeps --force

安装顺序  server dev share client debuginfo

netstat -nat

察看是否启动。

配置/etc/my.cnf

# The following options will be passed to all MySQL clients
[client]
#password       
= your_password
port            
= 3306
socket          
= /data/mysql/database/mysql.sock

# Here follows entries 
for some specific programs

# The MySQL server
[mysqld]
port            
= 3306
socket          
= /data/mysql/database/mysql.sock
datadir         
= /data/mysql/database/
pid
-file        = /data/mysql/database/mysql.pid

skip
-locking
key_buffer_size 
= 2048M
max_allowed_packet 
= 2M
table_open_cache 
= 512
sort_buffer_size 
= 8M
read_rnd_buffer_size 
= 4M

query_cache_size 
= 1M
query_cache_type 
= 1

# Try number of CPU
's*2 for thread_concurrency
thread_concurrency = 16
thread_cache_size 
= 8
innodb_file_per_table

read_buffer_size 
= 4M
myisam_sort_buffer_size 
= 4M
myisam_recover
myisam_repair_threads
=4

server
-id = 1
log
-bin=/data/mysql_backup/binlogs/database
max_binlog_size 
= 512M
expire_logs_days 
= 3
long_query_time 
= 2 
log
-slow-queries = slow.log 
log
-queries-not-using-indexes
event_scheduler
=1
# Uncomment the following 
if you are using InnoDB tables
innodb_data_home_dir 
= /data/mysql/database/
innodb_data_file_path 
= ibdata1:20M;ibdata2:10M:autoextend
#innodb_log_group_home_dir 
= /var/lib/mysql/
#innodb_log_arch_dir 
= /var/lib/mysql/
# You can set .._buffer_pool_size up to 
50 - 80 %
# of RAM but beware of setting memory usage too high
innodb_buffer_pool_size 
= 10000M
innodb_additional_mem_pool_size 
= 4M
# Set .._log_file_size to 
25 % of buffer pool size
innodb_log_file_size 
= 8M
innodb_log_buffer_size 
= 4M
#innodb_flush_log_at_trx_commit 
= 1
#innodb_lock_wait_timeout 
= 50

##
#interactive_timeout
=6048000

wait_timeout
=31536000
interactive_timeout
=31536000
connect_timeout
=60
max_connect_errors
=100000000
max_connections
=50

[mysqldump]
quick
max_allowed_packet 
= 16M

[mysql]
no
-auto-rehash
# Remove the next comment character 
if you are not familiar with SQL
#safe
-updates

[isamchk]
key_buffer_size 
= 256M
sort_buffer_size 
= 256M
read_buffer_size 
= 128M
write_buffer_size 
= 128M

[myisamchk]
key_buffer_size 
= 256M
sort_buffer_size 
= 256M
read_buffer_size 
= 128M
write_buffer_size 
= 128M

[mysqlhotcopy]
interactive
-timeout

service mysql stop

如果目录改变了,那么需要重新建立新数据库目录

那么my.cnf中两个目录的属主需要配置,否则也会有问题

chown -R mysql.mysql /data/mysql

chown 
-R mysql.mysql /data/mysql_backup

mysql_install_db --defaults-file=/etc/my.cnf --user=mysql

输出正常自己察看

看看/data/mysql/下面的database中是否有ib开带头的几个文件,ibdata1 ibdata2  log 等。InnoDB数据实际都放在一个大文件里面

service mysql start

新install_db 的不需要密码,如果mysql -uroot -p
再回车,需要数据密码才能登录,那肯定不对。

检查ps -efww|grep mysql  看看进程使用的my.cnf是否正确。

正常登录后
mysql> show engines;

+------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine     | Support | Comment                                                        | Transactions | XA   | Savepoints |
+------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB     | YES     | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MRG_MYISAM | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| BLACKHOLE  | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| CSV        | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| MEMORY     | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| FEDERATED  | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| ARCHIVE    | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| MyISAM     | DEFAULT | Default engine as of MySQL 3.23 with great performance         | NO           | NO   | NO         |
+------------+---------+----------------------------------------------------------------+--------------+------+------------+


无需密码。我们设置一下。

注意MySql 5.1 使用old_password函数设置,java程序才是对,否则程序总是会报Access Denied,其实密码是对的。格式如下

  use mysql; 
  update user set password
=old_password("new_pass") where user="root";修改密码 
  flush privileges; 刷新权限

mysql>GRANT ALL ON *.* TO 'root'@'%' 
mysql
>flush privileges;

设置一下其他地址使用root 登录mysql的远程访问权限

nohup mysql -uroot -ppassword --default-character-set=utf8 < /data/t.sql &

 ps -aux|grep mysql

什么时候Done了,就导完数据。

ll -h /data/mysql/database

mysql -uroot --/data/mysql/database/mysql.sock

有时候,会mysql等不了或者关闭不了,必须找到驱动才能关闭或者登陆

mysqladmin -uroot --/data/mysql/database/mysql.sock shutdown

备份数据dump操作

mysqldump -uroot --/data/mysql/database/mysql.sock --B tianwen tianwen_log -> /data/bak0408.sql

 =================

优化Innodb 的my.cnf

grep innodb /etc/my.cnf

innodb_additional_mem_pool_size = 20M
innodb_buffer_pool_size 
= 12G
innodb_data_file_path 
= ibdata1:4G;ibdata2:50M:autoextend
innodb_file_io_threads 
= 8
innodb_thread_concurrency 
= 16
#innodb_flush_log_at_trx_commit 
= 1
innodb_log_buffer_size 
= 16M
innodb_log_file_size 
= 256M
innodb_log_files_in_group 
= 3
innodb_max_dirty_pages_pct 
= 90
#innodb_lock_wait_timeout 
= 120
innodb_file_per_table
=1
innodb_rollback_on_timeout

max_connections = 1200  也最好设置大点,大规模操作数据会比较顺畅。
posted @ 2010-04-10 13:38 北国狼人的BloG 阅读(196) | 评论 (0)编辑 收藏

nohup mysql -uroot -ppassword --default-character-set=utf8 < /data/t.sql &

ps -aux |grep mysql

看看是否跑起来


ll -h /data/mysql/database

grep innodb /etc/my.cnf

posted @ 2010-04-09 10:39 北国狼人的BloG 阅读(267) | 评论 (0)编辑 收藏
rpm -qa|grep mysql -i

然后把系统没用的mysql 都卸掉

rpm -e --nodeps --allmatches mysql-4.1.22-2.e14

还有一个需要停mysql

mysqladmin -uroot -p -S /data/mysql/database/mysql.sock shutdown

mysql -uroot -p -S /data/mysql/database/mysql.sock

mysqldump -uroot -p -S /data/mysql/database/mysql.sock -F -B tianwen tianwen_log -Q > /data/bak0408.sql

posted @ 2010-04-08 22:06 北国狼人的BloG 阅读(214) | 评论 (0)编辑 收藏

到底懂不懂系统

mysql_install_db --defaults-file=/etc/my.cnf --user=mysql

使用该命令初始化必须保证my.cnf中的目录创建

还要配置属主
chown -R mysql.mysql /data/mysql

chown -R mysql.mysql /data/mysql_backup

 

# The following options will be passed to all MySQL clients
[client]
#password       
= your_password
port            
= 3306
socket          
= /data/mysql/database/mysql.sock

# Here follows entries 
for some specific programs

# The MySQL server
[mysqld]
port            
= 3306
socket          
= /data/mysql/database/mysql.sock
datadir         
= /data/mysql/database/
pid
-file        = /data/mysql/database/mysql.pid

skip
-locking
key_buffer_size 
= 2048M
max_allowed_packet 
= 2M
table_open_cache 
= 512
sort_buffer_size 
= 8M
read_rnd_buffer_size 
= 4M

query_cache_size 
= 1M
query_cache_type 
= 1

# Try number of CPU
's*2 for thread_concurrency
thread_concurrency = 16
thread_cache_size 
= 8
innodb_file_per_table

read_buffer_size 
= 4M
myisam_sort_buffer_size 
= 4M
myisam_recover
myisam_repair_threads
=4

server
-id = 1
log
-bin=/data/mysql_backup/binlogs/database
max_binlog_size 
= 512M
expire_logs_days 
= 3
long_query_time 
= 2 
log
-slow-queries = slow.log 
log
-queries-not-using-indexes
event_scheduler
=1
# Uncomment the following 
if you are using InnoDB tables
innodb_data_home_dir 
= /data/mysql/database/
innodb_data_file_path 
= ibdata1:20M;ibdata2:10M:autoextend
#innodb_log_group_home_dir 
= /var/lib/mysql/
#innodb_log_arch_dir 
= /var/lib/mysql/
# You can set .._buffer_pool_size up to 
50 - 80 %
# of RAM but beware of setting memory usage too high
innodb_buffer_pool_size 
= 10000M
innodb_additional_mem_pool_size 
= 4M
# Set .._log_file_size to 
25 % of buffer pool size
innodb_log_file_size 
= 8M
innodb_log_buffer_size 
= 4M
#innodb_flush_log_at_trx_commit 
= 1
#innodb_lock_wait_timeout 
= 50

##
#interactive_timeout
=6048000

wait_timeout
=315360000
interactive_timeout
=31536000
connect_timeout
=60
max_connect_errors
=100000000
max_connections
=50

[mysqldump]
quick
max_allowed_packet 
= 16M

[mysql]
no
-auto-rehash
# Remove the next comment character 
if you are not familiar with SQL
#safe
-updates

[isamchk]
key_buffer_size 
= 256M
sort_buffer_size 
= 256M
read_buffer_size 
= 128M
write_buffer_size 
= 128M

[myisamchk]
key_buffer_size 
= 256M
sort_buffer_size 
= 256M
read_buffer_size 
= 128M
write_buffer_size 
= 128M

[mysqlhotcopy]
interactive
-timeout


初始化好, mysql -uroot -p   应该无需密码

然后看>show engines

mysql> show engines;
+------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine     | Support | Comment                                                        | Transactions | XA   | Savepoints |
+------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB     | YES     | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MRG_MYISAM | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| BLACKHOLE  | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| CSV        | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| MEMORY     | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| FEDERATED  | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| ARCHIVE    | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| MyISAM     | DEFAULT | Default engine as of MySQL 3.23 with great performance         | NO           | NO   | NO         |
+------------+---------+----------------------------------------------------------------+--------------+------+------------+
8 rows in set (0.00 sec)

posted @ 2010-04-08 21:59 北国狼人的BloG 阅读(8172) | 评论 (0)编辑 收藏
适用的情况:1 忘记密码
            2 error 1045:Access denied for user 'root'@'localhost' (using password: Yes/No)
            3 没有权限Access denied for user ''@'localhost' to database
步骤:
1 停止mysql进程;
  windows:控制面板-管理工具-服务-mysql停止;
  linux:mysql stop;
2 windows: mysqld --skip-grant-tables
  linux:mysqld_safe --skip-grant-tables
3 重新打开一个命令行窗口,输入
  mysql;进入mysql命令行
  use mysql;
  update user set password=password("new_pass") where user="root";修改密码
  flush privileges; 刷新权限

如果是MySQL 5.1 ,注意是  update user set password=old_password("new_pass") where user = "root"
select length(password) from user where user='root';不是41就对了





4 杀掉mysqld进程[任务管理器],重新启动mysql。
  windows:控制面板-管理工具-服务-mysql启动;
  linux:mysql start;











我的系统是ubuntu6.06,最近新装好的mysql在进入mysql工具时,总是有错误提示:
# mysql -uroot -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

使用网上介绍的方法修改root用户的密码:
# mysqladmin -uroot -p password 'newpassword'
Enter password:
mysqladmin: connect to server at 'localhost' failed
error: 'Access denied for user 'root'@'localhost' (using password: YES)'

现在终于被我找到了解决方法,如下(请先测试方法三,谢谢!):
方法一:
# /etc/init.d/mysql stop
# mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
# mysql -u root mysql
mysql> UPDATE user SET Password=PASSWORD('newpassword') where USER='root';
mysql> FLUSH PRIVILEGES;
mysql> quit

# /etc/init.d/mysql restart
# mysql -uroot -p
Enter password: <输入新设的密码newpassword>

mysql>


方法二:
直接使用/etc/mysql/debian.cnf文件中[client]节提供的用户名和密码:
# mysql -udebian-sys-maint -p
Enter password: <输入[client]节的密码>
mysql> UPDATE user SET Password=PASSWORD('newpassword') where USER='root';
mysql> FLUSH PRIVILEGES;
mysql> quit

# mysql -uroot -p
Enter password: <输入新设的密码newpassword>

mysql>


方法三:
这种方法我没有进行过测试,因为我的root用户默认密码已经被我修改过了,那位有空测试一下,把结果告诉我,谢谢!!
# mysql -uroot -p
Enter password: <输入/etc/mysql/debian.cnf文件中[client]节提供的密码>

至此,困惑多时的问题解决了!
posted @ 2010-04-08 15:56 北国狼人的BloG 阅读(249) | 评论 (0)编辑 收藏

1、下载MySQL的安装文件

 

安装MySQL需要下面两个文件:

MySQL-server-5.0.26-0.i386.rpm   

MySQL-client-5.0.26-0.i386.rpm

下载地址为:http://dev.mysql.com/downloads/mysql/5.0.html,打开此网页,下拉网页找到“Red Hat Enterprise Linux 3 RPM (x86) downloads”项,找到“Server”和“Client programs”项,下载需要的上述两个rpm文件。

 

2、安装MySQL

 

rpm文件是Red Hat公司开发的软件安装包,rpm可让Linux在安装软件包时免除许多复杂的手续。该命令在安装时常用的参数是 –ivh ,其中i表示将安装指定的rmp软件包,V表示安装时的详细信息,h表示在安装期间出现“#”符号来显示目前的安装过程。这个符号将持续到安装完成后才停止。

 

1)安装服务器端

在有两个rmp文件的目录下运行如下命令:

[root@test1 local]# rpm -ivh MySQL-server-5.0.26-0.i386.rpm

显示如下信息。

warning: MySQL-server-5.0.26-0.i386.rpm: V3 DSA signature: NOKEY, key ID 5072e1f5

Preparing...       ########################################### [100%]

1:MySQL-server     ########################################### [100%]

。。。。。。(省略显示)

/usr/bin/mysqladmin -u root password 'new-password'

/usr/bin/mysqladmin -u root -h test1 password 'new-password'

。。。。。。(省略显示)

Starting mysqld daemon with databases from /var/lib/mysql

如出现如上信息,服务端安装完毕。测试是否成功可运行netstat看Mysql端口是否打开,如打开表示服务已经启动,安装成功。Mysql默认的端口是3306。

[root@test1 local]# netstat -nat

Active Internet connections (servers and established)

Proto Recv-Q Send-Q Local Address      Foreign Address     State   

tcp  0  0 0.0.0.0:3306     0.0.0.0:*      LISTEN   

上面显示可以看出MySQL服务已经启动。

2)安装客户端

运行如下命令:

[root@test1 local]# rpm -ivh MySQL-client-5.0.26-0.i386.rpm

warning: MySQL-client-5.0.26-0.i386.rpm: V3 DSA signature: NOKEY, key ID 5072e1f5

Preparing...    ########################################### [100%]

1:MySQL-client  ########################################### [100%]

显示安装完毕。

用下面的命令连接mysql,测试是否成功。

登录MySQL

登录MySQL的命令是mysql, mysql 的使用语法如下:

mysql [-u username] [-h host] [-p[password]] [dbname]

username 与 password 分别是 MySQL 的用户名与密码,mysql的初始管理帐号是root,没有密码,注意:这个root用户不是Linux的系统

用户。MySQL默认用户是root,由于初始没有密码,第一次进时只需键入mysql即可。

[root@test1 local]# mysql

Welcome to the MySQL monitor. Commands end with ; or g.

Your MySQL connection id is 1 to server version: 4.0.16-standard

Type 'help;' or 'h' for help. Type 'c' to clear the buffer.

mysql>

出现了“mysql>”提示符,恭喜你,安装成功!

增加了密码后的登录格式如下:

mysql -u root -p

Enter password: (输入密码)

其中-u后跟的是用户名,-p要求输入密码,回车后在输入密码处输入密码。

注意:这个mysql文件在/usr/bin目录下,与后面讲的启动文件/etc/init.d/mysql不是一个文件。

 

MySQL的几个重要目录

MySQL安装完成后不象SQL Server默认安装在一个目录,它的数据库文件、配置文件和命令文件分别在不同的目录,了解这些目录非常重

要,尤其对于Linux的初学者,因为 Linux本身的目录结构就比较复杂,如果搞不清楚MySQL的安装目录那就无从谈起深入学习。

下面就介绍一下这几个目录。

1、数据库目录

/var/lib/mysql/

2、配置文件

/usr/share/mysql(mysql.server命令及配置文件)

3、相关命令

/usr/bin(mysqladmin mysqldump等命令)

4、启动脚本

/etc/rc.d/init.d/(启动脚本文件mysql的目录)

 

修改登录密码

 

MySQL默认没有密码,安装完毕增加密码的重要性是不言而喻的。

 

1、命令

usr/bin/mysqladmin -u root password 'new-password'

格式:mysqladmin -u用户名 -p旧密码 password 新密码

2、例子

例1:给root加个密码123456。

键入以下命令 :

[root@test1 local]# /usr/bin/mysqladmin -u root password 123456

注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。

3、测试是否修改成功

1)不用密码登录

[root@test1 local]# mysql

ERROR 1045: Access denied for user: 'root@localhost' (Using password: NO)

显示错误,说明密码已经修改。

2)用修改后的密码登录

[root@test1 local]# mysql -u root -p

Enter password: (输入修改后的密码123456)

Welcome to the MySQL monitor. Commands end with ; or g.

Your MySQL connection id is 4 to server version: 4.0.16-standard

Type 'help;' or 'h' for help. Type 'c' to clear the buffer.

mysql>

成功!

 

这是通过mysqladmin命令修改口令,也可通过修改库来更改口令。

 

启动与停止

1、启动

MySQL安装完成后启动文件mysql在/etc/init.d目录下,在需要启动时运行下面命令即可。

[root@test1 init.d]# /etc/init.d/mysql start

2、停止

/usr/bin/mysqladmin -u root -p shutdown

3、自动启动

1)察看mysql是否在自动启动列表中

[root@test1 local]# /sbin/chkconfig –list

2)把MySQL添加到你系统的启动服务组里面去

[root@test1 local]# /sbin/chkconfig – add mysql

3)把MySQL从启动服务组里面删除。

[root@test1 local]# /sbin/chkconfig – del mysql

 

更改MySQL目录

 

MySQL默认的数据文件存储目录为/var/lib/mysql。假如要把目录移到/home/data下需要进行下面几步:

 

1、home目录下建立data目录

cd /home

mkdir data

2、把MySQL服务进程停掉:

mysqladmin -u root -p shutdown

3、把/var/lib/mysql整个目录移到/home/data

mv /var/lib/mysql /home/data/

这样就把MySQL的数据文件移动到了/home/data/mysql下

4、找到my.cnf配置文件

如果/etc/目录下没有my.cnf配置文件,请到/usr/share/mysql/下找到*.cnf文件,拷贝其中一个到/etc/并改名为my.cnf)中。命令如下:

[root@test1 mysql]# cp /usr/share/mysql/my-medium.cnf /etc/my.cnf

5、编辑MySQL的配置文件/etc/my.cnf

为保证MySQL能够正常工作,需要指明mysql.sock文件的产生位置。 修改socket=/var/lib/mysql/mysql.sock一行中等号右边的值

为:/home/mysql/mysql.sock 。操作如下:

vi  my.cnf    (用vi工具编辑my.cnf文件,找到下列数据修改之)

# The MySQL server

[mysqld]

port   = 3306

#socket  = /var/lib/mysql/mysql.sock(原内容,为了更稳妥用“#”注释此行)

socket  = /home/data/mysql/mysql.sock   (加上此行)

 

6、修改MySQL启动脚本/etc/rc.d/init.d/mysql

最后,需要修改MySQL启动脚本/etc/rc.d/init.d/mysql,把其中datadir=/var/lib/mysql一行中,等号右边的路径改成你现在的实际存

放路径:home/data/mysql。

[root@test1 etc]# vi /etc/rc.d/init.d/mysql

#datadir=/var/lib/mysql    (注释此行)

datadir=/home/data/mysql   (加上此行)

7、重新启动MySQL服务

/etc/rc.d/init.d/mysql start

或用reboot命令重启Linux

如果工作正常移动就成功了,否则对照前面的7步再检查一下。

 

为了在其它电脑上能用root用户登录,需进行以下动作:

 

1、mark@marklinux mark>mysql -h localhost -u root

//这样应该可以进入MySQL服务器

 

2、mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION

//赋予任何主机访问数据的权限

3、mysql>FLUSH PRIVILEGES

//修改生效

4、mysql>EXIT

//退出MySQL服务器

 

这样就可以在其它任何的主机上以root身份登录啦!

posted @ 2010-04-08 11:02 北国狼人的BloG 阅读(146) | 评论 (0)编辑 收藏
mysql>use mysql;
mysql>grant all on 数据库名字.* to '远程用户名'@'远程IP地址' identified by '远程用户的密码';
mysql>flush privileges;
mysql>\q
posted @ 2010-04-07 19:02 北国狼人的BloG 阅读(143) | 评论 (0)编辑 收藏


http://gamelook.com.cn/
posted @ 2010-04-05 16:26 北国狼人的BloG 阅读(146) | 评论 (0)编辑 收藏
taskdef flexTask.jar

内存不够用,就是用ANT_OPTS  -Xms256m -Xmx512m
posted @ 2010-04-05 15:02 北国狼人的BloG 阅读(144) | 评论 (0)编辑 收藏

打包  tar czvf static.tar.gz html/*

解压  tar xzvf server.tar.gz


描述
tar 程序用于储存或展开 tar 存档文件。存档文件可放在磁盘中 ,也可以存为普通文件。 tar是需要参数的,可选的参数是A、c、d、r、t、u、x,您在使用tar时必须首先为 tar 指定至少一个参数;然后,您必须指定要处理的文件或目录。如果指定一个目录则该目录下的所有子目录都将被加入存档。
应用举例:

1)展开 abc.tar.gz 使用命令: tar xvzf abc.tar.gz 展开 abc.tar 使用命令: tar xvf abc.tar

2)将当前目录下的 man 目录及其子目录存成存档 man.tar tar cf man.tar ./man
参数说明
运行tar时必须要有下列参数中的至少一个才可运行

-A, --catenate, --concatenate
将一存档与已有的存档合并
-c, --create
建立新的存档
-d, --diff, --compare
比较存档与当前文件的不同之处
--delete
从存档中删除
-r, --append
附加到存档结尾
-t, --list
列出存档中文件的目录
-u, --update
仅将较新的文件附加到存档中
-x, --extract, --get
从存档展开文件

其他参数

--atime-preserve
不改变转储文件的存取时间

-b, --block-size N
指定块大小为 Nx512 字节(缺省时 N=20)

-B, --read-full-blocks
读取时重组块(???!!!)

-C, --directory DIR
转到指定的目录

--checkpoint
读取存档时显示目录名

-f, --file [HOSTNAME:]F
指定存档或设备 (缺省为 /dev/rmt0)

--force-local
强制使用本地存档,即使存在克隆

-F, --info-script F --new-volume-script F
在每个磁盘结尾使用脚本 F (隐含 -M)

-G, --incremental
建立老 GNU 格式的备份

-g, --listed-incremental F
建立新 GNU 格式的备份

-h, --dereference
不转储动态链接,转储动态链接指向的文件。

-i, --ignore-zeros
忽略存档中的 0 字节块(通常意味着文件结束)

--ignore-failed-read
在不可读文件中作 0 标记后再退出???

-k, --keep-old-files
保存现有文件;从存档中展开时不进行覆盖

-K, --starting-file F
从存档文件 F 开始

-l, --one-file-system
在本地文件系统中创建存档

-L, --tape-length N
在写入 N*1024 个字节后暂停,等待更换磁盘

-m, --modification-time
当从一个档案中恢复文件时,不使用新的时间标签

-M, --multi-volume
建立多卷存档,以便在几个磁盘中存放

-N, --after-date DATE, --newer DATE
仅存储时间较新的文件

-o, --old-archive, --portability
以 V7 格式存档,不用 ANSI 格式

-O, --to-stdout
将文件展开到标准输出

-p, --same-permissions, --preserve-permissions
展开所有保护信息

-P, --absolute-paths
不要从文件名中去除 '/'

--preserve
like -p -s
与 -p -s 相似

-R, --record-number
显示信息时同时显示存档中的记录数

--remove-files
建立存档后删除源文件

-s, --same-order, --preserve-order

--same-owner
展开以后使所有文件属于同一所有者

-S, --sparse
高效处理

-T, --files-from F
从文件中得到要展开或要创建的文件名

--null
读取空结束的文件名,使 -C 失效

--totals
显示用 --create 参数写入的总字节数

-v, --verbose
详细显示处理的文件

-V, --label NAME
为存档指定卷标

--version
显示 tar 程序的版本号

-w, --interactive, --confirmation
每个操作都要求确认

-W, --verify
写入存档后进行校验

--exclude FILE
不把指定文件包含在内

-X, --exclude-from FILE
从指定文件中读入不想包含的文件的列表

-y, --bzip2, --bunzip2
用 bzip2 对存档压缩或解压

-Z, --compress, --uncompress
用 compress 对存档压缩或解压

-z, --gzip, --ungzip
用 gzip 对存档压缩或解压

--use-compress-program PROG
用 PROG 对存档压缩或解压 ( PROG 需能接受 -d 参数)

--block-compress
为便于磁盘存储,按块记录存档

-[0-7][lmh]
指定驱动器和密度[高中低]

--------------------------

打包: tar -cf soft.tar soft

解包: tar -xf soft.tar soft

压缩目录

打包压缩:tar czvf usr.tar.gz /home

解压缩:tar xzvf usr.tar.gz

压缩文件(对于目录失效)

压缩:zip good.zip good1 good2

解压:unzip good.zip
posted @ 2010-04-02 14:09 北国狼人的BloG 阅读(317) | 评论 (0)编辑 收藏

基于MINA框架快速开发网络应用程序

1.MINA框架简介 MINA(Multipurpose Infrastructure for Network Applications)是用于开发高性能和高可用性的网络应用程序的基础框架。

通过使用MINA框架可以可以省下处理底层I/O和线程并发等复杂工作,开发人员能够把更多的精力投入到业务设计和开发当中。
MINA框架的应用比较广泛,应用的开源项目有Apache Directory、AsyncWeb、Apache Qpid、QuickFIX/J、Openfire、SubEthaSTMP、red5等。MINA框架当前稳定版本是1.1.6,最新的2.0版本目前已经发布了M1版本。

MINA框架的特点有:基于java NIO类库开发;采用非阻塞方式的异步传输;事件驱动;支持批量数据传输;支持TCP、UDP协议;控制反转的设计模式(支持Spring);采用优雅的松耦合架构;可灵活的加载过滤器机制;单元测试更容易实现;可自定义线程的数量,以提高运行于多处理器上的性能;采用回调的方式完成调用,线程的使用更容易。

2.MINA框架的常用类 类NioSocketAcceptor用于创建服务端监听; 类NioSocketConnector用于创建客户端连接; 类IoSession用来保存会话属性和发送消息; 类IoHandlerAdapter用于定义业务逻辑,常用的方法有: 方法 定义 sessionCreated() 当会话创建时被触发 sessionOpened() 当会话开始时被触发 sessionClosed() 当会话关闭时被触发 sessionIdle() 当会话空闲时被触发 exceptionCaught() 当接口中其他方法抛出异常未被捕获时触发此方法 messageRecieved() 当接收到消息后被触发 messageSent() 当发送消息后被触发

3.服务端应用开发示例 下面将以MINA2.0M1版本为基础,通过一个范例来演示一下如何使用MINA框架进行开发。开发环境为jdk6.0,开发工具NetBeans6.0,所需jar包slf4j-api.jar、slf4j-jdk14.jar、MINA-core-2.0.0-M1.jar。 首先定义一个业务逻辑处理器TimeServerHandler,继承自IoHandlerAdapter,实现的功能有:当客户端创建会话时会显示客户端设备的IP和端口;当客户端输入quit时结束会话;客户端输入其它内容时则向客户端发送当前时间。

代码如下: public class TimeServerHandler extends IoHandlerAdapter {
  @Override
  public void sessionCreated(IoSession session) {
   //显示客户端的ip和端口
   System.out.println(session.getRemoteAddress().toString());
  }
  
  @Override
  public void messageReceived( IoSession session, Object message ) throws Exception {
   String str = message.toString();
   if( str.trim().equalsIgnoreCase("quit") )
   {
    session.close();
    //结束会话
    return;
   }
   Date date = new Date();
   session.write( date.toString() );
   //返回当前时间的字符串
   System.out.println("Message written...");
  } }
  
再定义一个类MinaTimeServer用来启动服务端:
  public class MinaTimeServer {
   private static final int PORT = 9123;
   //定义监听端口
   public static void main( String[] args ) throws IOException
   {
    IoAcceptor acceptor = new NioSocketAcceptor();
    acceptor.getFilterChain().addLast( "logger", new LoggingFilter() );
    acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));
    //指定编码过滤器
    acceptor.setHandler( new TimeServerHandler() );
    //指定业务逻辑处理器
    acceptor.setDefaultLocalAddress( new InetSocketAddress(PORT) );
    //设置端口号 acceptor.bind();
    //启动监听
   }
  }


4.测试
 
 首先运行MinaTimeServer,启动服务端,接着在命令行运行“telnet 127.0.0.1 9123”,
 来登录,这时会看到服务端输出如下: 2008-2-21 16:15:29 org.apache.MINA.filter.logging.LogLevel$4 log /10.64.2.137:4140 àIP和端口号
 信息: CREATED 2008-2-21 16:15:29 org.apache.MINA.filter.logging.LogLevel$4 log 信息: OPENED 在客户端输入回车,在客户端可以看到服务端返回当前的时间:
 
  Thu Feb 21 16:20:14 CST 2008 服务端输出: 2008-2-21 16:20:14 org.apache.MINA.filter.logging.LogLevel$4 log 信息: RECEIVED: HeapBuffer[pos=0 lim=2 cap=2048: 0D 0A] à接收收到回车符 Message written... 2008-2-21 16:20:14 org.apache.MINA.filter.logging.LogLevel$4 log 信息: SENT: HeapBuffer[pos=0 lim=29 cap=30: 54 68 75 20 46 65 62 20 32 31 20 31 36 3A 32 30...] 2008-2-21 16:20:14 org.apache.MINA.filter.logging.LogLevel$4 log 信息: SENT: HeapBuffer[pos=0 lim=0 cap=0: empty]

 


5.客户端开发示例 首先定义类TimeClientHandler来处理消息接收事件:

class TimeClientHandler extends IoHandlerAdapter{
            public TimeClientHandler() { }
            @Override
            public void messageReceived(IoSession session, Object message) throws Exception {
                   System.out.println(message);//显示接收到的消息
            }
}

接着定义MinaTimeClient类用于连接服务端,并向服务端发送消息:
        public class MinaTimeClient {
              public static void main(String[] args) {
                  // 创建客户端连接器.
                  NioSocketConnector connector = new NioSocketConnector();
                  connector.getFilterChain().addLast( "logger", new LoggingFilter() );
                  connector.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" )))); //设置编码过滤器             connector.setConnectTimeout(30);
                  connector.setHandler(new TimeClientHandler());
                  //设置事件处理器
                   ConnectFuture cf = connector.connect( new InetSocketAddress("127.0.0.1", 9123));
                  //建立连接
                  cf.awaitUninterruptibly();
                 //等待连接创建完成
                 cf.getSession().write("hello");
                 //发送消息
                 cf.getSession().write("quit");
                 //发送消息
                 cf.getSession().getCloseFuture().awaitUninterruptibly();
                 //等待连接断开
                connector.dispose();
               }
         }

6.总结 通过上述示例可以了解到:使用MINA框架来开发的网络应用程序代码结构更清晰;MINA框架完成了底层的线程管理;MINA内置的编码器可以满足大多数用户的需求,省去了开发人员消息编码解码的工作。具称使用MINA开发服务器程序的性能已经逼近使用 C/C++ 语言开发的网络服务。因此,建议在网络应用程序开发过程中尝试使用MINA框架来提高我们的开发效率和应用程序的执行效率。

posted @ 2010-03-31 11:10 北国狼人的BloG 阅读(245) | 评论 (0)编辑 收藏

老外的想法做法就是不一样,如果你想在外企工作得好,有些潜规则你最好心里有数。



Unacceptable:


老外打小受的教育是人要以表扬鼓励为主,所以老外批评人比较含蓄。说你这件事办的unacceptable,已经算是说的很重了,中国老板在外企混久了, 也便跟着装逼起来,对你不满,写email给你,左一个unacceptable右一unacceptable。


潜台词相当于:你这个傻逼,你奶奶个熊, 给老子小心点,等等。


CC:


就是Copy。我看email,第一看标题,第二看CC给谁,第三才看内容。CC给谁基本上能够说明对方的态度,CC一大批老板的,肯定不是啥好事,对方要推卸责任。


潜台词:我这件事告诉你了哦,和我没关系了,你自己看着办吧,反正老板都知道?都盯着你呢。 最开心的是看到自己的名字在CC那一栏里面,因为那意味着那就是这封信不用回,看看就可以。有人会回的。


Concern:


中文翻译成”关注”,其实根本不是关注的意思,老外要是说他很concern, 那就是事情不妙,所谓老外打喷嚏,中国人集体感冒。


潜台词:老子很不爽,这事儿怎么这么乱七八糟,给我注意点!


Great:


刚才说了,老外打小受教育要多夸人,少批评人,所以老外一天到晚把”It”s great!”,”you did a great job!” 挂在嘴上,初听还飘飘然了几回,听久了,才知道其实压根儿就是他们口头禅,心里未必觉得你有多 great,同义词还有 fantastic! wonderful! Gorgeous! Fabulous! 等等。


潜台词:还马马虎虎啦,一般般了,还过得去。


F.Y.I:


以前一直以为是forward邮件的时候系统会自动加上这几个字,因为人家转过来的信上都有这三个字母,过了好久才知道是人家自己加的,意思是:For Your Information。看到这几个字母意味着下面内容和我有关,但是关系不大,看看就好。因为对方如果要你采取行动,一定会说清楚:Allen, please……。。而不会只是F.Y.I了事。


潜台词:和你关系不大,给你随便看看。


Issue:


中文翻译成事情,其实是贬义词,准确意思是”不好的事情”,老外说有一个issue,就是有件鸟事要处理。要有很多issue,那就是一团糟。


潜台词:事情不妙,大家都赶快处理。


Aggressive:


中文翻译成”进攻性的”,在外企里面意思含糊,褒义的有”具有开拓精神的”,”有事业心的”,贬义的有”咄咄逼人的”,”喜欢没头脑乱闯的”,”容易得罪别人的”,反正意思可褒可贬,看你自己琢磨。 面试时候说自己”aggressive”的,潜台词是:我可不是那种混日子的人,我是能干事的,招我准没错。 但是一但说别人”very aggressive”,基本上潜台词是说:这傻逼凶巴巴的,不好相处,做事没头没脑,老闯祸…不是啥好鸟。


Involve:


中文翻译成”介入”,反正involve的老板越高层事情就越复杂,director要是involve了,manager就开始紧张,VP要是involve了,中国区相关人员都别想有好日子过,得加班加得四脚朝天。


潜台词:大佬很生气,后果很严重。


RESEND!


重传。


潜台词:有没在上班的呀?还没有答复过来?是不是在混水摸鱼?我的时间很宝贵的,不快点回复你就死定了。


highlight :


强调,意思是说你搞不定一定要提前highlight出来,抗不住就早点讲,一般要highlight的东西都是比较难搞定的。


urgent :


紧急的,遇到这样的urgent的case你就有得麻烦了,电话基本不会停下来,好一阵子的热线。


appreciate :


欣赏。当事情自己解决不了的时候,需要别人帮忙的时候,或者是自己做错事无法挽回的时候,一句yourkindhelpshouldbeappreciated。就会发挥很大的作用 了。


guarantee :


保证,之前promise的东西没有出现,于是再次向别人求助的时候,对方一句Are you guarantee of it?让你很是尴尬,使对方陷入困境。对于sales来讲,此词使用 的几率教高。


myunderstandingis…


翻成中文是我的理解是。


潜台词是,应该是。你的理解有误,我在此再给你解释一下。虽然看上 去是对方在说自己的理解,但基本上是认为你的看法是错的,他的是正确的。


Im very disappointed…


中文是:我很失望。


潜台词是:你怎么搞得,弄成这样。后果有点严重,基本上这个人对你有了 一个很差的印象了。

posted @ 2010-03-23 22:02 北国狼人的BloG 阅读(157) | 评论 (0)编辑 收藏
dir  后台,把文件,横向排放,并以空格换行

gam.server.jar            
mina-core.jar       


每行空格长度不同

使用    edit -plus   Alt 列选扣出来

使用  Ctrl + H  替换      (空格点星)   

( .*)  替换 ,
posted @ 2010-03-23 20:35 北国狼人的BloG 阅读(137) | 评论 (0)编辑 收藏
Class-Path: ./lib/ant-1.6.5.jar
 ./lib/ant-junit-1.6.5.jar
注意:换行后前面加两个空格

posted @ 2010-03-23 20:30 北国狼人的BloG 阅读(464) | 评论 (0)编辑 收藏
http://code.google.com/p/golfzon-flash-library/
posted @ 2010-03-23 13:26 北国狼人的BloG 阅读(180) | 评论 (0)编辑 收藏

下面是非常有用的类库:

APIs、Libs、Components

1、as3ebaylib

http://code.google.com/p/as3ebaylib/

2、as3youtubelib

http://code.google.com/p/as3youtubelib/

3、as3flickrlib

http://code.google.com/p/as3flickrlib/

4、Yahoo ASTRA Flash Components

http://developer.yahoo.com/flash/astra-flash/

5、facebook-as3

http://code.google.com/p/facebook-as3/

6、as3awss3lib

http://code.google.com/p/as3awss3lib/

7、Adobe ActionScript. 3:resources:apis:libraries (官方,包括corelib、FlexUnit、Flickr、Mappr、RSS and Atom libraries、Odeo、YouTube)

http://labs.adobe.com/wiki/index.php/ActionScript_3:resources:apis:libraries

8、Tweener   用于过渡与切换的一组动画库

http://code.google.com/p/tweener/

9、uicomponents-as3     一组轻量级的AS3 UI组件库

http://code.google.com/p/uicomponents-as3/

10、as3ds     AS3的数据结构实现

http://code.google.com/p/as3ds/

11、mecheye-as3-libraries     一组主要用于Flash 游戏开发的AS3库

http://code.google.com/p/mecheye-as3-libraries/

12、XIFF   一套XMPP协议的AS3实现

http://svn.igniterealtime.org/svn/repos/xiff/branches/xiff_as3_flexlib_beta1/

13、FZip   一套AS3库,可用作对ZIP压缩文件的载入、修改与创建

http://codeazur.com.br/lab/fzip/

14、FlexLib   一套开源的Flex界面组件库

http://code.google.com/p/flexlib/

15、AnimatedGIfLoader Flex Component     可载入GIF的Flex组件

http://dougmccune.com/blog/animatedgifloader-flex-component/

16、goplayground     一套轻量级的,可用创建属于你自己的AS3 动画工具的库

http://code.google.com/p/goplayground/

17、AlivePDF   开源的用于PDF创建的AS3库

http://www.alivepdf.org/

18、jwopitz-lib   一组开源的Flex用户界面组件

http://code.google.com/p/jwopitz-lib/

19、as3crypto   AS3实现的一套加密库,包括多种加密算法

http://code.google.com/p/as3crypto/

20、flare     一套强大的可视化交互的AS3类库

http://flare.prefuse.org/

21、SWFAddress     一小而强大的库,可以为Flash和Ajax提供深链接的功能

http://www.asual.com/swfaddress/

22、SWFObject     用于嵌入Flash,Adobe官方也认可了

http://code.google.com/p/swfobject/

23、ulse Particle System 一套开源的强大的AS3动态粒子系统

http://code.google.com/p/pulse-particle/

http://www.rogue-development.com/pulseParticles.html

24、SpringGraph Flex Component

http://mark-shepherd.com/blog/springgraph-flex-component/

25、GoASAP     AS3动画库

http://code.google.com/p/goasap/

http://www.goasap.org/index.html

26、asaplibrary   一套开源的Flash Actionscript3.0 RIA库

http://code.google.com/p/asaplibrary/

http://asaplibrary.org/

http://asapframework.org

27、as3mathlib 开源Flex/Actionscript数学库

http://code.google.com/p/as3mathlib/

28、as3corelib 包含一些基础功能AS3库

http://code.google.com/p/as3corelib/

29、minimalcomps 一组AS3 UI组件

http://www.bit-101.com/minimalcomps/

30、as3gif

http://code.google.com/p/as3gif/

31、queueloader-as3     一组AS3库,用来进行资源序列载入及监测

http://code.google.com/p/queueloader-as3/

32、TweenMax (AS3)

http://blog.greensock.com/tweenmaxas3/

33、Atellis Reflection Component             一款Flex反射效果组件

http://labs.atellis.com/2007/07/11/atellis-reflection-component/

34、AS3Eval     简单来说,就是用AS3实现的AS3编译器

http://eval.hurlant.com/

35、ByteArray的组件、库合集,包括liquid components、mousegesture、ASZip、GIF Player、GIF Animation Encoder、AlivePDF、Live JPEG Encoder、ScaleBitmap等

http://www.bytearray.org/?page_id=82

36、AS3C     针对AVM2虚拟机,用C#写的字节码编译器

http://code.google.com/p/as3c/

37、as3httpclientlib   as3实现的http客户端

http://code.google.com/p/as3httpclientlib/

38、as3ui   一组常规的as3 ui界面库

http://code.google.com/p/as3ui/

39、as3xls 让你在flex中可以读写Excel文件

http://code.google.com/p/as3xls/

40、as3flexdb 让你的flex程序可以连接到MySQL服务器,主要是使用AMFPHP来访问PHP服务器

http://code.google.com/p/as3flexdb/

这一是一篇详细使用介绍的教程

http://itutorials.ro/viewtopic.php?f=9&t=7

41、vivisectingmedia-as3  一组AS3/Flex实用库,是作者在实践中总结出来的

http://code.google.com/p/vivisectingmedia-as3/

Actionscript. 3.0 Class

1、fZip   此类可允许你载入标准的zip文件并提取里面包含的文件

http://wahlers.com.br/claus/blog/zip-it-up/

2、AS3: Layout class for Flash CS3     一组用作布局的类

http://www.senocular.com/?id=2.8

3、CSSLoader     该类允许Flex应用程序在运行时载入CSS

http://www.rubenswieringa.com/blog/cssloader

4、AS3: QueryString     一个单例类,用来获取URL地址后所带参数值对

http://evolve.reintroducing.com/2008/07/03/as3/as3-querystring/#more-141

5、ActionScript. 3 Contextual Menu Manager Class         AS3关联菜单管理类

http://www.blog.noponies.com/archives/103

2D & 3D Engine

1、APE (Actionscript. Physics Engine)   物理引擎

APE前身是as2版本的Flade,呼声很高,优点就是清晰简单,一共没有几个类:),目 前版本alpha 0.45 ,有API文档和示例,教程有一篇quick start ,在Google Group上有一个论坛可以讨论。svn上一直在更新目前svn上的版本为0.5a

http://www.cove.org/ape/

2、Away3D

http://code.google.com/p/away3d/

3、Papervision3D

http://code.google.com/p/papervision3d/

4、Sandy     开源3D库

http://www.flashsandy.org/versions/3.0

5、FORM   一套AS3完成的用于2D刚性物体的物理引擎

http://code.google.com/p/foam-as3/

6、Five3D   基于矢量的Flash 3D 交互动画创建

http://five3d.mathieu-badimon.com/

7、Flade (Flash Dynamics Engine)   一套开源的2D物理引擎,AS2实现

http://www.cove.org/flade/

8、Box2DFlashAS3     2D物理引擎,AS3实现,基于强大的Box2D C++物理库

http://box2dflash.sourceforge.net/

9、Paradox   基于Flash的第一称3D引擎

http://animasinteractive.com/propaganda/

10、ND3D AS3 3D Engine  一款简单的AS3开源3D引擎,编译后的引擎大小仅约10K

http://code.google.com/p/nd3d/

http://www.nulldesign.de/nd3d-as3-3d-engine/

11、motor2   基于Box2d的AS3刚体引擎,也是2D的.

作者就是 AS3数据结构的作者,2007年最后一天发布

作者主页:http://lab.polygonal.de/motor_physics/

代码:http://code.google.com/p/motor2/

12、WOW-Engine   法国人写的,基于Sandy library的算法 3D物理引擎

http://seraf.mediabox.fr/wow-engine/as3-3d-physics-engine-wow-engine/

FrameWorks

1、Cairngorm   Adobe官方出的Flex框架

http://labs.adobe.com/wiki/index.php/Cairngorm

2、PureMVC   纯AS3框架,也有其它语言的实现

http://www.puremvc.org/

3、ASWing AS3   一套开源的AS3 GUI框架

http://www.aswing.org/

4、EasyMVC   由事件驱动的MVC框架

http://projects.simb.net/easyMVC/

5、Mate 基于Tag及事件驱动的Flex框架

http://mate.asfusion.com/

6、ARP     基于模式(Pattern)的RIA框架,Flash平台,支持AS2和AS3

http://osflash.org/projects/arp

7、Gaia   开源的Flash前端框架,支持AS2和AS3,用于快速开发

http://www.gaiaflashframework.com/

8、flest   Actionscript3.0/Flex应用程序框架,用来开发企业级的RIA

http://code.google.com/p/flest/

9、Gugga     Flash Framework     更新至AS3

http://www.gugga.com/flashblog/

10、Prana 另一个提供了IOC反转控制的框架,类似著名的Spring框架

http://www.pranaframework.org/

11、OpenFlux   开源的Flex组件框架,让开发Flex组件更加快速容易

http://code.google.com/p/openflux/

12、Degrafa       声明式的Flex图形框架,允许以MXML标签的方式绘制图形、创建皮肤,还包括对CSS的支持

http://code.google.com/p/degrafa/

13、FlexMVCs   针对AS3和Flex的应用程序框架,基于PureMVC,作了些修正和精简

http://code.google.com/p/flexmvcs/

Flash & Flex Tools、Servers

1、FlexUnit     Flex/Actionscript3.0单元测试框架

http://code.google.com/p/as3flexunitlib/

2、Visual FlexUnit 增强的FlexUnit,支持“可视化断言”

http://code.google.com/p/visualflexunit/

3、RED bug       debug调试控制器,让Flash、Flex、AIR应用程序更加容易

http://www.realeyesmedia.com/redbug/

4、reflexutil 可在运行时对Flex组件进行调试

http://code.google.com/p/reflexutil/

5、FxSpy   当Flex应用程序运行时可以检测和动态的改变可视化组件属性值

http://code.google.com/p/fxspy/

6、ThunderBolt 基于Firefox的Firebug插件的日志扩展,支持AS2及AS3

http://code.google.com/p/flash-thunderbolt/

7、FlashTracer Firefox扩展,可以以侧栏的方式将Flash中trace()的结果显示

8、RIALogger 另一款Flex/AIR的Debug工具

http://renaun.com/blog/flex-components/rialogger/

9、Alcon 一款轻量级的AS2及AS3的Debug工具,AIR方式将Debug信息展示出来

http://blog.hexagonstar.com/alcon/

10、GDS (Granite Data Services) 开源,提供了Adobe LiveCycle Data Services类似功能的服务器

http://www.graniteds.org/

Flex Explorers   (大部分为Flex2版本,但同样适用于Flex3)

1、Flex3 Component Explorer   Flex各类组件示例

http://examples.adobe.com/flex3/componentexplorer/explorer.html

2、Resize ManagerFX Explorer (此为商业作品,要收费的)

http://www.teotigraphix.com/explorers/ResizeManagerFX/ResizeManagerFXExplorer.html

3、Flex3 Style. Explorer

http://examples.adobe.com/flex3/consulting/styleexplorer/Flex3StyleExplorer.html

4、Flex2 Style. Explorer(添加了Kuler功能)Flex UI组件风格定制并可输出为CSS

http://www.maclema.com/content/sek/

5、Flex2 Style. Explorer(Adobe 原始的版本)

http://examples.adobe.com/flex2/consulting/styleexplorer/Flex2StyleExplorer.html

6、Flex2 Filter Explorer   查看各类滤镜效果并可进行设置

http://merhl.com/flex2_samples/filterExplorer/

http://merhl.com/?p=40   (AIR版本)

7、Flex2 Primitive Explorer   在Flex中创建各种简单形状

http://www.flexibleexperiments.com/Flex/PrimitiveExplorer/Flex2PrimitiveExplorer.html

posted @ 2010-03-21 18:20 北国狼人的BloG 阅读(1697) | 评论 (0)编辑 收藏

香港著名经济学家——郎咸平

 

'中国99%的白领以及他们的家庭即将面临破产。而且是必然破产!无路可逃!这件事可能是发生在未来2-10年。你可以尽量去怀疑这个数字。但它必然发生,绝非危言耸听。'就如我预言中国国营企业职工必然失业一样,在当时来说没人信。但确实会发生。因为在中国这样一个发展中国家,其必然以不断的以通货膨胀和改革手段来换取经济的发展。而每一次改革所带来的阵痛都是由百姓来承担的。无论是上山下乡时迷茫的知青们还是改革开放带来的大量国企纷纷倒闭时大量下岗职工。如果他们能有一定的前瞻性的话,那么我想他们也许会为自己留一点后路。但是由于过分相信文件以及过分相信生活不会突变,所以才导致了他们的人生悲剧。

  有人说政府不会坐视不理白领破产,其实政府当然不愿意。可有的事情……怎么说呢。想想当年的下岗职工吧。引起了那么大的社会震动。又能怎样呢?今天的白领明天破产的时候也那样而已。

  而改革开放20多年来,中国的经济发展快速腾飞。但旧的体制并没有完全更改。各种重要行业依然施行的是政府垄断机制在运转。如:银行,金融,冶金,能源,信息,运输,医疗,教育,土地。在改革开放初期我国不可能对这些东西进行全方面的改革开放。但到了今天,垄断经营所带来的矛盾日益突出。
  首当其冲的就是地产。由于我国的法制不健全,尤其是金融以及改革领域里出现了各种失误导致地产节节攀升。随着地产的增加以及外来人口向大城市集中。所以城市新民工也就是所谓的'白领'收入表面上也在提升,以北京为例3000-15000元人民币的月薪处处可见。但这一部分收入主要用于支付租房或还贷。
  为了深入地了解为什么99%的白领家庭会破产,我们就必须先了解房价为什么会这么高?高在哪里?资金是运转的?(这里的白领指买房或者准备买房族。)以及发展趋势带来的相关效应。本文会分三个阶段向你阐述。
  1:导致房价爆涨的第一个因素:银行竞争下的贷款开放。
  其实房价的爆涨的因素主要是因为百姓在替政府所犯下的错误买单。比如以前一个开发商通过某银行贷款了1000万开发了一个房子。如果还不起那他就倒霉了,因为所有的银行都是一个体系,你欠了钱没还就再也没有翻身的机会。但是中国在银行改革的基础上开了一条口子,为了各银行之间的竞争所以把工行,农行,建设银行等等全部独立运营。这本来是好事。但问题是这些银行都不是私有的,而是国家的。我们不难想象。当一个开发商从工行贷款1000万的后果。他只需要用500万来开发房子,然后把售价提升,再把这个开发中的房子按他的售价标准抵押从农行再贷款2000万,然后再用这2000万中的1000万开发一套售价更高的房子来找建设银行抵押贷款4000万。就是这样一个滚雪球的疯狂贷款模式。
  房子卖不卖得出去不重要,关键是房价要高,不得降价。反正银行的钱不是私人的,所以稍微疏通一下行长加之又有'合法的'高零售价的楼盘做抵押所以自然就越来越好从银行贷款。
  那么这样造成的结果就是,房子价格只攀不跌!因为不能跌!一跌银行贷出去的款就再也回不来了。这可是政府的银行,政府的钱!所以为了堵住这个资金黑洞一些被收买的专家、媒介便开始疯狂制造舆论用各种舆论手段威逼利诱人买房子。
  比如土地资源严重紧张,再不买房将来就只能住在郊区呀之类的。导致人们不得不去买房。其实住不了市中心这种情况这根本不可能发生,城市居民是一个新老替换的过程,要上班的住城里,老人退休喜欢住郊区。只要人口不爆炸就不会出现上班族住不了市中心的情况。虽然这些舆论造成了很多人买房子,但是仅仅是这样,房价还没有高到现在这样的离谱。紧接着政府又犯了第二个错误。
2:导致房价爆涨的第二个错误:中国特色的按揭。  
  按揭本来是一种西方很流行的制度,也很合适。但这个制度一旦运用到中国就有点问题了。因为从大的体制上来说。所有银行都是国家的,而不是私人的。所以贷款这个关口就不可能控制得住。只要文件上说得过去,人们就能贷到款。  
  为了早日缓解第一个错误所带来的资金黑洞。政府开始实行个人按揭制度来售房。还经常举什么美国来太太和中国老太太的例子来诱惑人们去按揭。确实有人按揭了,而且是疯狂的按揭。只要和银行有点'路子'的人。他们先按揭一套80万的房子,自己出10万首付然后再从银行贷出70万。之后再把这个房子抬高价格到180万出售。这个时候他们的亲戚或者老爸老妈再去买下,也用按揭的方式自己出首付30万再从银行贷出150万。然后就不管了。他们不还贷款怎么办?银行爱收不收。反正根据合同我还不上钱你可以收走房子,我们两不相欠。  
  所以转了一圈,抬高了几倍价格的房子又回到了政府回到了银行手里。这就解释了为什么很多新楼盘刚开始修就被'炒房团'买走了。他们炒的不是赌房子会升值。而是拿了房子去收拾银行。  
  银行拿到这个房子怎么办?更不敢降价了。只好再加点价接着卖。所以普通老百姓现在根本别想买到真正合理价格的房子!即使你直接从开发商手里买来的房子都说不定已经转了好几次手又回到银行以及开发商手里的了。说句不好听的现在8000/平的房子里,有只有2500才是房价,有5500都是以为决策错误带来的资金黑洞!也就是说你正在替人任劳任怨地擦屁股。  
  3:第三个问题:白领家庭何时破产??  
  那么我们研究了房子价格为什么会涨,再来研究一下中国城市所谓的白领家庭破产的必然性。  
  首先国外白领收入确实是高,但是高得有价值。而中国所谓的白领则普遍素质较差。中国企业内耗严重。人人相轻,人人顽固。所以难怪外资企业一进入中国大陆市场就开始惊呼:'在中国办企业招不到人!'对此我也深有体会。那有人会说:'既然现在的白领不值这个身价,那水木周平你说说为什么他们还能拿到这样的薪水呢?'其实,这由于房地产的火爆造成的一个量子效应。银行损失的资金大量的经过少数人之手流向了市场。这些人开始在中国的其他领域疯狂投资。因为他们自己也知道房地产就快要崩盘了。他们这样一轮又一轮的投资热潮正在快速消化这些资金,他们投资互联网,投资高新技术,投资娱乐,投资很多很多。但起码付出的工资要够员工付房子月租或者月供吧。所以正是因为房价的高涨所以造就了中国城市人口工资水平的相对提升。不相信你自己算算你所在的城市白领阶级平均收入一旦交完每月的房钱,手上还能剩多少钱?我想这个问题就不用我再罗嗦了吧。大家心理有数。所以我可以说一旦房地产崩盘紧接着崩溃的就是你的工资。  
  有很多很多我认识的白领们都购了房。他们的算盘很简单:'两口子除开各种税收保险每月纯收入还12000。交3000房钱算什么?我还能再买一套呢!'是的不算什么。但因为房子贵所以什么东西都贵。吃的贵,交通贵,学费贵,医疗费用更贵!!!所以交了房钱你再除开生活费用就基本上一分钱存不下来,就算存点也赶不上正常的通货膨胀率。问题是如果能一直保持这个现状的话,理论上说应该没事。你这二十年赚来的钱正好可以弥补政府的两个错误带来的亏损。  
  但问题也出在这里。随着WTO5年缓冲期的结束,大量外资通讯,银行,医疗,保险等等公司都会陆续进入中国。到时候没有人能阻止你把钱存入花旗,存入汇丰。请问一下到那个时候谁愿意把钱存在呆帐坏帐如此之多的中国国有银行呢?即使政府再怎么采取措施也可能挤兑,所以到时候会发生什么现在还很难说。但有一点可以肯定的是到时中国国有这些银行的压力将变得非常巨大。贷款就会难上加上,因为银行根本无钱可贷!同时大量具备高素质人材的外资企业进入中国必定带来市场的强烈冲击和大量现有企业的倒闭以及白领失业。也就是说。一旦外资企业加入竞争,中国现有的99%的白领都将面临大环境下的就业压力!  
  而且外资银行一旦积累了资金开始投资房地产,那么由于它们是正常的操作流程所以造出来的房子就会便宜,其必然拉动全国房地产大幅下跌。如我刚才所说,房价一跌,紧跟着跌的就是你所在的企业的工资收入!可你之前买的房子还贷价格并不会降低或者减少,所以你将无力支付高昂的贷款。那么你的的房子会被银行收走,你的存款会被直接冻结。所以未来中国城市中的白领们最大的可能是和几十年前的中国国有企业职工一样。辛辛苦苦二十年,到头来竹篮打水一场空!
如何避免破产?  
  看到这里您应该明白,不要买房是一个避免破产的好办法。不过我还要提醒你,为了托住楼市不跌,他们还有个办法,那就是鼓吹老百姓不买房就不是个爷们儿!您别说,这还真有点效果。现在的人一张口第一句就是:'你有房吗。'似乎你没房就是个太监一样。我实在是气得连骂人的力气都没有了。还有人在百度水木周平这个帖吧里发帖说:'不买房子你住哪里?'我就奇怪了,住和买有必然联系吗?在中国一个土地都不属于你的房子卖给你和租给你有什么区别?(笑)。更别提土匪一样的物业和把人不当人的强制拆迁!这不纯粹是'皇帝的新装'吗?不过既然WTO中已经说明出版业和传媒业中国还是不对外开放的。那么舆论救市就会成为政府和开发商手中的最后一张王牌。  
  所以我们在面对很多花言巧语的时候还是自己多动动脑子。以后我们听到的房产的鬼话会越来越多,越来越令人发指!比如最近就有砖家在鼓吹房价不贵时都说:'什么即使年薪5万,两口子也是一年10万,5年就50万。所以房价当然不贵。'我奇怪的是居然有人点头称是?也许对于这种或者此类已经进化到了不吃不喝不病不穿不动且爹娘早已死绝不用赡养的砖家来说也许还真是那么回事。所以大家注意提高警惕。  
  结束语:  
  已经买房或者准备买房的白领一族必定随着房价的崩溃而崩溃,那会是一个缓慢发生的过程。短则两年,长则十年。但这是不可逆转的趋势。所以中国99%城市白领一族已经面临破产一说绝非危言耸听!今天你往银行交的每一分房钱都是替政府替炒房者补洞,只有一小部分是真正的房钱。明天大环境一变,你没有那么多资金来补洞的时候就会被市场和银行一脚踢回老家,换一批新人来接着补。不信?走着瞧呗!--PS:为什么我说99%这个数,是因为根据我的了解99%的人一旦月薪过5000就开始买房,甚至3000,4000都买。小俩口什么都不明白这样买下去人生一定会很惨。我只是替他们感到忧伤。当然如果你是那1%的智者,多劝救他们吧。独乐乐不如众乐乐。
                中国人正在上的四个大当
        第一大当:房产
        买房意味着什么?意味着你拥有了一个属于自己的房子。是的,你是这样以为,但是在中国你并无法拥有这个房子,只是租给你而已。因为房子是你的,地不是你的,只是把土地使用权70年(从现在退70年那是抗日战争时期,谁见过那时候的房子?)。房子通常情况下30年左右就会遇上拆迁或者旧房改造。也就是说你花了买房的钱,却只能得到租房的实际效果。当然这还不是最坏的。最坏的是,当几十年后你发觉上当了!有一群流氓冲进你用一辈子积蓄买下的房子,画上一个大大的拆字!然后把你的家当全部当垃圾一样的仍出门外,不顾你的苦苦哀求,甚至还在报纸上给你按一个钉子户的臭名,任大众辱骂的时候你就会知道什么叫做绝望!

  形容中国的房地产有一个很有名的笑话是这样写的:

  以前,有个地主有很多地,找了很多长工干活,地主给长工们盖了一批团结楼住着,一天,地主的谋士对地主说:东家,长工们这几年手上有点钱了,他们住你的房子,每月交租子,不划算,反正他们永远住下去,你干脆把房子卖给他们起个名堂叫做——公房出售!告诉他们房子永远归他们了,可以把他们这几年攒的钱收回来,地主说:不错,那租金怎么办?谋士说:照收不误,起个日本名儿,叫物业费!地主很快实行了,赚了好多钱,长工们那个高兴啊!

  过了几年,地主的村子发展成城镇了,有钱人越来越多,没地方住,谋士对地主说:东家,长工们这几年手上又有钱了,咱们给他们盖新房子,起个名堂叫做旧城改造,他们把手上的钱给我们,我们拆了房子盖新的,叫他们再买回去,可以多盖一些卖给别人,地主又实行了,这次,有些长工们不高兴了,地主的家丁派上用途了,长工们打掉牙只好往肚子里咽,地主又赚了好多钱。

  又过了几年,地主的村子发展成大城市了,有钱人更多了,地主的土地更值钱了,谋士对地主说:东家,咱们把这些长工的房子拆了,在这个地方建别墅,拆出来的地盖好房子卖给那些有钱的大款还能赚一笔,地主说:长工们不干怎么办?谋士说:咱给他们钱多点儿,起个名堂叫货币化安置,咱再到咱们的猪圈旁边建房子,起个名堂叫经济适用房,给他们修个马车道让他们到那边买房住,地主说:他们钱不够怎么办?谋士说:从咱家的钱庄借前给他们,一年6分利,咱这钱还能生钱崽,又没风险,地主又实行了,长工们拿到钱,地主的经济适用房到现在才建了一间,长工们只好排队等房子,直到现在,还等着呢……

  于是,长工们开始闹事了,地主有点慌,忙问谋士怎么办?谋士说:赶紧通知长工们,房子要跌价了,别买了,租房住吧,正好把我们的猪圈租给他们,结果,这么多年后,长工们的钱全没了,还在租房住,直到永远!

  这个笑话虽然有点夸张,但实际上这何尝又不是事实呢?有人说既然如此?为什么中国人还要买房?疯了一样的买?为什么?还不是愚民教育的结果,就好象60年代,鼓吹人们必须购买三大件:手表、缝纫机、自行车才算是成功人士才可嫁人娶妻。70年代鼓吹人们必须购买新四大件:电视,冰箱,洗衣机,装电话才算是出人头地才可娶妻生子一样,记得当年装电话可是要几千块钱一部啊(人均收入不到200的小城),而北京上海更有上万一部的时候,还得排队买号搭人情,和今天的买房又何其相似?

  而今天所有的狗屁学者又开始了这一套愚弄百姓的旧招:白领一族新标准,成功人士新选择X环X路小户型,X环X路商住型。收了你几十万后,还得每个月收你租金(新物业费),银行利息,以及各种巧立名目的加息、政策等等等等。总之不怕你不被整死,就怕你死得不够惨!老百姓咋就怎么乐于上当,而且百上不厌呢?我真是气得浑身都湿了!
第二大当:就业
当有人终于开始感叹:当年当知青的时候,当有人下岗之后感到没有生路,只能静坐抗议却无人理会,只能沦落街头还被人编首歌嘲笑着人生豪迈,重头再来的时候。你可曾想过!他们也曾经和今天的白领一样风光!他们的收入和地位也曾经让周围的人艳羡不已?你可曾想过20年后的今天!你一样会和他们一样沦落街头,众叛亲离?!

  有人说嘿!你不知道有失业保险,养老保险,XX保险么?呵呵,我在北京漂泊N年,交了无数保险大概有好几万吧,但失业的时候跑断腿也没人给我啥保险,反而很多保险都被冻结了说我交得断断续续的,我简直又气得……这还不算,你以为你到了60岁真的就可以拿到养老保险了吗?天上又不会掉钱!今天的老年人拿的退休金是我们在挣!而今天30-40岁的人通常都有好几个兄弟姐妹!意思就是,今天的老年人能在60岁拿到养老保险是因为有5个人供一个老人!而我们这一代老去之后则是一个人供我们两个老人!钱从哪里来?没得来!您要是能活到90岁估计能领到一些养老保险,嘿保重吧您。然而即使是这样,家长们还是疯了一样的把孩子往各种企事业国有单位里送,我身边就经常有这样的例子。我老家一个远房亲戚,找关系拖朋友,花了七万块钱通过公开招聘把儿子送进了交警队,干上合同制的police。一个月拿800块。结果第三年被竞争上岗给刷下来了。一家人哭哭啼啼,我说刷了好,你上那班一辈子挣不回那七万,赶紧先洗洗睡,改明再凑点钱做小生意去吧!没准还能赚点。

  当年我毕业的时候,我不文明用语也是领着我抱着钱,把我往XX部送。我一看负责招工那人那德行,就忍不住的恶心,再一看薪水,不文明用语呀,我这不是白干10年不吃不喝才拿回成本。所以我私下威胁了那家伙一把,吓得那个大腹便便的X科长再也不敢招收我。我才得已:离家出走。

  我就想不明白?中国人咋就这么傻?这么迷信国字呢?醒醒吧,思维正常一点行不?做事之前自己算算合算不合算成不?

  还有那些年纪轻轻的小白领们,找工作最好把薪水要高点,别要医疗保险和啥保险,然后自己把钱存起来最保险,将来用得着。

  第三大当:教育
一张文凭值多少钱?一张文凭值多少钱?一张文凭值多少钱?印刷成本两块钱顶了天了。一个老师工资多少?嘿,两个学生的学费足够一学期了!一个班的书本印刷多少钱?两个学生的足够了!一个班房租多少钱一学期?嘿嘿两个学生足够了。!嘿!中国教育你凭啥收那么多钱!?

  嘿!百姓们!我们为啥要上当?因为从小统治阶级就告诉我们考上秀才才光荣。哦对不起我说错了,是考上大学才光荣。但老百姓从来不去想一想为什么光荣?为什么光荣……大学秀才又怎样还不是废物!

  你知道你的孩子是什么人在教么?在中国一般是无法适应社会的人才会沦为一个教师,举个例子。前段时间我因为一个项目的关系,找了几个大学的硕士生做程序。结果有几个人笨得很,完全不给你考虑,非得你守着才干活,而且给个文件明显有一个错别字,也不给改,等你发现了还跟你较真,是这不是他的错,是你给的就是错的。一点责任感,一都不会考虑究竟是为了做事而做事还是为了做好一件事而做事。我还是很心平气和的给他们讲道理:你们必须学会为别人思考,思考别人想要什么结果再去做事情。否则无法在社会上生存。结果那几个说:我们才不要去社会上,我们考试成绩好得很,学校要我们留校做老师。再说了本来我们就没什么错,你怎么安排我们怎么做,你不安排我们就不做。这是我们的尊严和原则。我说:如果你去守门,老板没安排你下班的时候锁好仓库你就不锁了吗?您心寒吗?以后您的孩子就是在这样的人的指导下学习和成长。您放心么?

  难怪现在读大学的同居,逃课,打架,自杀……但家长们还是愿意花钱把孩子送进学校去,而且是花一辈子的钱。

   第四大当:买车
中国人疯了吗?买车?为什么要买车???当然您有了钱花不光了,您爱怎么买怎么买,买车买房,反正油价怎么涨你也花不完钱,房子要拆迁你也不心疼。但是大多数老百姓呢?

  我以前有个同事住北二环,公司西直门那里。每天坐地铁上班最多半小时。可非得买一二手夏利,每天早上8点开始在路上堵着,然后一点一点的挪到公司。嘿,一个月停车费都不少。可人家就觉得开了车自己身份高级一点。别说开个夏利,就是开个奥迪我也没见谁对谁三磕九拜。除了显得自己比别人傻一点外完全没有别的作用。

  还有一次,我遇见一个月收入才4000的小姑娘,在计划贷款买车。于是我就问她:小姑娘,你又没做生意,自己按时上班,地铁又方便,买车干什么呢?想了半天,实在估计也想不出什么理由来了就说:有时候去超市买东西吧,打车又觉得近了点不划算,走路又远了点。所以自己开车去了!听得我差点没恶心死。你开车去超市买个方便面不觉得恶心么?装备了大哥大去拣垃圾,也是拣垃圾的!别以为买了车能证明什么。

  比如我现在自己做生意,很忙,一天大概要跑4-5个地方,见很多客户。但我就不买车,为什么?我打车随招即来,打完就走,不用担心停车没地方,不用担心挂了碰了,不用担心被贼偷了绑了,无论挂风下雨都有司机。万一碰着个堵车还可以下车坐地铁。一年也就一万多块RMB!要买一车!一年停车费都得一万多!这不是傻么?

  说别买车别买车,可就有无数的人疯了一样的去贷款买?一定要嫌自己将来死得不够惨似的!买吧,买完了加息了不是?油价涨疯了不是?停车又贵了不是?后悔了不是?新车一上路就掉价了卖也卖不掉了不是??

  告诉你,油价还得涨。一定要涨到和美圆一样的油价。嘿嘿!您拿老美1/10的收入,养和人家一个价的汽油。我看您还得瑟不。

  最后说一句,每个人都不傻,都是从小被愚民教育给弄啥了。傻点不要紧,但性命悠关的事儿您还是紧着点,多盘算盘算经济利益之间的关系!别到头来,房产一跌,油价一涨,交了半辈子钱拿了毕业证还是啥啥不会干,交了几十年苛捐杂税还啥啥福利没有。您亏的可不仅仅是差价几十万。

  有人还说什么?哎呀没办法,难道不住了,不买车啦,公车好挤呀。我说全是愚民教育出来的虚荣心在做怪。您看看我,租一个房子住才一千多块一个月,也就相当于有些人的物业费。如果要结婚我还租得起3-4千的,家具装修一应具全。而且还哪方便我住哪儿。不想搬就长期租。也和交物业费一个样。还白白省出还银行贷款、利息、首付一大堆。有事就打车,没事就地铁,一年一万顶天了,还省了车库费,停车费,罚款等一堆,油价涨到10块也乐呵,也不耽误事。俺大学没念完就跑了,一边自学一边自己钻研市场出策划跑业务,不也同样可以进外资企业,上市企业做经理么?还省出好几万学费来。

  当然有的人会说:你连个房子都不买,指定结不了婚。我心想:我是没有,您以为您有啊?有人说租房子不划算,租完了还是别人的,嘿嘿,你以为买房子还了几十年贷款,还清了就是你的了啊……

posted @ 2010-03-21 17:43 北国狼人的BloG 阅读(255) | 评论 (0)编辑 收藏

1,老鼠嘲笑猫的时候,身旁必有一个洞。

2,站在山顶和站在山脚下的两人,虽然地位不同,但在对方眼里,同样的渺      小。

3,路的尽头,仍然是路,只要你愿意走。

4,使我们不快乐的,都是一些芝麻小事,我们可以躲闪一头大象,却躲不开一只苍蝇。

5,最好的与最坏的创造了历史,平庸之辈则繁衍了种族。

6,在这世上惟一件事比别人议论更糟,那就是无人议论你。

7,成功便是站起比倒下多一次。

8,失败并不意味你浪费了时间和生命。失败表明你有理由重新开始。

9,人生中有时不去冒险比冒险更危险。

10,所有的人都站在一边并不一定是好事,譬如他们都站在船的一边。

11,许多人爬到了梯子的顶端,却发现梯子架错了墙。

12,偶然的成功比失败更可怕。

13,才华其实就是把与人相同的聪明用到与众不同的地方。

14,状态是干出来的,而不是等出来的。

15,道歉是为将来再次冒犯打下伏笔。

 

 

 

 

31,世上只有想不通的人,没有走不通的路。

32,幸运之神的降临,往往只是因为你多看了一眼,多想了一下,多走了一步。

33,失败发生在彻底的放弃之后。

34,所谓敌人,不过是那些迫使我们自己变得强大的人。

35,胆怯的人在危险前被吓住了;懦弱的人在危险中被吓住了;勇敢的人在危险过后被吓住了。

36,使人疲惫的不是远方的高山,而是鞋里的一粒沙子。

37,家庭的幸福需夫妻共同努力,而破坏它,一人就够了。

38,最了解你的人有时不是你的朋友,而是你的敌人。

39,你若不想做,会找一个或无数个借口;你若想做,会想一个或无数个办法。

40,看一个人的心术,看他的眼神;看一个人的身价,看他的对手;看一个人的底牌,看他的朋友。

41,魅力女人,就是有充分的意志力去抵挡男人的进攻,也有足够多的魅力阻挡男人的撤退。

42,山盟海誓是一种经常让高山和海洋领受尴尬的重量级承诺。

43,好女人是一所学校,好男人毕业了可留校任教。

44,你不理财,财不理你。

45,不要同一个傻瓜争辩,否则别人会搞不清到底谁是傻瓜。46,加班加点,废寝忘食有时很可能是不具备效率和工作能力的表现。

47,做父母是个专业性很强的职业,可大部分的父母未经任何培训就上岗了。

48,凡向鳄鱼池内投掷物品者,必须下池自己捡回。――肯尼亚天然动物园告示。

49,当你想丢点什么的时候请想想,千万别丢脸。――成都垃圾箱,果皮箱上语。

50,凡是上了年纪的人,大多是反对的太多,商议的太久,行动的太迟,后悔的太早。

51,做生意的过程就是一个不断怂恿别人放松警惕,而自己保持高度警惕的过程。

52,打工者做工,小老板做事,中老板做市,大老板做势――你是哪一种?

53,成功是一种观念,致富是一种义务,快乐是一种权力。

54,聪明人能洞察事物未来的发展趋势。他们在发洪水之前养鸭,而不是养鸡。

55,两种人无药可救:一是不服从命令的人,二是惟命是从的人。

56,打算开创新事业时,十人中有一两人赞成时就可开始,以免太迟。

57,买保险――用不上时痛苦,用上时更痛苦。

58,给猴一棵树,给虎一座山。――用人之道

59,世上有三种人:一是良心被狗吃了的人,二是良心没被狗吃的人,三是良心连狗都不吃的人。

60,你可以先知先觉地领导产业,后知后觉地苦苦追赶,或不知不觉地被淘汰。

 

16,所谓百依百顺,就是为了某种不可告人的目的在未完成前,所表现的不同寻常的耐心。

17,所谓儿童不宜,其实就是大人们令人感动地把犯错误的危险留给了自己。

18,你想以40km/h的速度开车到80岁,还是以80km/h的速度开车到40岁?

19,在敌人面前,谁先镇定下来,谁就离胜利不远了。

20,所有的人都是平凡的,有些人因知道这一点而真正成了平凡的人。

21,乞丐就是一种向你的良心征税的人。

22,所谓大难不死,就是有了灾祸之后,得到的不是同情,而是莫名其妙的祝贺。

23,处在社交圈中是一种烦恼,而超脱出来简直是一场悲剧。

24,厌倦,就是一个人吃完盘子里的食物后对盘子的感情。

25,参加追悼会的程序常常是,先受一次深刻的人生教育,然后大家一起抽烟喝酒打牌。

26,知识是一种使求知者吃得越多越觉得饿的粮食。

27,爱情是会沉底的,在平淡的日子里,最重要的是经常轻轻晃一晃盛装爱情的“水杯”。

28,战争:用舌头解不开就用牙齿咬吧!


29,憎恨别人就像为了逮住一只耗子而不惜烧毁你自己的房子。但耗子不一定逮到了。

30,每个人的一生都有许多梦想,但如果其中一个不断搅扰着你,剩下的就仅仅是行动了。

posted @ 2010-03-16 13:25 北国狼人的BloG 阅读(148) | 评论 (0)编辑 收藏
这个需求应该是很常见的吧,需要从 0 到 n 之间选 k 个不重复的组成一个序列。

我最早遇到这个问题是在给校ACM比赛出题时,需要随机产生一些测试数据,当时我想的是用一个辅助数组记录之前已经产生的随机,如果当前产生的随机已经出现过就再重新随机

显然这样的实现效率是很低的,设想从10000个随机产生10000个的序列,当前面9999个已经确定了时,最后一个随机到的概率是 0.0001,也就是说大概需要调用随机函数10000才会产生。类似的,第9999个随机到的概率是0.0002……
.....

我后来采用了一个改进的办法是,如果当前产生的随机a已经在之前产生过了,就顺序去找比a小的,直到找到一个之前没有产生过的,如果找不到就找比a大的

可以看到这样的改进节省了大量的时间,但是这样产生的已经不是随机序列了!

试想从1,2,3,4中随机挑选2个,假如第一次选出来的是3,那么第二再选的话,选中2的概率就变成了1/2,因为当随机出来的为2或3时,我们都选择2。

在我遇到的应用中,因为对随机序列的“随机性”要求不是很高,所以凑合着用了上述办法。

直到今天在《Programming pearls》里看到这个很完美的办法:
for(i = 0; i < n; i++)
{
x[i] = i;
}
for(i = 0; i < k; i++)
{
t = rand(i,n-1);
swap(x[i], x[t]);
out(x[i]);
}

其中,rand(a,b)产生一个 a 到 b 之间的随机,swap(a,b)交换a和b的值,out(a)把a输出作为结果。
我们来看看这个算法的完美之处吧!

首先,x数组里把0到n-1的所有都存储了,而最后输出的都是x数组里的值,所以满足输出的是k个0到n-1的

然后,我们对于第 i 随机,产生一个 i 到 n-1 的下标 t ,并把x[t] 和x[i]交换,将其输出,这样每产生的都是之前没有出现过的,因为之前出现过的都在x[0] 到 x[i-1]里呢!这样就保证了输出数据的不重复性。

最后,我们考察输出数据的“随机性”,显然,因为交换操作,使得所有没有出现过的都在x[i] 到 x[n-1]中存着呢,所以被选中的概率相等。


写完上面这些文字之后,我在想,这样经典的算法,应该是早就已经出现了,但是我竟然还不知道,这样看来,我百度实习面试遭鄙视也就是很自然的了,这也算是我之前的一个毛病,喜欢遇到问题才去想怎么解决,没问题就很少看相关的书或资料,而对于自己能解决的问题(比如上面说的这个凑合着能用的问题),我又懒得去找更好的甚或是标准的解决方法,所以才造成了我现在的知识局限,以后要多看书,多想问题,尽量多的积累知识吧……
posted @ 2010-02-21 14:21 北国狼人的BloG 阅读(4125) | 评论 (1)编辑 收藏
flash 用起来xml 来简直就跟object 点属性一样简单。

flash object 可以变成任何东西,xml object  json object .可以不去强转取值,取属性,干任何你想干的事

if(xmlobj.@name)
{
          var aaa:XMLList = xmlobj.functiondef(@perm == "superadmin");
          treecontrol.dataprovider = aaa;
}


json object 用作socket 传输的对象,java接过去再类型化。flash这边永远都是弱类型。随心所欲

messagemanager.getInstance().addMessage({
         name: "some name",
         loginPolicy: 1;
         ...
});

posted @ 2010-02-16 22:23 北国狼人的BloG 阅读(326) | 评论 (0)编辑 收藏

On occasion you may want to create classes dynamically by name. To do this in Flex 3 you can use getDefinitionByName (it's previous incarnation was getClassByName). Here's a quick example:

Actionscript:
  1. //cc() is called upon creationComplete
  2. private function cc():void
  3. {
  4.         var obj:Object = createInstance("flash.display.Sprite");
  5. }
  6.  
  7. public function createInstance(className:String):Object
  8. {
  9.         var myClass:Class = getDefinitionByName(className) as Class;
  10.         var instance:Object = new myClass();
  11.         return instance;
  12. }

The docs for getDefinitionByName say:

"Returns a reference to the class object of the class specified by the name parameter."

...so you may be wondering why in the above code we needed to specify the return value as a Class? This is because getDefinitionByName can also return a Function (e.g. 'flash.utils.getTimer' - a package level function that isn't in any class). As the return type can be either a Function or a Class the Flex team specified the return type to be Object and you are expected to perform a cast as necessary.

The above code closely mimics the example given in the docs, but in one way it is a bad example because everything will work fine for "flash.display.Sprite", but try to do the same thing with a custom class and you will probably end up with the following error:

ReferenceError: Error #1065: Variable [name of your class] is not defined.

The reason for the error is that you must have a reference to your class in your code - e.g. you need to create a variable and specify it's type like so:

Actionscript:
  1. private var forCompiler:SomeClass;

Without doing this your class will not be compiled in to the .swf at compile time - and there is reason behind this madness. The compiler only includes classes which are actually used (and not just imported). It does so in order to optimise the size of the .swf. So the need to declare a variable should not really be considered an oversight or bug, although it does feel hackish to declare a variable that you don't directly use.

Here is the code your would need to create a custom class called Person from a string (where Person resides in the top level package along with your default application).

Actionscript:
  1. //cc() is called upon creationComplete
  2. private var forCompiler:Person; //REQUIRED! (but otherwise not used)
  3.  
  4. private function cc():void
  5. {
  6.         var obj:Object = createInstance("Person");
  7. }
  8.  
  9. public function createInstance(className:String):Object
  10. {
  11.         var myClass:Class = getDefinitionByName(className) as Class;
  12.         var instance:Object = new myClass();
  13.         return instance;
  14. }

 

You can declare properties for all possible classes that you intend to create but if you are not happy with doing that inside your main app Alex Harui has another suggestion (something I've not personally tried yet):

"The code for the class has to be in a SWF. It can be in the main SWF or
loaded via a module later. There is a compiler option (-includes) that
allows you to stuff other classes into a SWF without explicitly naming
them in your source code."

Passing in Parameters

Another thing you may find yourself wanting to do is to pass parameters to the constructor of your class (indeed, this is what got me on to the subject today). As far as I'm aware this isn't possible to do this in AS3 (and isn't part of the ECMA spec so it is unlikely to change - please leave a comment or email if you know otherwise ), so you may want to set up another method which can accept and set multiple parameters . If you pass in an array you may stumble across another problem - the original array you passed in becomes the first item of a new array ... okay, that probably sounds confusing so see here for a similar example and solution. In short, the solution is to use Function.apply, and you can see how I used it below:

Actionscript:
  1. private var forCompiler:Person;
  2.  
  3. private function cc():void
  4. {
  5.         var obj:Object = createInstance("Person", ["bob", 30]);
  6. }
  7.  
  8. public function createInstance(className:String, args:Array):Object
  9. {
  10.         var myClass:Class = getDefinitionByName(className) as Class;
  11.         var instance:Object = new myClass();
  12.         instance.initArgs.apply(null, args);
  13.         return instance;
  14. }
  15.  
  16. /*********************************************************************
  17. //In person.initArgs()....
  18. //Note: the constructor also accepts name &amp; age, assigning them default values
  19. //if not specified.
  20. public function initArgs(name:String, age:uint):void
  21. {
  22.         this.name = name;
  23.         this.age = age;
  24. }
  25. *********************************************************************/

Now, I'm not sure if this is the best approach, but it works, and with a deadline approaching that's good enough for now :]



u dont have to create a variable, its enough just to reference to the class somewhere in the code;

package example
{
import example.items.*;
import flash.utils.getDefinitionByName;

// force import
example.items.Class1;
example.items.Class2;

class Test
{
public function Test()
{
var test:Class = getDefinitionByName(”example.items.Class1?) as Class;

var testInstance = new test();
}
}
}

posted @ 2010-02-14 15:40 北国狼人的BloG 阅读(228) | 评论 (0)编辑 收藏
FLEX 系统提供的事件与DOM的事件基本上完全一致 但是和传统的WEB开发不同的是  可以为自定义的组件添加自定义的事件    比如我们做了一个组件是一个登录框   当点击登录按钮的时候触发我们自定义的事件 比如叫"login"事件  虽然这个login事件 归根结底还是某个按钮的click事件 但自定义的事件比传统的事件有什么好处呢 :一是事件的名字是自定义的 可以形象的表示这个事件本身 而不像以前还要关心是哪个按钮按了一下等等  这样为组件与组件的通讯提供便利   下面的例子中自定义了一个组件叫testComponent , 这个自定义的组件中有一个按钮和一个输入框, 当按下这个按钮的时候   新建一个新的事件叫shareData
并且shareData事件被声明为一个textEvent ,  textEvent可以通过text属性来传递数据(textInput控件的值) 。

EventTest.mxml中引用了这个自定义组件testComponent 并捕获testComponent中的自定义事件shareData, 输出testComponent 中textInput控件的字符串
 
testComponent.mxml :
 
<?xml version="1.0" encoding="utf-8"?>
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml" height="300">
<!-- 声明本组件将抛出的事件 -->
<mx:Metadata>
 [Event(name="shareData",type="flash.events.TextEvent")]
</mx:Metadata>
<mx:Script>
 <![CDATA[
  private function fnOnClick_testComp():void {
   //event 构造函数 至少传递一个事件名
   var event:TextEvent = new TextEvent("shareData");
   event.text = myTxtInput.text;
   //使用disptchEvent 来抛出创建的事件
   dispatchEvent(event);
  }
 ]]>
</mx:Script>
 
<mx:Label text="This is the Test component" />
 <mx:TextInput id="myTxtInput"/>
 <!-- 当点击按钮时进行自定义事件 -->
 <mx:Button label="clickMe" click="fnOnClick_testComp()" />
</mx:VBox>
 
eventTest.mxml :
 
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
 xmlns:view="view.*">
 <mx:Script>
  <![CDATA[
   import mx.controls.Alert;
   private function fnOnShareData(event:TextEvent):void {
    Alert.show("event has been use. event.text => " + event.text );
   }
  ]]>
 </mx:Script>
 <!-- 调用我们自定义的组件  并处理它的shareData事件  就像click事件一样使用 -->
 <view:testComponent shareData="fnOnShareData(event)"/>
</mx:Application>
 

<?xml version="1.0" encoding="utf-8"?>
<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml"
     layout="absolute" width="200" height="150"
     title="请在此输入您的名字!" fontWeight="normal" fontSize="12" showCloseButton="true" close="PopUpManager.removePopUp(this);">
<mx:TextInput x="10" y="10" id="myTextInput"/>
<mx:Button x="36" y="74" label="确定" id="myButton"
         click="closeTitleWindow(event);"/>
    <mx:Script>
        <![CDATA[      
            import mx.managers.PopUpManager;
            import mx.controls.Text;
        
         // 定义一个变量来获取对主应用程序的引用
         public var myObj:Object;
        
            // 该方法用来关闭弹出的TitleWindow 容器.
            private function closeTitleWindow(event:MouseEvent):void {
                myObj.myLabel.text = "您输入的是:" + myTextInput.text;
                myObj.myLabel.setStyle("color",String(cp.selectedColor))
                PopUpManager.removePopUp(this);
            }
           
            private function close(evt:MouseEvent):void{
           
            PopUpManager.removePopUp(this);
            }
        ]]>
    </mx:Script>
    <mx:Button x="96" y="74" label="close" click="close(event);"/>
    <mx:ColorPicker x="10" y="44" id="cp" selectedColor="#F30A0A"/>
</mx:TitleWindow>

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" fontSize="12" xmlns:ns1="*" layout="absolute">
    <mx:Script>
        <![CDATA[
            import flash.events.*;
            import mx.managers.PopUpManager;
            import mx.containers.TitleWindow;   
                            
            // 响应按钮单击事件,弹出myTitleWindow对话框
            private function openWindow(event:MouseEvent):void {
                // 使用PopUpManager.createPopUp方法弹出myTitleWindow
                var aTitleWindow:title=title(PopUpManager.createPopUp(this,title, true));
                 PopUpManager.centerPopUp(aTitleWindow); //居中
                // 注意这里为自定义组件的myObj属性赋值以引用当前MXML文档
                aTitleWindow.myObj = this;
            }
        ]]>
    </mx:Script>
    <mx:Button label="打开对话框" click="openWindow(event);" x="404" y="24"/>
    <mx:Label id="myLabel" text="wait..." width="200" x="375" y="110" fontWeight="bold" fontSize="18" color="#06C9F3"/>
</mx:Application>

posted @ 2010-02-10 16:57 北国狼人的BloG 阅读(518) | 评论 (0)编辑 收藏
看到的这篇文章,虽然我不知道HP大中华区总裁孙振耀到底是怎样的人,不过这篇文章写的很诚恳,没有什么说教,是我见过的最好的感言之一,特意转载过来。这篇文章很长,不过值得花费一点时间和耐心看完。

一、关于工作与生活

我有个有趣的观察,外企公司多的是25-35岁的白领,40岁以上的员工很少,二三十岁的外企员工是意气风发的,但外企公司40岁附近的经理人是很尴尬的。我见过的40岁附近的外企经理人大多在一直跳槽,最后大多跳到民企,比方说,唐骏。外企员工的成功很大程度上是公司的成功,并非个人的成功,西门子的确比国美大,但并不代表西门子中国经理比国美的老板强,甚至可以说差得很远。而进外企的人往往并不能很早理解这一点,把自己的成功90%归功于自己的能力,实际上,外企公司随便换个中国区总经理并不会给业绩带来什么了不起的影响。好了问题来了,当这些经理人40多岁了,他们的薪资要求变得很高,而他们的才能其实又不是那么出众,作为外企公司的老板,你会怎么选择?有的是只要不高薪水的,要出位的精明强干精力冲沛的年轻人,有的是,为什么还要用你?

从上面这个例子,其实可以看到我们的工作轨迹,二三十岁的时候,生活的压力还比较小,身体还比较好,上面的父母身体还好,下面又没有孩子,不用还房贷,也没有孩子要上大学,当个外企小白领还是很光鲜的,挣得不多也够花了。但是人终归要结婚生子,终归会老,到了40岁,父母老了,要看病要吃药,要有人看护,自己要还房贷,要过基本体面的生活,要养小孩……那个时候需要挣多少钱才够花才重要。所以,看待工作,眼光要放远一点,一时的谁高谁低并不能说明什么。

从这个角度上来说,我不太赞成过于关注第一份工作的薪水,更没有必要攀比第一份工作的薪水,这在刚刚出校园的学生中间是很常见的。正常人大概要工作 35年,这好比是一场马拉松比赛,和真正的马拉松比赛不同的是,这次比赛没有职业选手,每个人都只有一次机会。要知到,有很多人甚至坚持不到终点,大多数人最后是走到终点的,只有少数人是跑过终点的,因此在刚开始的时候,去抢领先的位置并没有太大的意义。刚进社会的时候如果进500强公司,大概能拿到3k -6k/月的工资,有些特别技术的人才可能可以到8k/月,可问题是,5年以后拿多少?估计5k-10k了不起了。起点虽然高,但增幅有限,而且,后面的年轻人追赶的压力越来越大。

我前两天问我的一个销售,你会的这些东西一个新人2年就都学会了,但新人所要求的薪水却只是你的一半,到时候,你怎么办?
职业生涯就像一场体育比赛,有初赛、复赛、决赛。初赛的时候大家都刚刚进社会,大多数都是实力一般的人,这时候努力一点认真一点很快就能让人脱颖而出,于是有的人二十多岁做了经理,有的人迟些也终于赢得了初赛,三十多岁成了经理。然后是复赛,能参加复赛的都是赢得初赛的,每个人都有些能耐,在聪明才智上都不成问题,这个时候再想要胜出就不那么容易了,单靠一点点努力和认真还不够,要有很强的坚忍精神,要懂得靠团队的力量,要懂得收服人心,要有长远的眼光……

看上去赢得复赛并不容易,但,还不是那么难。因为这个世界的规律就是给人一点成功的同时让人骄傲自满,刚刚赢得初赛的人往往不知道自己赢得的仅仅是初赛,有了一点小小的成绩大多数人都会骄傲自满起来,认为自己已经懂得了全部,不需要再努力再学习了,他们会认为之所以不能再进一步已经不是自己的原因了。虽然他们仍然不好对付,但是他们没有耐性,没有容人的度量,更没有清晰长远的目光。就像一只愤怒的斗牛,虽然猛烈,最终是会败的,而赢得复赛的人则象斗牛士一样,不急不躁,跟随着自己的节拍,慢慢耗尽对手的耐心和体力。赢得了复赛以后,大约已经是一位很了不起的职业经理人了,当上了中小公司的总经理,大公司的副总经理,主管着每年几千万乃至几亿的生意。

最终的决赛来了,说实话我自己都还没有赢得决赛,因此对于决赛的决胜因素也只能凭自己的猜测而已,这个时候的输赢或许就像武侠小说里写得那样,大家都是高手,只能等待对方犯错了,要想轻易击败对手是不可能的,除了使上浑身解数,还需要一点运气和时间。世界的规律依然发挥着作用,赢得复赛的人已经不只是骄傲自满了,他们往往刚愎自用,听不进去别人的话,有些人的脾气变得暴躁,心情变得浮躁,身体变得糟糕,他们最大的敌人就是他们自己,在决赛中要做的只是不被自己击败,等着别人被自己击败。这和体育比赛是一样的,最后高手之间的比赛,就看谁失误少谁就赢得了决赛。

二、 根源

你工作快乐么?你的工作好么?

有没有觉得干了一段时间以后工作很不开心?有没有觉得自己入错了行?有没有觉得自己没有得到应有的待遇?有没有觉得工作像一团乱麻每天上班都是一种痛苦?有没有很想换个工作?有没有觉得其实现在的公司并没有当初想象得那么好?有没有觉得这份工作是当初因为生存压力而找的,实在不适合自己?你从工作中得到你想要得到的了么?你每天开心么?

天涯上愤怒的人很多,你有没有想过,你为什么不快乐?你为什么愤怒?

其实,你不快乐的根源,是因为你不知道要什么!你不知道要什么,所以你不知道去追求什么,你不知道追求什么,所以你什么也得不到。

我总觉得,职业生涯首先要关注的是自己,自己想要什么?大多数人大概没想过这个问题,唯一的想法只是——我想要一份工作,我想要一份不错的薪水,我知道所有人对于薪水的渴望,可是,你想每隔几年重来一次找工作的过程么?你想每年都在这种对于工作和薪水的焦急不安中度过么?不想的话,就好好想清楚。饮鸩止渴,不能因为口渴就拼命喝毒药。越是焦急,越是觉得自己需要一份工作,越饥不择食,越想不清楚,越容易失败,你的经历越来越差,下一份工作的人看着你的简历就皱眉头。于是你越喝越渴,越渴越喝,陷入恶性循环。最终只能哀叹世事不公或者生不逢时,只能到天涯上来发泄一把,在失败者的共鸣当中寻求一点心理平衡罢了。大多数人都有生存压力,我也是,有生存压力就会有很多焦虑,积极的人会从焦虑中得到动力,而消极的人则会因为焦虑而迷失方向。所有人都必须在压力下做出选择,这就是世道,你喜欢也罢不喜欢也罢。

一般我们处理的事情分为重要的事情和紧急的事情,如果不做重要的事情就会常常去做紧急的事情。比如锻炼身体保持健康是重要的事情,而看病则是紧急的事情。如果不锻炼身体保持健康,就会常常为了病痛烦恼。又比如防火是重要的事情,而救火是紧急的事情,如果不注意防火,就要常常救火。找工作也是如此,想好自己究竟要什么是重要的事情,找工作是紧急的事情,如果不想好,就会常常要找工作。往往紧急的事情给人的压力比较大,迫使人们去赶紧做,相对来说重要的事情反而没有那么大的压力,大多数人做事情都是以压力为导向的,压力之下,总觉得非要先做紧急的事情,结果就是永远到处救火,永远没有停歇的时候。(很多人的工作也像是救火队一样忙碌痛苦,也是因为工作中没有做好重要的事情。)那些说自己活在水深火热为了生存顾不上那么多的朋友,今天找工作困难是当初你们没有做重要的事情,是结果不是原因。如果今天你们还是因为急于要找一份工作而不去思考,那么或许将来要继续承受痛苦找工作的结果。

我始终觉得我要说的话题,沉重了点,需要很多思考,远比唐笑打武警的话题来的枯燥乏味,但是,天下没有轻松的成功,成功,要付代价。请先忘记一切的生存压力,想想这辈子你最想要的是什么?所以,最要紧的事情,先想好自己想要什么。

三、什么是好工作

当初微软有个唐骏,很多大学里的年轻人觉得这才是他们向往的职业生涯,我在清华bbs里发的帖子被这些学子们所不屑,那个时候学生们只想出国或者去外企,不过如今看来,我还是对的,唐骏去了盛大,陈天桥创立的盛大,一家民营公司。一个高学历的海归在500强的公司里拿高薪水,这大约是很多年轻人的梦想,问题是,每年毕业的大学生都在做这个梦,好的职位却只有500个。

人都是要面子的,也是喜欢攀比的,即使在工作上也喜欢攀比,不管那是不是自己想要的。大家认为外企公司很好,可是好在哪里呢?好吧,他们在比较好的写字楼,这是你想要的么?他们出差住比较好的酒店,这是你想要的么?别人会羡慕一份外企公司的工作,这是你想要的么?那一切都是给别人看的,你干吗要活得那么辛苦给别人看?另一方面,他们薪水福利一般,并没有特别了不起,他们的晋升机会比较少,很难做到很高阶的主管,他们虽然厌恶常常加班,却不敢不加班,因为“你不干有得是人干”,大部分情况下会找个台湾人香港人新加坡人来管你,而这些人又往往有些莫名其妙的优越感。你想清楚了么?500强一定好么?找工作究竟是考虑你想要什么,还是考虑别人想看什么?

我的大学同学们大多数都到美国了,甚至毕业这么多年了,还有人最近到国外去了。出国真的有那么好么?我的大学同学们,大多数还是在博士、博士后、访问学者地挣扎着,至今只有一个正经在一个美国大学里拿到个正式的教职。国内的教授很难当么?我有几个表亲也去了国外了,他们的父母独自在国内,没有人照顾,有好几次人在家里昏倒都没人知道,出国,真的这么光彩么?就像有人说的“很多事情就像看A片,看的人觉得很爽,做的人未必。”

人总想找到那个最好的,可是,什么是最好的?你觉得是最好的那个,是因为你的确了解,还是因为别人说他是最好的?即使他对于别人是最好的,对于你也一定是最好的么?

对于自己想要什么,自己要最清楚,别人的意见并不是那么重要。很多人总是常常被别人的意见所影响,亲戚的意见,朋友的意见,同事的意见……问题是,你究竟是要过谁的一生?人的一生不是父母一生的续集,也不是儿女一生的前传,更不是朋友一生的外篇,只有你自己对自己的一生负责,别人无法也负不起这个责任。自己做的决定,至少到最后,自己没什么可后悔。对于大多数正常智力的人来说,所做的决定没有大的对错,无论怎么样的选择,都是可以尝试的。比如你没有考自己上的那个学校,没有入现在这个行业,这辈子就过不下去了?就会很失败?不见得。

我想,好工作,应该是适合你的工作,具体点说,应该是能给你带来你想要的东西的工作,你或许应该以此来衡量你的工作究竟好不好,而不是拿公司的大小,规模,外企还是国企,是不是有名,是不是上市公司来衡量。小公司,未必不是好公司,赚钱多的工作,也未必是好工作。你还是要先弄清楚你想要什么,如果你不清楚你想要什么,你就永远也不会找到好工作,因为你永远只看到你得不到的东西,你得到的,都是你不想要的。
可能,最好的,已经在你的身边,只是,你还没有学会珍惜。人们总是盯着得不到的东西,而忽视了那些已经得到的东西。

四、普通人

我发现中国人的励志和国外的励志存在非常大的不同,中国的励志比较鼓励人立下大志愿,卧薪尝胆,有朝一日成富成贵。而国外的励志比较鼓励人勇敢面对现实生活,面对普通人的困境,虽然结果也是成富成贵,但起点不一样,相对来说,我觉得后者在操作上更现实,而前者则需要用999个失败者来堆砌一个成功者的故事。

我们都是普通人,普通人的意思就是,概率这件事是很准的。因此,我们不会买彩票中500万,我们不会成为比尔盖茨或者李嘉诚,我们不会坐飞机掉下来,我们当中很少的人会创业成功,我们之中有30%的人会离婚,我们之中大部分人会活过65岁……

所以请你在想自己要什么的时候,要得“现实”一点,你说我想要做李嘉诚,抱歉,我帮不上你。成为比尔盖茨或者李嘉诚这种人,是靠命的,看我写的这篇文章绝对不会让你成为他们,即使你成为了他们,也绝对不是我这篇文章的功劳。“王侯将相宁有种乎”但真正当皇帝的只有一个人,王侯将相,人也不多。目标定得高些对于喜欢挑战的人来说有好处,但对于大多数普通人来说,反而比较容易灰心沮丧,很容易就放弃了。

回过头来说,李嘉诚比你有钱大致50万倍,他比你更快乐么?或许。有没有比你快乐50万倍,一定没有。他比你最多也就快乐一两倍,甚至有可能还不如你快乐。寻找自己想要的东西不是和别人比赛,比谁要得更多更高,比谁的目标更远大。虽然成为李嘉诚这个目标很宏大,但你并不见得会从这个目标以及追求目标的过程当中获得快乐,而且基本上你也做不到。你必须听听你内心的声音,寻找真正能够使你获得快乐的东西,那才是你想要的东西。
你想要的东西,或者我们把它称之为目标,目标其实并没有高低之分,你不需要因为自己的目标没有别人远大而不好意思,达到自己的目标其实就是成功,成功有大有小,快乐却是一样的。我们追逐成功,其实追逐的是成功带来的快乐,而非成功本身。职业生涯的道路上,我们常常会被攀比的心态蒙住眼睛,忘记了追求的究竟是什么,忘记了是什么能使我们更快乐。

社会上一夜暴富的新闻很多,这些消息,总会在我们的心里面掀起很多涟漪,涟漪多了就变成惊涛骇浪,心里的惊涛骇浪除了打翻承载你目标的小船,并不会使得你也一夜暴富。“只见贼吃肉,不见贼挨揍。”我们这些普通人既没有当贼的勇气,又缺乏当贼的狠辣绝决,虽然羡慕吃肉,却更害怕挨揍,偶尔看到几个没挨揍的贼就按奈不住,或者心思活动,或者大感不公,真要叫去做贼,却也不敢。

我还是过普通人的日子,要普通人的快乐,至少,晚上睡得着觉。

五、跳槽与积累

首先要说明,工作是一件需要理智的事情,所以不要在工作上耍个性,天涯上或许会有人觉得你很有个性而叫好,煤气公司电话公司不会因为觉得你很有个性而免了你的帐单。当你很帅地炒掉了你的老板,当你很酷地挖苦了一番招聘的HR,账单还是要照付,只是你赚钱的时间更少了,除了你自己,没人受损失。

我并不反对跳槽,但跳槽决不是解决问题的办法,而且频繁跳槽的后果是让人觉得没有忠诚度可言,而且不能安心工作。现在很多人从网上找工作,很多找工作的网站常常给人出些馊主意,要知道他们是盈利性企业,当然要从自身盈利的角度来考虑,大家越是频繁跳槽频繁找工作他们越是生意兴隆,所以鼓动人们跳槽是他们的工作。所以他们会常常告诉你,你拿的薪水少了,你享受的福利待遇差了,又是“薪情快报”又是“赞叹自由奔放的灵魂”。至于是否会因此让你不能安心,你跳了槽是否解决问题,是否更加开心,那个,他们管不着。

要跳槽肯定是有问题,一般来说问题发生了,躲是躲不开的,很多人跳槽是因为这样或者那样的不开心,如果这种不开心,在现在这个公司不能解决,那么在下一个公司多半也解决不掉。你必须相信,90%的情况下,你所在的公司并没有那么烂,你认为不错的公司也没有那么好。就像围城里说的,“城里的人拼命想冲出来,而城外的人拼命想冲进去。”每个公司都有每个公司的问题,没有问题的公司是不存在的。换个环境你都不知道会碰到什么问题,与其如此,不如就在当下把问题解决掉。很多问题当你真的想要去解决的时候,或许并没有那么难。有的时候你觉得问题无法解决,事实上,那只是“你觉得”。

人生的曲线应该是曲折向上的,偶尔会遇到低谷但大趋势总归是曲折向上的,而不是象脉冲波一样每每回到起点,我见过不少面试者,30多岁了,四五份工作经历,每次多则3年,少则1年,30多岁的时候回到起点从一个初级职位开始干起,拿基本初级的薪水,和20多岁的年轻人一起竞争,不觉得有点辛苦么?这种日子好过么?

我非常不赞成在一个行业超过3年以后换行业,基本上,35岁以前我们的生存资本靠打拼,35岁以生存的资本靠的就是积累,这种积累包括人际关系,经验,人脉,口碑……如果常常更换行业,代表几年的积累付之东流,一切从头开始,如果换了两次行业,35岁的时候大概只有5年以下的积累,而一个没有换过行业的人至少有了10年的积累,谁会占优势?工作到2-3年的时候,很多人觉得工作不顺利,好像到了一个瓶颈,心情烦闷,就想辞职,乃至换一个行业,觉得这样所有一切烦恼都可以抛开,会好很多。其实这样做只是让你从头开始,到了时候还是会发生和原来行业一样的困难,熬过去就向上跨了一大步,要知道每个人都会经历这个过程,每个人的职业生涯中都会碰到几个瓶颈,你熬过去了而别人没有熬过去你就领先了。跑长跑的人会知道,开始的时候很轻松,但是很快会有第一次的难受,但过了这一段又能跑很长一段,接下来会碰到第二次的难受,坚持过了以后又能跑一段,如此往复,难受一次比一次厉害,直到坚持不下去了。大多数人第一次就坚持不了了,一些人能坚持到第二次,第三次虽然大家都坚持不住了,可是跑到这里的人也没几个了,这点资本足够你安稳活这一辈子了。

一份工作到两三年的时候,大部分人都会变成熟手,这个时候往往会陷入不断的重复,有很多人会觉得厌倦,有些人会觉得自己已经搞懂了一切,从而懒得去寻求进步了。很多时候的跳槽是因为觉得失去兴趣了,觉得自己已经完成比赛了。其实这个时候比赛才刚刚开始,工作两三年的人,无论是客户关系,人脉,手下,和领导的关系,在业内的名气……还都是远远不够的,但稍有成绩的人总是会自我感觉良好的,每个人都觉得自己跟客户关系铁得要命,觉得自己在业界的口碑好得很。其实可以肯定地说,一定不是,这个时候,还是要拿出前两年的干劲来,稳扎稳打,积累才刚刚开始。
你足够了解你的客户吗?你知道他最大的烦恼是什么吗?你足够了解你的老板么?你知道他最大的烦恼是什么吗?你足够了解你的手下么?你知道他最大的烦恼是什么吗?如果你不知道,你凭什么觉得自己已经积累够了?如果你都不了解,你怎么能让他们帮你的忙,做你想让他们做的事情?如果他们不做你想让他们做的事情,你又何来的成功?

六、等待

这是个浮躁的人们最不喜欢的话题,本来不想说这个话题,因为会引起太多的争论,而我又无意和人争论这些,但是考虑到对于职业生涯的长久规划,这是一个躲避不了的话题,还是决定写一写,不爱看的请离开吧。

并不是每次穿红灯都会被汽车撞,并不是每个罪犯都会被抓到,并不是每个错误都会被惩罚,并不是每个贪官都会被枪毙,并不是你的每一份努力都会得到回报,并不是你的每一次坚持都会有人看到,并不是你每一点付出都能得到公正的回报,并不是你的每一个善意都能被理解……这个,就是世道。好吧,世道不够好,可是,你有推翻世道的勇气么?如果没有,你有更好的解决办法么?有很多时候,人需要一点耐心,一点信心。每个人总会轮到几次不公平的事情,而通常,安心等待是最好的办法。

有很多时候我们需要等待,需要耐得住寂寞,等待属于你的那一刻。周润发等待过,刘德华等待过,周星驰等待过,王菲等待过,张艺谋也等待过……看到了他们如今的功成名就的人,你可曾看到当初他们的等待和耐心?你可曾看到金马奖影帝在街边摆地摊?你可曾看到德云社一群人在剧场里给一位观众说相声?你可曾看到周星驰的角色甚至连一句台词都没有?每一个成功者都有一段低沉苦闷的日子,我几乎能想象得出来他们借酒浇愁的样子,我也能想象得出他们为了生存而挣扎的窘迫。在他们一生最中灿烂美好的日子里,他们渴望成功,但却两手空空,一如现在的你。没有人保证他们将来一定会成功,而他们的选择是耐住寂寞。如果当时的他们总念叨着“成功只是属于特权阶级的”,你觉得他们今天会怎样?

曾经我也不明白有些人为什么并不比我有能力却要坐在我的头上,年纪比我大就一定要当我的领导么?为什么有些烂人不需要努力就能赚钱?为什么刚刚改革开放的时候的人能那么容易赚钱,而轮到我们的时候,什么事情都要正规化了?有一天我突然想,我还在上学的时候他们就在社会里挣扎奋斗了,他们在社会上奋斗积累了十几二十年,我们新人来了,他们有的我都想要,我这不是在要公平,我这是在要抢劫。因为我要得太急,因为我忍不住寂寞。二十多岁的男人,没有钱,没有事业,却有蓬勃的欲望。

人总是会遇到挫折的,人总是会有低潮的,人总是会有不被人理解的时候的,人总是有要低声下气的时候,这些时候恰恰是人生最关键的时候,因为大家都会碰到挫折,而大多数人过不了这个门槛,你能过,你就成功了。在这样的时刻,我们需要耐心等待,满怀信心地去等待,相信,生活不会放弃你,机会总会来的。至少,你还年轻,你没有坐牢,没有生治不了的病,没有欠还不起的债。比你不幸的人远远多过比你幸运的人,你还怕什么?路要一步步走,虽然到达终点的那一步很激动人心,但大部分的脚步是平凡甚至枯燥的,但没有这些脚步,或者耐不住这些平凡枯燥,你终归是无法迎来最后的那些激动人心。

逆境,是上帝帮你淘汰竞争者的地方。要知道,你不好受,别人也不好受,你坚持不下去了,别人也一样,千万不要告诉别人你坚持不住了,那只能让别人获得坚持的信心,让竞争者看着你微笑的面孔,失去信心,退出比赛。胜利属于那些有耐心的人。

在最绝望的时候,我会去看电影《The Pursuit of Happyness》《JerryMaguire》,让自己重新鼓起勇气,因为,无论什么时候,我们总还是有希望。当所有的人离开的时候,我不失去希望,我不放弃。每天下班坐在车里,我喜欢哼着《隐形的翅膀》看着窗外,我知道,我在静静等待,等待属于我的那一刻。

原贴里伊吉网友的话我很喜欢,抄录在这里:

每个人都希望,自己是独一无二的特殊者
含着金匙出生、投胎到好家庭、工作安排到电力局拿1w月薪这样的小概率事件,当然最好轮到自己
红军长征两万五、打成右派反革命、胼手胝足牺牲尊严去奋斗,最好留给祖辈父辈和别人
自然,不是每个吃过苦的人都会得到回报
但是,任何时代,每一个既得利益者身后,都有他的祖辈父辈奋斗挣扎乃至流血付出生命的身影
羡慕别人有个好爸爸,没什么不可以
问题是,你的下一代,会有一个好爸爸吗?
至于问到为什么不能有同样的赢面概率?我只能问:为什么物种竞争中,人和猴子不能有同样的赢面概率?
物竞天择。猴子的灵魂不一定比你卑微,但你身后有几十万年的类人猿进化积淀。

七、入对行跟对人

在中国,大概很少有人是一份职业做到底的,虽然如此,第一份工作还是有些需要注意的地方,有两件事情格外重要,第一件是入行,第二件事情是跟人。第一份工作对人最大的影响就是入行,现代的职业分工已经很细,我们基本上只能在一个行业里成为专家,不可能在多个行业里成为专家。很多案例也证明即使一个人在一个行业非常成功,到另外一个行业,往往完全不是那么回事情,“你想改变世界,还是想卖一辈子汽水?”是乔布斯邀请百事可乐总裁约翰·斯考利加盟苹果时所说的话,结果这位在百事非常成功的约翰,到了苹果表现平平。其实没有哪个行业特别好,也没有哪个行业特别差,或许有报道说哪个行业的平均薪资比较高,但是他们没说的是,那个行业的平均压力也比较大。看上去很美的行业一旦进入才发现很多地方其实并不那么完美,只是外人看不见。

说实话,我自己都没有发大财,所以我的建议只是让人快乐工作的建议,不是如何发大财的建议,我们只讨论一般普通打工者的情况。我认为选择什么行业并没有太大关系,看问题不能只看眼前。比如,从前年开始,国家开始整顿医疗行业,很多医药公司开不下去,很多医药行业的销售开始转行。其实医药行业的不景气是针对所有公司的,并非针对一家公司,大家的日子都不好过,这个时候跑掉是非常不划算的,大多数正规的医药公司即使不做新生意撑个两三年总是能撑的,大多数医药销售靠工资撑个两三年也是可以撑的,国家不可能永远捏着医药行业不放的,两三年以后光景总归还会好起来的,那个时候别人都跑了而你没跑,那时的日子应该会好过很多。有的时候觉得自己这个行业不行了,问题是,再不行的行业,做得人少了也变成了好行业,当大家都觉得不好的时候,往往却是最好的时候。大家都觉得金融行业好,金融行业门槛高不说,有多少人削尖脑袋要钻进去,竞争激励,进去以后还要时时提防,一个疏忽,就被后来的人给挤掉了,压力巨大,又如何谈得上快乐?也就未必是“好”工作了。

太阳能这个东西至今还不能进入实际应用的阶段,但是中国已经有7家和太阳能有关的公司在纽交所上市了,国美苏宁永乐其实是贸易型企业,也能上市,鲁泰纺织连续10年利润增长超过50%,卖茶的一茶一座,卖衣服的海澜之家都能上市……其实选什么行业真的不重要,关键是怎么做。事情都是人做出来的,关键是人。

有一点是需要记住的,这个世界上,有史以来直到我们能够预见得到的未来,成功的人总是少数,有钱的人总是少数,大多数人是一般的,普通的,不太成功的。因此,大多数人的做法和看法,往往都不是距离成功最近的做法和看法。因此大多数人说好的东西不见得好,大多数人说不好的东西不见得不好。大多数人都去炒股的时候说明跌只是时间问题,大家越是热情高涨的时候,跌的日子越近。大多数人买房子的时候,房价不会涨,而房价涨的差不多的时候,大多数人才开始买房子。不会有这样一件事情让大家都变成功,发了财,历史上不曾有过,将来也不会发生。有些东西即使一时运气好得到了,还是会在别的时候别的地方失去的。

年轻人在职业生涯的刚开始,尤其要注意的是,要做对的事情,不要让自己今后几十年的人生总是提心吊胆,更不值得为了一份工作赔上自己的青春年华。我的公司是个不行贿的公司,以前很多人不理解,甚至自己的员工也不理解,不过如今,我们是同行中最大的企业,客户乐意和我们打交道,尤其是在国家打击腐败的时候,每个人都知道我们做生意不给钱的名声,都敢于和我们做生意。而勇于给钱的公司,不是倒了,就是跑了,要不就是每天睡不好觉,人还是要看长远一点。很多时候,看起来最近的路,其实是最远的路,看起来最远的路,其实是最近的路。

跟对人是说,入行后要跟个好领导好老师,刚进社会的人做事情往往没有经验,需要有人言传身教。对于一个人的发展来说,一个好领导是非常重要的。所谓“好”的标准,不是他让你少干活多拿钱,而是以下三个。

首先,好领导要有宽广的心胸,如果一个领导每天都会发脾气,那几乎可以肯定他不是个心胸宽广的人,能发脾气的时候却不发脾气的领导,多半是非常厉害的领导。中国人当领导最大的毛病是容忍不了能力比自己强的人,所以常常可以看到的一个现象是,领导很有能力,手下一群庸才或者手下一群闲人。如果看到这样的环境,还是不要去的好。

其次,领导要愿意从下属的角度来思考问题,这一点其实是从面试的时候就能发现的,如果这位领导总是从自己的角度来考虑问题,几乎不听你说什么,这就危险了。从下属的角度来考虑问题并不代表同意下属的说法,但他必须了解下属的立场,下属为什么要这么想,然后他才有办法说服你,只关心自己怎么想的领导往往难以获得下属的信服。

第三,领导敢于承担责任,如果出了问题就把责任往下推,有了功劳就往自己身上揽,这样的领导不跟也罢。选择领导,要选择关键时刻能抗得住的领导,能够为下属的错误买单的领导,因为这是他作为领导的责任。

有可能,你碰不到好领导,因为,中国的领导往往是屁股决定脑袋的领导,因为他坐领导的位置,所以他的话就比较有道理,这是传统观念官本位的误区,可能有大量的这种无知无能的领导,只是,这对于你其实是好事,如果将来有一天你要超过他,你希望他比较聪明还是比较笨?相对来说这样的领导其实不难搞定,只是你要把自己的身段放下来而已。多认识一些人,多和比自己强的人打交道,同样能找到好的老师,不要和一群同样郁闷的人一起控诉社会,控诉老板,这帮不上你,只会让你更消极。和那些比你强的人打交道,看他们是怎么想的,怎么做的,学习他们,然后跟更强的人打交道。

八、选择

我们每天做的最多的事情,其实是选择,因此在谈职业生涯的时候不得不提到这个话题。

我始终认为,在很大的范围内,我们究竟会成为一个什么样的人,决定权在我们自己,每天我们都在做各种各样的选择,我可以不去写这篇文章,去别人的帖子拍拍砖头,也可以写下这些文字,帮助别人的同时也整理自己的思路,我可以多注意下格式让别人易于阅读,也可以写成一堆,我可以就这样发上来,也可以在发以前再看几遍,你可以选择不刮胡子就去面试,也可以选择出门前照照镜子……每天,每一刻我们都在做这样那样的决定,我们可以漫不经心,也可以多花些心思,成千上万的小选择累计起来,就决定了最终我们是个什么样的人。

从某种意义上来说我们的未来不是别人给的,是我们自己选择的,很多人会说我命苦啊,没得选择阿,如果你认为“去微软还是去IBM”“上清华还是上北大”“当销售副总还是当厂长”这种才叫选择的话,的确你没有什么选择,大多数人都没有什么选择。但每天你都可以选择是否为客户服务更周到一些,是否对同事更耐心一些,是否把工作做得更细致一些,是否把情况了解得更清楚一些,是否把不清楚的问题再弄清楚一些……你也可以选择在是否在痛苦中继续坚持,是否抛弃掉自己的那些负面的想法,是否原谅一个人的错误,是否相信我在这里写下的这些话,是否不要再犯同样的错误……生活每天都在给你选择的机会,每天都在给你改变自己人生的机会,你可以选择赖在地上撒泼打滚,也可以选择咬牙站起来。你永远都有选择。有些选择不是立杆见影的,需要累积,比如农民可以选择自己常常去浇地,也可以选择让老天去浇地,诚然你今天浇水下去苗不见得今天马上就长出来,但常常浇水,大部分苗终究会长出来的,如果你不浇,收成一定很糟糕。

每天生活都在给你机会,他不会给你一叠现金也不会拱手送你个好工作,但实际上,他还是在给你机会。我的家庭是一个普通的家庭,没有任何了不起的社会关系,我的父亲在大学毕业以后就被分配到了边疆,那个小县城只有一条马路,他们那一代人其实比我们更有理由抱怨,他们什么也没得到,年轻的时候文化大革命,书都没得读,支援边疆插队落户,等到老了,却要给年轻人机会了。他有足够的理由象成千上万那样的青年一样坐在那里抱怨生不逢时,怨气冲天。然而在分配到边疆的十年之后,国家恢复招研究生,他考回了原来的学校。研究生毕业,他被分配到了安徽一家小单位里,又是3年以后,国家第一届招收博士生,他又考回了原来的学校,成为中国第一代博士,那时的他比现在的我年纪还大。生活并没有放弃他,他也没有放弃生活。10年的等待,他做了他自己的选择,他没有放弃,他没有破罐子破摔,所以时机到来的时候,他改变了自己的人生。你最终会成为什么样的人,就决定在你的每个小小的选择之间。

你选择相信什么?你选择和谁交朋友?你选择做什么?你选择怎么做?……我们面临太多的选择,而这些选择当中,意识形态层面的选择又远比客观条件的选择来得重要得多,比如选择做什么产品其实并不那么重要,而选择怎么做才重要。选择用什么人并不重要,而选择怎么带这些人才重要。大多数时候选择客观条件并不要紧,大多数关于客观条件的选择并没有对错之分,要紧的是选择怎么做。一个大学生毕业了,他要去微软也好,他要卖猪肉也好,他要创业也好,他要做游戏代练也好,只要不犯法,不害人,都没有什么关系,要紧的是,选择了以后,怎么把事情做好。

除了这些,你还可以选择时间和环境,比如,你可以选择把这辈子最大的困难放在最有体力最有精力的时候,也可以走一步看一步,等到了40岁再说,只是到了40多岁,那正是一辈子最脆弱的时候,上有老下有小,如果在那个时候碰上了职业危机,实在是一件很苦恼的事情。与其如此不如在20多岁30多岁的时候吃点苦,好让自己脆弱的时候活得从容一些。你可以选择在温室里成长,也可以选择到野外磨砺,你可以选择在办公室吹冷气的工作,也可以选择40度的酷热下,去见你的客户,只是,这一切最终会累积起来,引导你到你应得的未来。

我不敢说所有的事情你都有得选择,但是绝大部分事情你有选择,只是往往你不把这当作一种选择。认真对待每一次选择,才会有比较好的未来。

九、选择职业

职业的选择,总的来说,无非就是销售、市场、客服、物流、行政、人事、财务、技术、管理几个大类,有个有趣的现象就是,500强的CEO当中最多的是销售出身,第二多的人是财务出身,这两者加起来大概超过95%。现代IT行业也有技术出身成为老板的,但实际上,后来他们还是从事了很多销售和市场的工作,并且表现出色,公司才获得了成功,完全靠技术能力成为公司老板的,几乎没有。这是有原因的,因为销售就是一门跟人打交道的学问,而管理其实也是跟人打交道的学问,这两者之中有很多相通的东西,他们的共同目标就是“让别人去做某件特定的事情。”而财务则是从数字的层面了解生意的本质,从宏观上看待生意的本质,对于一个生意是否挣钱,是否可以正常运作有着最深刻的认识。

公司小的时候是销售主导公司,而公司大的时候是财务主导公司,销售的局限性在于只看人情不看数字,财务的局限性在于只看数字不看人情。公司初期,运营成本低,有订单就活得下去,跟客户也没有什么谈判的条件,别人肯给生意做已经谢天谢地了,这个时候订单压倒一切,客户的要求压倒一切,所以当然要顾人情。公司大了以后,一切都要规范化,免得因为不规范引起一些不必要的风险,同时运营成本也变高,必须提高利润率,把有限的资金放到最有产出的地方。对于上市公司来说,股东才不管你客户是不是最近出国,最近是不是那个省又在搞严打,到了时候就要把业绩拿出来,拿不出来就抛股票,这个时候就是数字压倒一切。

前两天听到有人说一句话觉得很有道理,开始的时候我们想“能做什么?”,等到公司做大了有规模了,我们想“不能做什么。”很多人在工作中觉得为什么领导这么保守,这也不行那也不行,错过很多机会。很多时候是因为,你还年轻,你想的是“能做什么”,而作为公司领导要考虑的方面很多,他比较关心“不能做什么”。

我并非鼓吹大家都去做销售或者财务,究竟选择什么样的职业,和你究竟要选择什么样的人生有关系,有些人就喜欢下班按时回家,看看书听听音乐,那也挺好,但就不适合找个销售的工作了,否则会是折磨自己。有些人就喜欢出风头,喜欢成为一群人的中心,如果选择做财务工作,大概也干不久,因为一般老板不喜欢财务太积极,也不喜欢财务话太多。先想好自己要过怎样的人生,再决定要找什么样的职业。有很多的不快乐,其实是源自不满足,而不满足,很多时候是源自于心不定,而心不定则是因为不清楚究竟自己要什么,不清楚要什么的结果就是什么都想要,结果什么都没得到。
我想,我们还是因为生活而工作,不是因为工作而生活,生活是最要紧的,工作只是生活中的一部分。我总是觉得生活的各方方面都是相互影响的,如果生活本身一团乱麻,工作也不会顺利。所以要有娱乐、要有社交、要锻炼身体,要有和睦的家庭……最要紧的,要开心,我的两个销售找我聊天,一肚子苦水,我问他们, 2年以前,你什么都没有,工资不高,没有客户关系,没有业绩,处于被开的边缘,现在的你比那时条件好了很多,为什么现在却更加不开心了?如果你做得越好越不开心,那你为什么还要工作?首先的首先,人还是要让自己高兴起来,让自己心态好起来,这种发自内心的改变会让你更有耐心,更有信心,更有气质,更能包容……否则,看看镜子里的你,你满意么?

有人会说,你说得容易,我每天加班,不加班老板就会把我炒掉,每天累得要死,哪有时间娱乐、社交、锻炼?那是人们把目标设定太高的缘故,如果你还在动不动就会被老板炒掉的边缘,那么你当然不能设立太高的目标,难道你还想每天去打高尔夫?你没时间去健身房锻炼身体,但是上下班的时候多走几步可以吧,有楼梯的时候走走楼梯不走电梯可以吧?办公的间隙扭扭脖子拉拉肩膀做做俯卧撑可以吧?谁规定锻炼就一定要拿出每天2个小时去健身房?你没时间社交,每月参加郊游一次可以吧,周末去参加个什么音乐班,绘画班之类的可以吧,去尝试认识一些同行,和他们找机会交流交流可以吧?开始的时候总是有些难的,但迈出这一步就会向良性循环的方向发展。而每天工作得很苦闷,剩下的时间用来咀嚼苦闷,只会陷入恶性循环,让生活更加糟糕。

虽然离开惠普仅有十五天,但感觉上惠普已经离我很远。我的心思更多放在规划自己第二阶段的人生,这并非代表我对惠普没有任何眷恋,主要还是想以此驱动自己往前走。

万科王石登珠穆朗玛峰的体验给我很多启发,虽然在出发时携带大量的物资,但是登顶的过程中,必须不断减轻负荷,最终只有一个氧气瓶和他登上峰顶。登山如此,漫长的人生又何尝不是。
我宣布退休后,接到同事朋友同学的祝贺。大部分人都认为我能够在这样的职位上及年龄选择退休,是一种勇气,也是一种福气。
还有一部分人怀疑我只是借此机会换个工作,当然还有一些人说我在HP做不下去了,趁此机会离开。
我多年来已经习惯别人对我的说三道四,但对于好友,我还是挺关心大家是否真正理解我的想法,这也是写这篇文章的目的。
由于受我父亲早逝的影响,我很早就下定决心,要在有生之年实现自己的愿望,我不要像我父亲一样,为家庭生活忙碌一辈子,临终前感伤,懊恼自己有很多没有实现的理想。
一本杂志的文章提到我们在生前就应该思考自己的墓志铭,因为那代表你自己对完美人生的定义,我们应该尽可能在有生之年去实现它。
我希望我的墓志铭上除了与家人及好友有关的内容外,是这样写着:
1.这个人曾经服务于一家全球最大的IT公司(HP)25年,和她一起经历过数次重大的变革,看着她从以电子仪表为主要的业务变革成全球最大的IT公司。
2.这个人曾经在全球发展最快的国家(中国)工作16年,并担任HP中国区总裁7年,见证及经历过中国改革开放的关键最新突破阶段,与中国一起成长。
3.这个人热爱飞行,曾经是一个有执照的飞行员,累积飞行时数超过X小时,曾经在X个机场起降过。
4.这个人曾经获得管理硕士学位,在领导管理上特别关注中国企业的组织行为及绩效,并且在这个领域上获得中国企业界的认可。
我费时25年才总结1和2两项成果,我不知还要费时多久才能达成3和4的愿望,特别是第4个愿望需要经历学术的训练,才能将我的经验总结成知识。
否则我的经验将无法有效影响及传授他人。因此重新进入学校学习,拿一个管理学位是有必要的,更何况这是我一个非常重要的愿望。
另一方面,我25年的时间都花在运营(operation)的领域,兢兢业业的做好职业人士的工作,它是一份好工作,特别是在HP,这份工作也帮助我建立财务的基础,支持家庭的发展。
但是我不想终其一生,都陷入在运营的领域,我想象企业家一样,有机会靠一些点子(ideas)赚钱,虽然风险很高,但是值得一试,即使失败,也不枉走一回,这也是第4个愿望其中的一部份。
Carly Fiorina曾经对我说过“这个世界上有好想法的人很多,但有能力去实现的人很少”,2007年5月21日在北大演讲时,有人问起那些书对我影响较大,我想对我人生观有影响的其中一本书叫“TriggerPoint”,它的主要观点是:人生最需要的不是规划,而是在适当的时机掌握机会,采取行动。
我这些愿望在我心中已经酝酿一段很长的时间,开始的时候,也许一年想个一两次,过了也就忘掉,但逐渐的,这个心中的声音,愈来愈大,出现的频率也愈来愈高,当它几乎每一个星期都会来与我对话时,我知道时机已经成熟。
但和任何人一样,要丢掉自己现在所拥有的,所熟悉的环境及稳定的收入,转到一条自己未曾经历过,存在未知风险的道路,需要绝大的勇气,家人的支持和好友的鼓励。有舍才有得,真是知易行难,我很高兴自己终于跨出了第一步。
我要感谢HP的EER提前退休优惠政策,它是其中一个关键的TriggerPoints,另一个关键因素是在去年五六月发生的事。
当时我家老大从大学毕业,老二从高中毕业,在他们继续工作及求学前,这是一个黄金时段,让我们全家可以相聚一段较长的时间,我为此很早就计划休一个长假,带着他们到各地游玩。
但这个计划因为工作上一件重要的事情(Mark Hurd访华)不得不取消。这个事件刺激了我必须严肃的去对待那心中的声音,我会不会继续不断的错失很多关键的机会?
我已经年过50,我会不会走向和我父亲一样的道路?人事部老总Charles跟我说,很多人在所有对他有利的星星都排成一列时,还是错失时机。
我知道原因,因为割舍及改变对人是多么的困难,我相信大部分的人都有自己人生的理想,但我也相信很多人最终只是把这些理想当成是幻想,然后不断的为自己寻找不能实现的藉口,南非前总统曼德拉曾经说过,“与改变世界相比,改变自己更困难”,真是一针见血。
什么是快乐及有意义的人生?我相信每一个人的定义都不一样,对我来说,能实现我墓志铭上的内容就是我的定义。
在中国惠普总裁的位置上固然可以吸引很多的关注及眼球,但是我太太及较亲近的好友,都知道那不是我追求的,那只是为扮演好这个角色必须尽力做好的地方。
做一个没有名片的人士,虽然只有十多天的时间,但我发现我的脑袋里已经空出很多空间及能量,让我可以静心的为我ChapterII的新生活做细致的调研及规划。
我预订以两年的时间来完成转轨的准备工作,并且花多点时间与家人共处。这两年的时间我希望拿到飞行执照,拿到管理有关的硕士学位,提升英文的水平,建立新的网络,多认识不同行业的人,保持与大陆的联系。希望两年后,我可以顺利回到大陆去实现我第四个愿望。
毫不意外,在生活上,我发现很多需要调整的地方。
二十多年来,我生活的步调及节奏,几乎完全被公司及工作所左右,不断涌出的deadline及任务驱动我每天的安排,一旦离开这样的环境,第一个需要调整的就是要依靠自己的自律及意志力来驱动每天的活动,睡觉睡到自然醒的态度绝对不正确,放松自己,不给事情设定目标及时间表,或者对错失时间目标无所谓,也不正确,没有年度,季度,月及周计划也不正确。
担任高层经理多年,已经养成交待事情的习惯,自己的时间主要花在思考,决策及追踪项目的进展情况,更多是依靠一个庞大的团队来执行具体的事项及秘书来处理很多协调及繁琐的事情。
到美国后,很多事情需要打800号电话联系,但这些电话很忙,常让你在waitingline上等待很长的时间,当我在等待时,我可以体会以前秘书工作辛苦的地方,但同时也提醒我自己,在这个阶段要改变态度,培养更大的耐性及自己动手做的能力。
生活的内容也要做出很大的调整,多出时间锻炼身体,多出时间关注家人,多出时间关注朋友,多出时间体验不同的休闲活动及飞行,一步步的,希望生活逐步调整到我所期望的轨道上,期待这两年的生活既充实又充满乐趣及意义。
第一个快乐的体验就是准备及参加大儿子的订婚礼,那种全心投入,不需担忧工作数字的感觉真好。同时我也租好了公寓,买好了家具及车子,陪家人在周末的时候到Reno及Lake Tahoe玩了一趟,LakeTahoe我去了多次,但这次的体验有所不同,我从心里欣赏到它的美丽。
但同时我也在加紧调研的工作,为申请大学及飞行学校做准备,这段时间也和在硅谷的朋友及一些风险投资公司见面,了解不同的产业。
我的人生观是“完美的演出来自充分的准备”,“勇于改变自己,适应不断变化的环境,机会将不断出现”,“快乐及有意义的人生来自于实现自己心中的愿望,而非外在的掌声”。
我离开时,有两位好朋友送给我两个不同的祝语,Baron的是“多年功过化烟尘”,杨华的是“莫春者,风乎舞雩,咏而归”,它们分别代表了我离开惠普及走向未来的心情。
我总结人生有三个阶段,一个阶段是为现实找一份工作,一个阶段是为现实,但可以选择一份自己愿意投入的工作,一个阶段是为理想去做一些事情。
我珍惜我的福气,感激HP及同事、好朋友给我的支持,鼓励及协助,这篇文字化我心声的文章与好友分享。
posted @ 2010-01-23 11:29 北国狼人的BloG 阅读(297) | 评论 (0)编辑 收藏
update monster set exp=exp*2
posted @ 2010-01-20 10:06 北国狼人的BloG 阅读(200) | 评论 (0)编辑 收藏



posted @ 2010-01-07 11:18 北国狼人的BloG 阅读(209) | 评论 (0)编辑 收藏

1、dataProvider
     在Adobe ActionScript 3.0里面的定义如下:
    要查看的数据集。此属性允许您将大多数类型的对象用作数据提供程序。如果将 dataProvider属性设置为 Array,则会将其转换为 ArrayCollection。如果将该属性设置为 XML对象,则会将其转换为仅包含一个项目的 XMLListCollection。如果将该属性设置为XMLList,则会将其转换为 XMLListCollection。如果将该属性设置为实现 IList 或 ICollectionView接口的对象,则可直接应用此对象。受转换操作的影响,在您获取 dataProvider属性时,该属性值将始终为 ICollectionView,所以此值不一定是您设置的对象类型。如果要修改数据提供程序中的数据,则了解以下行为非常重要:可能不会检测对原始数据所做的更改,但将检测对从 dataProvider属性获取的 ICollectionView 对象所做的更改。默认值为 null.此属性可用作数据绑定的源。
    上面那一大堆的东西其实就说明以下几点:
    a、凡是具有dataProvider的组件,都可以将Array、XML等内容作为数据源。
    b、将这些作为数据源的内容“自动”绑定并显示在这些控件上面。
    所以通常的做法,当Flex获取了外部数据后,可以将其直接赋值为dataProvider,然后通过一些设定,就可以在这些组件上面显示数据了。
    关于这个例子我就不在这里复述了,大家可以自行去找一下,或者直接看这里的内容:http://livedocs.adobe.com/flex/3_cn/mx/controls/ComboBox.html#includeExamplesSummary

2、itemRenderer项目渲染器)及其data属性。
     itemRenderer的作用就是可以自定义一些组件的项目显示效果,例如我们熟知的Combobox、List、DataGrid等都具有这样的属性,也就是说,我们可以利用itemRenderer来改善ComBoBox里面的下拉的显示效果。当然,List、DataGrid也是这样的。
     当ComboBox中自定义了一个渲染器后,同时使用dataProvider的方式绑定了一个数据源,这个时候,如何与我们自定义的渲染器里面的item发生作用呢?就是使用data方式。
     也就是说,dataProvider可以绑定数据到UI、如果这个组件使用了自定义渲染器,那么就可以使用data.XXX的方式获取到dataProvider里面的数据。

okay,以上介绍的两个知识点是关于Flex组件的数据处理能力,其中dataProvider可以把Array、XML等内容作为数据源直接绑定并显示到UI上面,而itemRenderer里面的data是实现组件与其渲染器之间的数据处理。

下一篇的内容是关于Flex与后台进行通讯的常见的几种方式:HTTPService、WebService、Remote等方式,而通过这几种方式可以轻松的让一些例如Java、C#、Python、Ruby、PHP等主流编程语言为Flex所服务:)

附加:
关于dataProvideritemRendererdata的具体用法有些抽象,因此我特此列举一个例子来说明一下。
这是一个HorizontalList组件,而且其中它的itemRenderer=ToolBoxRenderer,想让我们看一下HorizontalList的片段代码:
<mx:HorizontalList id="myHorizontalList" itemRenderer="ToolBoxRenderer">
         <mx:dataProvider>
             <mx:Array>
                   <mx:Object tooltip= "rubber" styleName="rubber" language="{ _language }"/>
             </mx:Array>
         </mx:dataProvider>
</mx:HorizontalList> 

然后是ToolBoxRenderer的片段代码:

<mx:Canvas width="30" height="30">
         <mx:Button
            width="30" height="30" 
            toolTip="{ data.tooltip }" 
            styleName="{ data.styleName }"/>
</mx:Canvas>

再让我们看看itemRenderer是如何与我们今天这个主题联系起来的。
1、在myHorizontalList中定义了一个dataProvider,通过代码可以看出是一个Array类型的变量,然后将其赋值给dataProvider。这个时候,其实就应该将数据显示到myHorizontalList上面了,这也就是dataProvider的用处。
2、在dataProvider包含的Array中,定义如下的结构:<mx:Object tooltip= "rubber" styleName="rubber" language="{ _language }"/>
3、我们不仅设定了dataProvider,还是同时设定了itemRenderer,即为ToolBoxRenderer。
4、在ToolBoxRenderer里面,定义了一个Button,同时我们使用类似于这样的方式可以取得dataProvider里面的数据:toolTip="{ data.tooltip }" 

以上就是一个非常简单,但是又非常典型的一个dataProvideritemRendererdata的用法,希望大家可以理解:)

posted @ 2010-01-04 22:26 北国狼人的BloG 阅读(1224) | 评论 (0)编辑 收藏
是直接写在包里的函数,包里没有类,只有函数,这样的函数叫函数闭包
函数在类里出现通常叫方法,


http://help.adobe.com/zh_CN/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f54.html
函数闭包 是一个对象,其中包含函数的快照及其“词汇环境”。函数的词汇环境包括函数范围链中的所有变量、属性、方法和对象以及它们的值。无论何时在对象或类之外的位置执行函数,都会创建函数闭包。函数闭包保留定义它们的作用域,这样,在将函数作为参数或返回值传递给另一个作用域时,会产生有趣的结果。

例如,下面的代码创建两个函数:foo()(返回一个用来计算矩形面积的嵌套函数 rectArea())和 bar()(调用 foo() 并将返回的函数闭包存储在名为 myProduct 的变量中)。即使 bar() 函数定义了自己的局部变量 x(值为 2),当调用函数闭包 myProduct() 时,该函数闭包仍保留在函数 foo() 中定义的变量 x(值为 40)。因此,bar() 函数会返回值 160,而不是 8。

function foo():Function
{
   var x:int = 40;
   function rectArea(y:int):int // function closure defined
   {
       return x * y
   }  
   return rectArea;
}
function bar():void
{
   var x:int = 2;
   var y:int = 4;
   var myProduct:Function = foo();
   trace(myProduct(4)); // function closure called
}
bar(); // 160

方法的行为与函数闭包类似,因为方法也保留有关创建它们的词汇环境的信息。当方法提取自它的实例(这会创建绑定方法)时,此特征尤为突出。函数闭包与绑定方法之间的主要区别在于,绑定方法中 this 关键字的值始终引用它最初附加到的实例,而函数闭包中 this 关键字的值可以改变。有关详细信息,请参阅方法。
posted @ 2009-12-29 14:29 北国狼人的BloG 阅读(205) | 评论 (0)编辑 收藏
     摘要: 前期准备:       点击 File 菜单 -> New -> MXML Component ,然后弹出一个对话框。 在对话框中输入组件名,选择此组件继承的类型,如: Canvas , DataGrid , ComboBox …… 等。 然后选择组件的大小,点击 Finish 即可。  ...  阅读全文
posted @ 2009-12-24 16:06 北国狼人的BloG 阅读(454) | 评论 (0)编辑 收藏

as3 + java

action script 3 真不错了
posted @ 2009-12-23 16:33 北国狼人的BloG 阅读(187) | 评论 (0)编辑 收藏
表现:
使用ModuleManager去加载一个Module的时候, 所有的事件都激发不了.

代码:

  1.                 var testModule:IModuleInfo = ModuleManager.getModule('modules/pub/User.swf');
  2.                 testModule.addEventListener(ModuleEvent.READY,onModuleReady);
  3.                 testModule.addEventListener(ModuleEvent.SETUP, onModuleSetup);
  4.                 testModule.addEventListener(ModuleEvent.PROGRESS,onModuleLoading);
  5.                 testModule.load();

打个赌, ModuleEvent里所有的事件都不会被激发.


原因:

addEventListener之后, testModule的Event Listeners就可能被GC了.




解决:

不要声明局部IModuleInfo对象.


相关链接:
http://bugs.adobe.com/jira/browse/SDK-14021
https://bugs.adobe.com/jira/browse/SDK-11389

Gaurav Jain 同学说: 
"References to IModuleInfo must be maintained to keep the event listeneres alive. If the IModuleInfo is defined in function local scope the event listeners may get garbage collected. "
他表示:
"This is NAB. The weak reference was a change to fix a memory leak bug (https://bugs.adobe.com/jira/browse/SDK-9467) "

Not a bug~ 为了修复另一个bug, 牺牲这个....
posted @ 2009-12-23 16:31 北国狼人的BloG 阅读(236) | 评论 (0)编辑 收藏
as 是请求口气,比较温柔。
XML()是命令口气,比较霸道。
这个东西不听话你就不要给他好语气

as 是前面的对象如果是后面的数据类型才返回这个对象,否则返回null

这里的weather_loader.data是String类型
posted @ 2009-12-17 15:29 北国狼人的BloG 阅读(136) | 评论 (0)编辑 收藏
直接说话主要的

command属性可以执行多条命令

<sshexec host="ipAddr" username="root" command="(export LANG=zh_CN.UTF-8;/data/jdk/bin/java -jar )" password="pwd" trust="true"/>

posted @ 2009-12-14 11:29 北国狼人的BloG 阅读(543) | 评论 (0)编辑 收藏
8点前 的11月19日凌晨,我和我今生最爱的人一起看过流星雨。想到这些,我就会流泪。

posted @ 2009-11-18 22:19 北国狼人的BloG 阅读(126) | 评论 (0)编辑 收藏
Nothing succeeds like confidence.When you are truly confident,it radiates from you like sunlight,and attracts success to you like a magnet.
信心成就一切,当你真正自信时,它就像灿烂的阳光一样从你身上散发出来,就像磁铁一样将成功吸引到你身上。

It's important to believe in yourself.Believe that you can do it under any circumstances,because if you believe you can,then you really will.The belief keeps you searching for answers,which means that pretty soon you will get them.

相信自己非常重要。要相信自己无论在任何情况下都会成功。因为如果你相信你能做到,那么你就真的会做到。这种信念促使你不断的去寻找答案,而不断的探索就意味着你很快就会找到答案。

Confidence is more than an attitude. It comes from knowing exactly where you are going and exactly how you are going to get there. It comes from acting with integrity and confidence.It comes from a strong sense of purpose.It comes from a strong commitment to take responsibility,rather than just letting life happen.

信心不只是一种态度,它来源于你确切地知道自己要去干什么并且确切地知道怎么去干。它来源于正直和自信地去行动。它来源于强烈的目标感。它来源于强烈地勇于承担责任的许诺,而不是让生命放任自流。

One way to develop self-confidence is to do the thing you fear and to get a record of successful experiences behind you.

培养自信的一种方法是去做你害怕做的事情,并将它做成功。

Confidence is compassionate and understanding.It is not arrogant. Arrogance is born out of fear and insecurity,while confidence comes from strength and integrity.

信心是富有同情心和善解人意的。它一点都不傲慢自大。傲慢是由于害怕和缺乏安全感才产生的,而信心则出于坚强的决心和诚实正直。

Confidence is not just believing you can do it. Confidence is knowing you can do it.Know that you are capable of accomplish anything you want,and live your life with confidence.

信心并不是仅仅认为你可能会成功,而是确信你一定能成功。确信你有能力实现自己的愿望,并充满信心的生活着。

Anything can be achieved through focused,determined effort and self-confidence.If your life is not what you want it to be,you have the power to change it,and you must make the changes on a moment by moment basis. Live your priorities. Live with your goals and your plan of action. Live each moment with your priorities in mind. Act with your own purpose,and you will have the life you want.

如果你足够专心、坚决和自信,那么任何事都能做成。如果生活不像你预想的那样,你有力量去改变它,并且你必须一步一步的去实现这些改变。铭记你生命中最重要的事情。有目标并且有计划的去生活。为你的目标而奋斗,你就会拥有自己想要的生活
posted @ 2009-10-14 18:02 北国狼人的BloG 阅读(138) | 评论 (0)编辑 收藏
The hardest victory is over self.
最艰难的胜利是战胜自己的胜利!

     我们到底要是什么样的人生?
     充实的、成功的、善良的、充满爱心和和谐的?这些都是我们的追求,但大多数人终身辛劳却无法修成“正果”,为什么呢?
    一切的问题都出在自身:我是一切的根源!大家一定要有这样的认识。
    下面是摘自一位昨晚留言的朋友,我给这个留言加了一个题目:人生的四大黄金法则。希望大家摘抄在日记本上,并与更多的人分享。

    不妄作评判 --说话要公正客观,不说违心的话,不说对自己不利的话,不说别人的闲话,把语言的力量用到真和爱上去。(太对了!)

    不受别人影响 --别人所做的事,没有一件是因为你才去做的。别人所说的话、所做的事都是他们自己世界观和价值观的投影。不受别人言行的影响,你就能减少许多“无谓的痛苦”。(太对了!)

    不作假设 --鼓起勇气提问。把你真正想说的话表达清楚。与别人沟通得越清楚,你就越能避免误解、伤心或闹剧。单只这一个约定就能“彻底改变你的生活”。(太对了!)

    行动、尽力、投入 --你所能尽的力并不是时时都一样的。健康的时候,你能尽的力就比生病的时候要多。只要你在任何情况下都尽力而为,你就不会在事后懊悔、自责或自我审判。(太对了!)


只有自己经历过挫折,才能理解很多。我要重新振奋起来。
posted @ 2009-10-07 10:55 北国狼人的BloG 阅读(152) | 评论 (0)编辑 收藏

  我之前一直以为是没有这个功能的,而最近在看一些文档,发现这个功能是有的。目前总结下来有两种写法:

  var loader:URLLoader = URLLoader(event.target);
  不知道这种写法是借鉴那种编程语言,反正我没有见过。
  补充这个语法说明:http://livedocs.adobe.com/flash/8_cn/main/00001211.html

  var loader:URLLoader = event.target as URLLoader;
  这种写法是借鉴VB.Net编程语言,唉!AS3语法真得一个大杂烩。

posted @ 2009-10-02 23:19 北国狼人的BloG 阅读(173) | 评论 (0)编辑 收藏

一般大家都会用 “SELECT INTO OUTFIL”将查询结果导出到文件,但是这种方法不能覆盖或者添加到已经创建的文件。例如:

mysql> select 1 into outfile '/tmp/t1.txt';
Query OK, 
1 row affected (0.00 sec)
mysql
> select 1 into outfile '/tmp/t1.txt';
ERROR 
1086 (HY000): File '/tmp/t1.txt' already exists
 
还可以使用另外一种方法:
mysql
> pager cat > /tmp/t1.txt
PAGER 
set to 'cat > /tmp/t1.txt'
mysql
> select 1;\! cat /tmp/t1.txt
1 row in set (0.00 sec)
+---+
| 1 |
+---+
| 1 | 
+---+

这样你能很方便的查询到2条sql的差异:

mysql> pager cat > /tmp/t01.txt
PAGER 
set to 'cat > /tmp/t01.txt'
mysql
> select 12345 union select 67890;
2 rows in set (0.02 sec)
mysql
> pager cat > /tmp/t02.txt
PAGER 
set to 'cat > /tmp/t02.txt'
mysql
> select 12345 union select 67891;
2 rows in set (0.00 sec)
mysql
> \! vimdiff -o  /tmp/t0[12].txt
2 files to edit
  
+-------+
  | 12345 |
  
+-------+
  | 12345 |
  
| 67890 |                                                                                                                 
  
+-------+                                                                                                              
/tmp/t01.txt 
  
+-------+
  | 12345 |
  
+-------+
  | 12345 |
  
| 67891 |                                                                                                                 
  
+------+                                                                                                         
/tmp/t02.txt
posted @ 2009-09-29 15:43 北国狼人的BloG 阅读(2543) | 评论 (0)编辑 收藏
<javac srcdir="${src.home}"
    destdir
="${build.home}/WEB-INF/classes"
    source
="1.4"
    target
="1.4"
    debug
="true"
    deprecation
="false"
    optimize
="true"      
    excludes
="test/**">
    
<classpath refid="compile.classpath"/>
</javac>

就一句话搞定了。
posted @ 2009-09-24 17:00 北国狼人的BloG 阅读(367) | 评论 (0)编辑 收藏
关于博彩心理学的问题,国内并没有这类的专门著作,最常看到的是一篇流传在网上的《赌博心理学》,原文出自博智先生所注的《打败庄家》一书。初读之下如暮鼓晨钟,但多次细读后,颇有点意犹未尽的感觉。于是开始查找其他书籍上的资料,也有了一点体会,后来觉得,还是写出来吧,这样能加深自己的认识。于是就有了这篇东拼西凑的文章。文章内很多字句都是出自多本期货方面的书籍,就算不是原句,也是取其意义。而本文章所阐述的观点,也瑾代表本人自己所认同,并不确定就是事实的真相。烦请各位自行分析判断。
一、价值观

“到底怎样才能在博彩市场中‘长久、稳定’地获利呢?”──这是绝大部分博彩者(闲家)所急欲知道的答案,非常抱歉,真正的答案可能会令绝大多数人失望,因为,如果想要在博彩市场中赚钱,就必须改变自己的“价值观”。简言之,就是改正你对金钱的看法。

所有初入博彩市场的新手的目标都只有一个:“赚钱”,这是最基本的要求,基于人性需求,这个基本要求会继续发展成──“发财”,因为赚钱的意义太模糊,每个月从博彩中获利三千块是赚,获利三十万也是赚,赚一点点小钱有什么用,当然要赚大钱,然而,如果十年之后才能发财的话,嫌太迟,所以,还要进一步要求“迅速致富”。当然,在短时间内赚一笔大的还是不够,所以,还要进一步要求“随时都可以赚大钱”,换言之,很多的闲家都在想“我要把庄家变成我的提款机”──至此,这样的想法才足够描绘出大多数闲家内心深处的潜意识。

请注意:有些人并不知道自己有这种“提款机”的观念,但是他们的行动却符合这种念头的症状,也就是──为了能够“随时提领现金”,他们的想法与策略都以“急功近利”为特征,不管春夏秋冬、打雷下雨,只要庄家有开盘,就钻进去投注,于是,大大提高了投注次数,在频繁的投注中耗损体力与金钱。

他们最严重的错误,是把“增加投注次数”误以为是“提升赚钱机率”。事实上,你遭遇到的现实结果,可能完全相反。频繁的投注,可能会“大幅提高赚钱的机会”,但同时也会“大幅提高亏损的机会”!你正在做的不是拿取,而是用自己智慧战胜对手后获取的劳动成果。

二、自律

在博彩市场,博彩者成功的不二法门不外乎两种,一是非常幸运;一是非常自律。不过这当中,非常幸运的人少之又少。因此,所谓的成功博彩者、甚至投资人,绝大多数都是高度自律的。

“纪律”一词,有许多含义。有纪律的博彩者,不光只是遵循他自己的一套投注规则而已,重要的是必须事先理解这些规则具备克敌致胜的效果。纪律是一套严谨的架构,包含必要的技巧和心理素质,例如:自制力、一致性、组织力、持续力、管理监督能力、洞察力,以及行动。凡此都是所有博彩者冀望培养的技巧。遗憾的是,这些技巧和特质非一蹴可几,成功绝无捷径。

对于一位博彩专业人士来说,最不可原谅的,就是没有纪律,随意更改自己的投注策略。

三、认识自己

在博彩市场中,投注策略与风险管理缺一不可,如果博彩者仅仅专注于如何投注的研判,那么即便是水平很高,却仍然摆脱不了失败的可能,并总是处于成功的边缘。正因为如此,我们才要“认识自我”。

首先,冒险是必要的。事实上,很多人不曾仔细思考,生活中其实充满着许多需要承担的风险,风险本来就是生命的一部分。我们今天所谓的“博彩”、“投机”,早在远古时代,当老祖宗们在面对大自然众多敌人,例如:野兽、天气等等时,就已经存在了。对于生活上这些风险和不确定因素,我们常常茫然无所知。但事实上,我们正是靠着承担风险才能生存下去。

当你的投注表现亮丽,且自觉是个赌场赢家,学到的东西事实上是很有限的。只有当你持续赔钱,而别人也在质疑你的分析能力时,你才会了解自己是否真正具备在博彩市场中生存的能力。

只要能更认识自己,适切地修正个人心态,调整好你跟赌场的关系,就是最有效的投资利器。

四、心理资本

优秀的博彩者会忘记他们投注的目的是为了赚钱,他们只是专心一致的发挥赌技,赚钱不过是步骤正确所衍生的副产品。优秀的博彩者会仔细分析输赢的机率,然后下注,他们专注于当下面临的赌局。博彩者若一直注意赌桌上的钱,会使自己分心而无法发挥赌技。投注时若太在意钱也会降低成功机率。执行正确的投注和理财规则,钞票自然滚滚而来。金钱,不过是你在这场游戏中,保持记录的唯一方法罢了。

所以,你最重要的资本并不是金钱,而是心理资本。心理资本给予你投注赚钱所需的力量,没有了心理资本,即使一时赚了钱,也无法长久的维持或增加金钱资本。当然,健康的身体可以增强心理资本,没有健康就没有财富。

心理资本储备得足够与否取决于当你面对个人生活及职场的压力时,是否能妥善调整。好比运动员在两场比赛中间必须充分休息才能表现出色,博彩者也需要充电的时间。

博彩者要有耐心、勇于承认自己的错误及善设停损,不要被突如其来的损失吓倒,也不要被乍然涌进的获利激起贪念,导致你无法贯彻既定的投注及理财策略。如果你耗尽心理资本,必然会犯下昂贵的投注错误。

五、接受失败

人们时常会悔恨自己的错误,但是逝者已矣,来者可追。如果我们改正自己的心态,适时承认错误,并引以为鉴,对往后的投注才有帮助。每一种判断方式和投注方式,都有机率发生错误,如果是这种情形,不妨坦然接受。如果是自己违反判断方式和投注方式,至少也上了一课;不按牌理出牌,代价是很昂贵的。

一个优秀的博彩者绝不能被失败感淹没,否则真的会成为失败者。博彩者不能任凭一时的亏损导致连锁性的亏损,也不能因一时的疏忽造成无法弥补的错误。想要尽快挽回亏损局面的心态,无异于开启了一扇通往失败陷阱之门。当你输钱时,或许觉得是赌场吞了你的钱,必须把钱还给你。你愈想把钱赢回来,与赌场的关系愈像一场血脉贲张的仇杀。事实上,输赢的机率全然是客观的,没有人用枪指着你逼你投注到错的一方,你所面对的状况并不掺杂任何情绪因素。不管输或赢,赌场依旧存在。倘若你将情绪强加于一无所感的环境上,一定徒劳无功。而你的人性情感,并不能为自己赚钱,更通常违背自己的理性经济利益。你或许会生气、会反击,感觉赌场亏欠你,实际上赌场并不欠你。你或许会投注过量,或对你身边的人大发雷霆。而这整个过程都与你当初精心规划的投注策略背道而驰。你所应该做的,是面对亏损的事实,并且加以评估,由错误中学习,如果必要的话也可以调整你的投注规划,然后决定下一步该怎么走。

现实社会中金钱几乎象征一切,因此亏损后出现恐惧、焦虑的情绪是百分之百的自然。绝对是正常的反应。而优秀博彩者跟众人的区别,并非在于会否出现焦虑,而是在于能否在数分钟之内恢复平静。

所以说,遇到失败算不了什么,重要的是你如何反应。

六、珍惜你的钱

博彩者需要努力寻找并计算最大的报酬机率。但人生中唯一可以确定的事是死亡(有些人认为是纳税);因此,即使你博彩的功力到达专业水准,你充其量也只能“预测”投入的钱可能会有什么结果。

而无论是赢或输,你都要坚持原定的理财计划。造成错误判断最主要的因素,往往是因为投入超出能力范围的资金。如果过度投注,亏损时间又过长,你可能会在情势逆转为对你有利之前,就提早出场了。

博彩者若想成功,必须学会理财,懂得分配财务资源。职业博彩者会拨出他愿意冒险的资金去投注,换句话说,他摆在赌桌上的钱是他认为自己输得起的数目。职业博彩者既不会受投入金额多寡的影响,也不会因为出乎预料的短期大量输赢而手软或缩手。

记住投注花的是自己的钱,这点和前一点并不冲突,两者看似相反,其实是一体两面。一旦博彩者接连尝到赢钱的甜头,以后再投注时会变得懒散和放松,因为他们觉得这些赚来的钱像是从天而降、不需要成本的,好象是赌场的钱,而不是自己的。他们忘了当初所投入的是自己辛苦挣来的血汗钱。粗心大意是博彩者的致命伤。太容易获利或一连串的获利往往使博彩者变得轻率躁进,进而想尝试更高风险的投注。

避免这项错误的要诀在于严格遵守投注分析和理财规划系统。当你进行投注时,必须忘记金钱本身,而专注于运用正确的投注分析技巧,自然会赚到钱。换句话说,面对获利或亏损时,要记住这是自己的钱、真实可见的钱。珍惜自己的钱,坚持你的投注策略,就可以抗拒冒过度风险的诱惑,也不至于把资金当成赌场的钱而掉以轻心。

七、自我调整

你必须保持头脑清醒,顶尖的博彩者无论在精神、智能、心理、情绪、或身体健康方面都保持在最佳状态,绝不允许药物或酒精伤害、暴饮暴食、或停滞不前的生活型态。找时间放松一下,参加娱乐活动可以帮助你成功克服压力。换句话说,长期维持均衡的生活方式是成功不可或缺的因素。

分析和投注是劳心、必须在室内枯坐、且承受极大压力的。所以应当试图从事不费心力的、户外的、动态的、而且没有压力的休闲活动,均衡一下,如骑越野车、踏青。此外,花时间陪老婆、阅读与博彩、投资无关的书籍、追求心灵的成长及从事愉快的娱乐,这些也是必要的。花时间静静的使自己心灵沉淀,可为自己天马行空的创意注入新能量。当然也不要忘了安排一些时间,做研究、改进自己的技能、让自己更成长、并认识新朋友。

八、谦卑

我把“谦卑”作为全文的最后一章,是的,没看错,是“谦卑”。谦卑是博彩者在赌桌上最重要的人格特质。许多哲学家认为谦卑是人类一个最重要的美德。柯维(Stephen R. Covey)在《与成功有约》一书中写到,我们必须先设法了解别人,别人才会了解我们。也就是说,我们要先去听懂别人的话,然后才开口说话。如此,才能得到更多资讯,更能做适当的回应。博彩投注也是如此。要成为成功的博彩者,必须先学习倾听赌场的声音。学会了谦卑,你才可能了解赌场、接触赌场,并做聪明的回应。

那些自以为比赌场里所有其他人都聪明的人,认为自己总是幸运者。他们这种看法不会长期保持下去的。在赌场面前应该谦卑。否则赌场会让你知道这种态度会出问题的。赌场会让你变得谦卑。当你认为你掌握的知识十分了不起,十分有价值时,说不定人家也早已掌握了。

千万不要有志得意满的心理。如果洋洋得意,你就会忘记风险,要记住,最好的博彩者都是最谦卑的人。懂得谦卑就象我们必须懂得不能直视烈日。事实证明,当我们以智者出现在赌场时,失败总与我们相伴;当我们以谦卑、愚者的身份出现在赌场时,成功、运气会与我们相随。总之,让我们做个实实在在的人,把成功留给自己,把完美留给赌场,而不是与之相反。所以请记住:永远保持谦卑姿态。

结束语:要在博彩这一行讨生活的人,都必须做好心理建设和保持强硬的态度:输赢变化可能毫无道理可言,甚至不可理喻,我们必须勇敢迎接挑战,不忧不惧,拥抱风险,没有任何事情可以完全掌握,也没有任何事情是绝对肯定的。
posted @ 2009-09-23 22:13 北国狼人的BloG| 编辑 收藏

安装包rpm的相关参数

今天遇到了一些难题 就是很多安装包我安装不上 很郁闷
就去找朋友问了下 原来安装包还有很多参数很强大
现在发出来大家一起分享
rpm -e xxx(包名) --noscripts
-h(or—hash)安装时输出hash记号;test只对安装进行测试,并不实际安装;
--percent以百分比的形式输出安装的进度;
-- excludedocs不安装软件包中的文档;
--includedocs安装文档;
--replacepkgs强制重新安装已经安装的软件包;
-- replacefiles替换属于其他软件包的文件;
--force忽略软件包及文档的冲突;
--noscripts不运行预安装和后安装脚本;
-- prefix NEWPATH将软件包安装到由NEWPATH指定的路径下;
--ignorearch不校验软件包的结构;
--ignoreos不检查软件包运行的操作 系统;
--nodeps不检查依赖性关系;
--ftpproxy HOST用HOST作为FTP代理;
--ftpport PORT指定FTP的端口号为PORT。

特别是 --nodeps不检查依赖性关系 这个命令很好
posted @ 2009-08-27 18:24 北国狼人的BloG 阅读(114) | 评论 (0)编辑 收藏
毕业论文:从激光原理看六脉神剑的产生机制
导师:金庸
  专业:光电子
  摘要:六脉神剑具有广阔的应用前景,本文从激光原理出发,论证了生物激
光的可行性及实现的办法,在人类进化事业中,具有十分重大的意义。
  背景:与传统的武功,如降龙十八掌,九阳真经等相比,六脉神剑是一种威
力极强的武功,具有操作简单,响应时间快,杀伤力大(功率密度大),效率高,
使用范围远等优点,因此为广大的武学名家所觊觎,但是由于大理段氏将这门武
功列为绝密档案,而且存在修炼困难等问题,六脉神剑的产生原理,始终是武林
中的一个谜,作者从事激光器理论研究多年,终于凭借两条基本假设,解决了生
物激光产生中的若干困难问题。并提出了一种快速修炼六脉神剑的方法,本文的
发表,具有划时代的意义。
  从激光原理看六脉神剑的产生机制
  公理1:
  真气是一种类似于等离子体的物质形态
  公理2:真气和激光都可以在经脉中传输
  六脉神剑其实是一种小功率的生物激光武器,这从六脉神剑的效果上可以看
出来,但是,这种生物激光,还存在很多亟待解决的问题,如传输损耗过大,非
基模激射等缺点,这大大影响六脉神剑的威力。从激光原理看,激光的激射需要
两个条件:粒子数反转和谐振腔的形成。我们先研究六脉神剑产生粒子数反转的
原理,因为在丹田中,存在大量的真气,一般来说,这些真气以等离子体的形式
存在,但是对于武学名家,可以通过修炼,将这些等离子体,积累并释放出来,
一般来说,释放的速度越快,能量越高,则武功的威力也越大,降龙十八掌就是
通过长时间的积累,将这些真气积累至顶峰时释放出来,因此产生出巨大的功率
密度。而九阳神功,则是指导如何提高这种等离子态的真气的容量和衰减时间的
方法。
  如果在丹田内产生某种势场,导致大量的等离子的原子结构发生变化,就可
能使这些基态的等离子体转化为激发态,再通过跃迁释放出光能,因此,从原理
上说,六脉神剑与其他的武功是截然不同的。导致基态原子激发的势场,是由等
离子体分布不同而产生的磁场,导致等离子体激发的这种势场,在激光原理中,
这被称为泵浦。一般的武功,恰好忽略了这种非均匀势场的作用。通过泵浦,我
们就实现了粒子数反转,在大量的粒子数反转的条件下,就可能产生激光。
  下面我们再看谐振腔的形成,这与真气的运行路线有密切的关系,鉴于以上
讨论的粒子数反转条件只能在丹田内完成,这种生物激光器的谐振腔也在丹田内,
同样可以通过控制周围势场的形状来限制跃迁产生的光在丹田中的分布,而光场
的分布,影响了激光的质量,决定了激光器是单模激射和多模激射,有经验的精
通六脉神剑的天龙寺长老,能够同时控制多个激射波长,但是由于多模激射的势
场太过于复杂,难于控制,大部分人,如枯容大师,段正明等,只能单波长激射,
由于传输问题,这种单模激光很容易发散,若以这种发散的激光输出,就只能练
成一指。段誉能够练成六脉神剑的主要原因,完全是因为北冥神功这种奇异的武
功的出现,首先,通过北冥神功积累了大量的真气,因此,为粒子数反转提供了
强大的泵浦,大大提高了粒子反转数密度。其次,北冥神功本来就是吸取别人的
内力,因此,它的势场分布,与一般的武功完全不同,恰好符合谐振腔的谐振条
件,不需要像其他人那样通过外力来强行控制真气场的形状,因此,段誉可以轻
而易举的练成六脉神剑,但是,这种北冥神功的真气场 ,和真正的谐振腔条件,
还是具有一定的差别,因此,段誉的这种激光激射,并不是时时都能够产生,需
要一定的矫正,可惜的是,能够同时知道北冥神功和六脉神剑的,世间上唯有段
誉一人,而段誉是看图学成的,又对二者的关系完全不明白,因此,段誉的六脉
神剑具有很大的限制性,这一点,就算是帮助段誉研究过的萧峰,也不明白,因
为他不知道 六脉神剑真正的输出是激光而不是真气。
  从以上分析可以看出,谐振腔的形成和粒子数反转,也是六脉神剑这种生物
激光的基本原理,从这个原理来看,除了北冥神功外,吸星大法和明玉神功,也
有类似的作用。
  下面再讨论激光在人体中的传输和激射过程。从一般的武功来看,真气传输
的通道是经脉,六脉神剑的光传输也是这样的,提供真气运行通道的经脉,同时
也是激光传输的光波导,否则,以北冥神功这种强大的泵浦产生的激光,早就对
人体产生了伤害。在这里,我们假设经络实际上是一个类似于光纤的波导。从后
面的论证中可以看出,这个假设是正确的。由于光波导的截至频率为0,因此,
也适合于一般真气的传输,而在传输中一般真气没有发生泄漏,是因为外层波导
的禁带宽度大,对传输中的真气构成了势垒,因此,除了少量的真气通过隧穿逸
出外,大量的 真气都可以达到终点。
  由于经络既是真气传输的通道,又是光波导,从这个意义上,这一段波导不
仅仅是光传输的通道,而且是一段光纤放大器,光在经络中传输的同时。还能获
得增益,这就大大提高了输出光功率,我们可以把这一段光波导近似成EDFA,由
理论计算可知,若增益越大,EDFA的长度越长,所获得的增益就越大。
  也许会有人怀疑六脉神剑是生物激光的真实性,因为真正的单模激光器的光
传输距离是很长的,而六脉神剑就要差一点,这一点前面实际上已经提到过。六
脉神剑其实是一种小功率的生物激光武器,这从六脉神剑的效果上可以看出来,
但是,这种生物激光,还存在很多亟待解决的问题,如传输损耗过大,非基模激
射等缺点,这大大影响六脉神剑的威力。由于一般的泵浦是依靠改变磁场分布来
形成的,因此难于获得较大的泵浦,就算是北冥神功,因为势场分布和谐振腔条
件的微小差异,也会导致输出功率的大大下降,但是我们有理由相信,通过理论
计算,我们可以使北冥神功的真气场完全符合谐振腔条件,这时的六 脉神剑,
威力将以数倍的提高。
  其次,从大理段氏的六脉神剑来看,都是从手指上发出,他们对激光原理的
了解还不是很深入,因此输出的激光,都不是基模激射,从激光原理可知,高阶
模的激光光斑面积大,但是功率密度,强度等,都要比基模激光要差,因此,六
脉神剑还有改进的余地。
  再次:空气对激光的损耗是十分大的,由于散射,吸收等作用,空气对激光
的损耗非常大,而且从实验结果来看,六脉神剑的输出激光波长,极有可能在紫
外光波段,并不是在空气的损耗系数最小的范围内,再加上非基模激射,因此段
誉的六脉神剑,威力远远比理论值要低。
  针对以上的分析,我提出的快速修炼六脉神剑的方法有两种:
  1.先修北冥神功,吸星大法或明玉功,推荐北冥神功。
  2.首先通过理论计算和实验分析,通过ansys模拟出丹田中的真气场分布,
在再加以修炼 另外,六脉神剑还有许多需要改进的地方,如选择合适的波长,
实现纯基模输出,降低输 出损耗和阈值真气密度等,有兴趣的读者可以自行分
析。
  总结:六脉神剑其实是一种人体内的一种生物激光器,随着对真气性能的深
入研究,我们相信,我们最终会在广大的中国人民身上普及,将来的战争,将不
再是以科技取胜,决定战争胜负的最重要的因素,将会是参战的人数,我们有理
由相信,中国将会是世界上最强大的国家。最后,希望这种生物激光器,能够最
快的应用到 PLA中去,这将对台湾当局产生强大的威慑力,为和平解决台湾问题
带来新的希望。
  参考文献:
  天龙八部--三联出版社(盗版)
  激光原理--清华大学电子工程系
  集成光电子和生物电子学导论--清华大学电子工程系


posted @ 2009-08-16 10:19 北国狼人的BloG 阅读(172) | 评论 (0)编辑 收藏

最近要做一个网站,要用到gwt google map,我就选择了gwt-ext


先用gwt-ext    map-demo,跑一跑


申请了google map的key,运行,怎么都不行,总是报错

Google Maps not available. Make sure you have imported the appropriate Google Map scripts.


搞到2点多,我都服了。 我自己生写html都搞出来了,gwt楞搞不出来,我草

原来发现,<meta http-equiv="content-type" content="text/html; charset=utf-8"/>  这个没加。也是在一位仁兄的blog中找到,很难找啊。

我给贴出来,毕竟我的blog还是有一定流量的。!!!!


我都不知道,网上那些技术文章,都干嘛吃的,就没有一个gwt-ext的用户遇到,靠。

posted @ 2009-08-02 09:43 北国狼人的BloG 阅读(2145) | 评论 (7)编辑 收藏

do {
    ...
    if(item != null)
        break;
    ...
    if(item  != null)
        break;

}while(false);


使用do   while 进行一系列条件的判断,控制程序流程,不错。
posted @ 2009-06-01 17:09 北国狼人的BloG 阅读(151) | 评论 (0)编辑 收藏
封闭归来,程序已经定型,老板今天开大会接风,为以后的辉煌而战。

创造通讯方式和娱乐方式的变革。
posted @ 2009-05-25 22:24 北国狼人的BloG 阅读(160) | 评论 (0)编辑 收藏
一直在封闭开发游戏,好久没照顾我的博客了。


希望赶紧回北京啊
posted @ 2009-04-12 11:35 北国狼人的BloG 阅读(139) | 评论 (0)编辑 收藏

买3D没把握?!就用至尊宝,保你09年发大财。


本人耗时1年多,编写了一套专门用捕捉3D的彩票软件,两个思路方向的预测工具同时锁定开奖号码,使你天天中3D,不再是梦。最多每天花20分钟就可以锁定中奖号码。每月更是有可能有几次单挑一注的中奖机会。

今天是元旦,我给大家简单介绍一下我的这款最强的3D软件。




1.公式分析器部分



该部分采用 ,久错必对,久对必错的原理分析全号,定位,和尾,跨度,和差。你可以轻松判断出哪些是该杀掉的部分!



方案就是提纯最适合预测内容的公式,整合在一起,进一步提高正确率。



 包括10-30综合冷热温的分析。杀码很强大。



每天的试机号包含着大量开奖信息,我特加入对试机号的二码,历史落球次数的统计,轻松判断出号二码,和杀码。



本软件是唯一一套包含开奖日期,并按一周7日处理号码排列,这里蕴含着大量的3D秘密,只要您是稍加留意就会发现大量的2-3码胆组,每周4次可以通杀2-3码的机会,经常让你小单中奖!

我通读了世面上论坛里,或者别人的自创杀码,和差,跨度,和尾公式,并将这些编入软件,好费尽哦
形成了能看到这些优秀公式的走势唯一集成软件。

这无疑使您拥有了众多帮手!而且您能比这些作者看到更多的价值。因为那些作者,或者说每个人都不可能每天算一遍公式,看每个杀码,杀和尾的情况的。用我的软件,您就可以!









 还有定位杀码

都是高于93%的公式,




对软件,你尽可以放心,绝对货真价实。如果您还是坚持认为我可能是骗子,那就请您非诚误扰了,信任只在一瞬间,中奖才是硬道理!

软件200块/每套,一次200,换无数次大奖,自己考虑吧,我只卖一定数量,不会多卖。

标准版已经上传天空网 。
http://www.skycn.com/soft/56759.html

有意联系 qq  75998520
posted @ 2009-01-03 13:14 北国狼人的BloG| 编辑 收藏




http://alternativaplatform.com/en/alternativa3d/
posted @ 2008-12-11 09:55 北国狼人的BloG 阅读(173) | 评论 (1)编辑 收藏

good article :

http://www2.ccw.com.cn/07/0724/b/0724b07_3.html

posted @ 2008-11-27 17:27 北国狼人的BloG 阅读(145) | 评论 (0)编辑 收藏

服务器往外发数据包,不是光一个socketChannel.write(bb); 就完事了


那是理想状态。。

用我方法才能保证发出,即使客户端连接很滥

public static long flushChannel(SocketChannel socketChannel,ByteBuffer bb, long writeTimeout) throws IOException
 
{

     SelectionKey key 
= null;
     Selector writeSelector 
= null;
     
int attempts = 0;
     
int bytesProduced = 0;
     
try {
         
while (bb.hasRemaining()) {
             
int len = socketChannel.write(bb);
             attempts
++;
             
if (len < 0){
                 
throw new EOFException();
             }
 
             bytesProduced 
+= len;
             
if (len == 0{
                 
if (writeSelector == null){
                     writeSelector 
= Selector.open();
                     
if (writeSelector == null){
                         
// Continue using the main one
                         continue;
                     }
 
                 }


                 key 
= socketChannel.register(writeSelector, key.OP_WRITE);

                 
if (writeSelector.select(writeTimeout) == 0{

                     
if (attempts > 2)

                         
throw new IOException("Client disconnected");

                 }
 else {

                     attempts
--;

                 }


             }
 else {

                 attempts 
= 0;

             }


         }


     }
 finally {

         
if (key != null{

             key.cancel();

             key 
= null;

         }


         
if (writeSelector != null{

             
// Cancel the key.

             writeSelector.selectNow();

             writeSelector.close();

         }


     }


     
return bytesProduced;

 }
  
posted @ 2008-11-19 12:08 北国狼人的BloG 阅读(1444) | 评论 (1)编辑 收藏
     摘要: flash 的socket 真不错,什么事都内部给办了,换了java,有些麻烦。 网上那些nio的例子简单到无实际价值。 ByteBuffer totalReceiveBuff = ByteBuffer.allocate(30000); .. private void newParseSocketData(int&nbs...  阅读全文
posted @ 2008-11-04 15:14 北国狼人的BloG 阅读(457) | 评论 (1)编辑 收藏


Java VisualVM  ,一个sun自己开发的专门监控java程序性能的图形化工具

就在bin目录下。

posted @ 2008-10-16 11:09 北国狼人的BloG 阅读(238) | 评论 (0)编辑 收藏
 如果你是一个想从大公司去一个小公司Startup的技术人员,你自己一定要多加考虑清楚未来的真的可能成功,一定要有十足把握再做决定。

人的时间有限,能奋斗的时间也有限,请选准老大,否则浪费时间,还废身体。

posted @ 2008-08-27 14:05 北国狼人的BloG 阅读(504) | 评论 (2)编辑 收藏

挑战自我,离开令我失望的公司,准备去千像做游戏。高兴。
posted @ 2008-08-20 12:50 北国狼人的BloG 阅读(337) | 评论 (2)编辑 收藏

<?xml version="1.0"?> 
<report> 
  
<title>Database Access Sample</title> 
  
<section> 
    
<title>Employees by Last Name</title> 
    
<dbaccess driver="COM.ibm.db2.jdbc.app.DB2Driver" 
      database
="jdbc:db2:sample" tablename="wstkadmin.employee" where="*" 
      fieldnames
='lastname as "Last Name", 
      firstnme as "First Name", workdept as "Department"' 
      order-by
="lastname" group-by="lastname, firstnme, workdept"/> 
  
</section> 
</report>

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    
<xsl:output method="xml"/>
    
    
<xsl:template match="*">
        
<xsl:element name="{name()}">
            
<xsl:for-each select="@*">
                
<xsl:element name="{name()}">
                    
<xsl:value-of select="."/>
                
</xsl:element>
            
</xsl:for-each>
            
<xsl:apply-templates select="*|text()"/>
        
</xsl:element>
    
</xsl:template>
    
</xsl:stylesheet>

<?xml version="1.0" encoding="UTF-8"?><report> 
    
<title>Database Access Sample</title> 
    
<section> 
        
<title>Employees by Last Name</title> 
        
<dbaccess><driver>COM.ibm.db2.jdbc.app.DB2Driver</driver><database>jdbc:db2:sample</database><tablename>wstkadmin.employee</tablename><where>*</where><fieldnames>lastname as "Last Name",     firstnme as "First Name", workdept as "Department"</fieldnames><order-by>lastname</order-by><group-by>lastname, firstnme, workdept</group-by></dbaccess> 
    
</section> 
</report>


指定的XPath是一个点号,表示当前节点本身,由于当前节点是XML元素,因此也就输出元素的文本内容,相当于输出XmlElement的InnerText 属性值。
posted @ 2008-08-15 16:12 北国狼人的BloG 阅读(4776) | 评论 (2)编辑 收藏
     摘要: <?xml version="1.0" encoding="UTF-16"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:...  阅读全文
posted @ 2008-08-05 21:38 北国狼人的BloG 阅读(148) | 评论 (0)编辑 收藏

今天,就在今天,我自己完全凭借自己的力量搞定了一次3D,260赚1300。 这是一个革命性的胜利。

我看到校友录上很多幸福的,都贴很多很多的照片,发展确实比我快。呵呵,但我始终相信我所努力的,将给我无穷尽的财富。

看指数增长快,还是直线快。

所以,一切只靠自己站起来的人,已经不要觉得自己慢,你们的长处在于永远不会有人能打跨你。因为你知道如何再站起来!

我鄙视一切靠家里支撑起来的男人们。

posted @ 2008-06-26 00:52 北国狼人的BloG 阅读(454) | 评论 (2)编辑 收藏
/Files/lhulcn618/JDiskSerial.zip

这样,就可以防止被盗了,哈哈。

posted @ 2008-06-03 11:17 北国狼人的BloG 阅读(2640) | 评论 (8)编辑 收藏
pasteAction = new Action() {
   public void run()
   {
    resultInput.paste();  很多控件都有paste方法哦
   }   
  };
  pasteAction.setText("Paste");
  pasteAction.setImageDescriptor(getSite().getWorkbenchWindow().getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_TOOL_PASTE));

 getViewSite().getActionBars().setGlobalActionHandler(ActionFactory.PASTE.getId(), pasteAction);

这样就能让系统剪切版里面的东西粘贴到Text里面了

该死的网上那些都是用在Editor的Action。

关键问题,还得我自己琢磨。



posted @ 2008-05-28 15:42 北国狼人的BloG 阅读(1156) | 评论 (1)编辑 收藏

我的程序曾经有速度瓶颈,我已经优化的所有的代码,后来,我为了测试速度问题。安装了jrockit-R27.5.0-jdk1.5.0_14-windows-ia32.exe,并用BEA JRockit(R) Mission Control 3.0,寻找代码问题,最后替换了Sun jdk,速度至少提高了1000%。 我不是说笑得,我的程序在查询上要几亿的计算。

posted @ 2008-05-28 13:28 北国狼人的BloG 阅读(1676) | 评论 (1)编辑 收藏
牛逼的终极武器


我用Eclipse RCP 技术编写了7个月,终于本月完成。外带一个GWT的数据更新程序。

我相信他的价值已经在千万。内有乾坤。

posted @ 2008-05-22 16:17 北国狼人的BloG 阅读(675) | 评论 (4)编辑 收藏

应该可以夺冠的,上次底的条件有点问题,这次还不是太安全。

posted @ 2008-03-18 15:30 北国狼人的BloG 阅读(214) | 评论 (0)编辑 收藏
日本这个民族就是王八蛋民族,心里非常阴暗,所以,一定堤防,然后找机会干掉他们。

posted @ 2008-02-19 00:50 北国狼人的BloG 阅读(454) | 评论 (4)编辑 收藏

回忆,

        这里在描写一个创业公司的历程,我作为其中一个重要成员,为大家讲述这个公司的故事。


posted @ 2008-01-13 23:54 北国狼人的BloG 阅读(288) | 评论 (1)编辑 收藏
Platform.getInstanceLocation().getURL().getPath(); 

     filePath = FileLocator.toFileURL(Platform.getBundle(IAppConstants.APPLICATION_ID)
       .getEntry("")).getPath().toString();

至于这个,就是很多网页里面写的
     Platform.asLocalURL(PRODUCT_BUNDLE.getEntry("")).getPath()).getAbsolutePath(); 根本就没有过用!安装后,路经根本就不是你需要的。

  
posted @ 2008-01-13 23:39 北国狼人的BloG 阅读(300) | 评论 (0)编辑 收藏
     摘要: {  //接受一个表达式参数的构造函数  public ExpressionAnalyze(String expr) throws Exception{   this.expr = expr;   numOfParameter = 0;  ...  阅读全文
posted @ 2007-12-18 13:33 北国狼人的BloG 阅读(301) | 评论 (0)编辑 收藏
我只用了1周学会了RCP,开始开发,比Swing好用多了

当我要导出到发布平台上,竟然报错!

!SESSION 2007-12-03 11:59:01.796 -----------------------------------------------
eclipse.buildId=unknown
java.version=1.6.0_02
java.vendor=Sun Microsystems Inc.
BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=zh_CN
Command-line arguments:  -os win32 -ws win32 -arch x86

!ENTRY org.eclipse.osgi 4 0 2007-12-03 11:59:02.718
!MESSAGE Application error
!STACK 1
org.eclipse.core.runtime.CoreException: Plug-in TD was unable to load class td.app.Application.
 at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.throwException(RegistryStrategyOSGI.java:165)
 at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:149)
 at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:759)
 at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243)
 at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:51)
 at org.eclipse.core.internal.runtime.PlatformActivator$1.run(PlatformActivator.java:74)
 at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:92)
 at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:68)
 at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:400)
 at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:177)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
 at java.lang.reflect.Method.invoke(Unknown Source)
 at org.eclipse.core.launcher.Main.invokeFramework(Main.java:336)
 at org.eclipse.core.launcher.Main.basicRun(Main.java:280)
 at org.eclipse.core.launcher.Main.run(Main.java:977)
 at org.eclipse.core.launcher.Main.main(Main.java:952)
org.eclipse.core.runtime.CoreException[1]: java.lang.ClassNotFoundException: td.app.Application
 at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:402)
 at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:347)
 at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:83)
 at java.lang.ClassLoader.loadClass(Unknown Source)
 at org.eclipse.osgi.framework.internal.core.BundleLoader.loadClass(BundleLoader.java:278)
 at org.eclipse.osgi.framework.internal.core.BundleHost.loadClass(BundleHost.java:227)
 at org.eclipse.osgi.framework.internal.core.AbstractBundle.loadClass(AbstractBundle.java:1245)
 at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:147)
 at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:759)
 at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243)
 at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:51)
 at org.eclipse.core.internal.runtime.PlatformActivator$1.run(PlatformActivator.java:74)
 at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:92)
 at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:68)
 at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:400)
 at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:177)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
 at java.lang.reflect.Method.invoke(Unknown Source)
 at org.eclipse.core.launcher.Main.invokeFramework(Main.java:336)
 at org.eclipse.core.launcher.Main.basicRun(Main.java:280)
 at org.eclipse.core.launcher.Main.run(Main.java:977)
 at org.eclipse.core.launcher.Main.main(Main.java:952)


弄到12点没有搞定,竟然难倒我这个java高手。

找死,必须干掉他。

早上想了一下,生产的plugins好像不是jar文件,只是一个目录,难道打包本身就有问题。

运行报我自己写的类找不到,明明就在同一目录阿!!!!

同一目录,一个点代表相同目录

在plugin.xml中classpath中,加入



Up到最上面就搞定了。

没有能难倒的问题!

AIX,我只用了1晚上就学会了。但往往简单的是比较难想到,细节!!!!!

posted @ 2007-12-03 12:07 北国狼人的BloG 阅读(14336) | 评论 (9)编辑 收藏

颈椎病对于编程人员来说,病的根源,就是使用笔记本!所以笔记本就是shit!!!!笔记本这种玩意就不符合人体工学!!!

如何把它的害处降到最低。需要买几个产品。


笔记本支架
http://auction1.taobao.com/auction/0/item_detail-0db1-fa0ab46717672d98db4216c7d91f92b7.jhtml

鼠标支架
http://auction1.taobao.com/auction/50008090/item_detail-0db2-b11eae3701f89240213f4099210f2384.jhtml

还有599宜家的枕头。

这三样在手, 就可以了。

不要省钱,否则就坏了身体,我之间不懂,就吃了亏。正在治疗!
posted @ 2007-10-25 14:51 北国狼人的BloG 阅读(233) | 评论 (0)编辑 收藏


你们是现在走在我前面,又上德国,又上美国,你们牛鼻。你们在前面,我才有目标阿。真好,会一个个被我赶超。

狂笑,当我笑声停止的时候,就是我不笑的时候。等着吧。

我会一个个算账。

posted @ 2007-10-12 10:39 北国狼人的BloG 阅读(278) | 评论 (0)编辑 收藏
离成功还差一步。就在这时,竟然出现黑马,中了16个一等。我操,天为什么这样玩我。

不过,我早已练就了,最好的心理素质。

跟我斗,都得死!

posted @ 2007-10-12 10:31 北国狼人的BloG 阅读(227) | 评论 (0)编辑 收藏

   希望财神关顾我!我中了大奖,就可以change life,然后选择新的开始!

posted @ 2007-09-25 14:56 北国狼人的BloG 阅读(178) | 评论 (0)编辑 收藏
     摘要: package  com.broadtext.client.widget; import  com.google.gwt.user.client.DOM; import  com.google.gwt.user.client.Element; import  com.google.gwt.user.client.ui.Compl...  阅读全文
posted @ 2006-11-13 13:40 北国狼人的BloG 阅读(524) | 评论 (0)编辑 收藏

从最近SK-II和相关的食品用品中查出有毒,会迫害中国人基因的行为看来。我们是时候站起来,真正的反日了,让日本的东西卖不出去,日本的企业赚不着钱,让日本拿不走咱们的资源!!!!SHIT JAP!!

希望每一个中国人,有点民族血性,有点民族气质!!!

posted @ 2006-09-22 22:43 北国狼人的BloG 阅读(1518) | 评论 (8)编辑 收藏

最近使用Mambo开发了一个中医药网站,后台做了一个媒体管理组件,有想要的。

留下email.

posted @ 2006-08-28 18:57 北国狼人的BloG 阅读(655) | 评论 (6)编辑 收藏
     摘要: 想起来就郁闷,这周重写了一个垃圾人的代码,也就是我这么高的高手能完成这样的艰巨的任务,在应用层代码和服务端代码都不是我自己的情况下,现分析再重写,再优化,再在周五保证无恙上线。谁也来不了!!我实在是不能不说,以下文字带有不净词语,实属我无奈,因为星期三的那天我已经接近崩溃,我不得不说,请所有学Java的人注意。开始展现:   */    public Vector getDimenionDocs(...  阅读全文
posted @ 2006-08-13 09:24 北国狼人的BloG 阅读(1162) | 评论 (8)编辑 收藏

安装Eclipse 3.1.2 + WTP 1.0.1以后,就可以进行相应的webservice。


建立一个动态web项目,建立一个Javabean,想封装一个webservice

会报异常!

IWAB0014E Unexpected exception occured.
  0
      java.lang.ArrayIndexOutOfBoundsException: 0
      at org.eclipse.jst.ws.internal.consumption.ui.wsrt.WebServiceRuntimeExtensionUtils2.getDefaultServerValueFor(WebServiceRuntimeExtensionUtils2.java:511)
      at org.eclipse.jst.ws.internal.creation.ui.widgets.ServerWizardWidgetDefaultingCommand.execute(ServerWizardWidgetDefaultingCommand.java:33)
      at org.eclipse.wst.command.internal.env.core.fragment.CommandFragmentEngine.runCommand(CommandFragmentEngine.java:387)
      at org.eclipse.wst.command.internal.env.core.fragment.CommandFragmentEngine.visitTop(CommandFragmentEngine.java:327)
      at org.eclipse.wst.command.internal.env.core.fragment.CommandFragmentEngine.moveForwardToNextStop(CommandFragmentEngine.java:226)
      at org.eclipse.wst.command.internal.env.ui.widgets.SimpleCommandEngineManager$5.run(SimpleCommandEngineManager.java:247)
      at org.eclipse.wst.command.internal.env.ui.widgets.SimpleCommandEngineManager.runForwardToNextStop(SimpleCommandEngineManager.java:211)
      at org.eclipse.wst.command.internal.env.ui.widgets.WizardPageManager.runForwardToNextStop(WizardPageManager.java:79)
      at org.eclipse.wst.command.internal.env.ui.widgets.WizardPageManager.getNextPage(WizardPageManager.java:125)
      at org.eclipse.wst.command.internal.env.ui.widgets.DynamicWizard.getStartingPage(DynamicWizard.java:314)
      at org.eclipse.jface.wizard.WizardDialog.showStartingPage(WizardDialog.java:1041)
      at org.eclipse.jface.wizard.WizardDialog.createContents(WizardDialog.java:504)
      at org.eclipse.jface.window.Window.create(Window.java:418)
      at org.eclipse.jface.dialogs.Dialog.create(Dialog.java:996)
      at org.eclipse.wst.command.internal.env.ui.widgets.popup.DynamicPopupWizard.run(DynamicPopupWizard.java:122)
      at org.eclipse.ui.internal.PluginAction.runWithEvent(PluginAction.java:246)
      at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:538)
      at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:488)
      at org.eclipse.jface.action.ActionContributionItem$5.handleEvent(ActionContributionItem.java:400)
      at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
      at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:843)
      at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3125)
      at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2758)
      at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:1699)
      at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:1663)
      at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:367)
      at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:143)
      at org.eclipse.ui.internal.ide.IDEApplication.run(IDEApplication.java:103)
      at org.eclipse.core.internal.runtime.PlatformActivator$1.run(PlatformActivator.java:226)
      at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:376)
      at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:163)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
      at java.lang.reflect.Method.invoke(Unknown Source)
      at org.eclipse.core.launcher.Main.invokeFramework(Main.java:334)
      at org.eclipse.core.launcher.Main.basicRun(Main.java:278)
      at org.eclipse.core.launcher.Main.run(Main.java:973)
      at org.eclipse.core.launcher.Main.main(Main.java:948)

其实是一个简单的问题,可是Eclipse 这位大爷他不说人话。


11.gif

然后你在试试,就好了。

posted @ 2006-08-03 09:36 北国狼人的BloG 阅读(6938) | 评论 (7)编辑 收藏

学习过程

1,首先了解Documentum的架构

2,了解Dfc是什么,Dmcl是什么,使用Dfc进行相应的开发。其使用习惯大概和Hibernate相似。

3,了解WDK开发过程,什么是组件,什么是Container,什么是Action,什么是Strings



为了开发wdk,必须使用Eclipse建立一个标准的web项目才能进行,所以必须要有个部署方便的策略

<?xml version="1.0" encoding="gb2312"?>

<!-- 
   Build file for "WebTop WDK FILE LIST FUNCTION" 
   Creation date : 2006-05-15 
   Updated date : 2006-05-15
   Author:  ljl
-->
<project name="BmccBaseSp" default="main" basedir=".">

     <property name="work.path"      value="C:/workspace"/>
  <property name="webtop.war.path"   value="C:/Program Files/WebSphere/AppServer/installedApps/10.4.7.140/webtop_war.ear/webtop.war"/>
     <property name="version"            value="1.0"/>
    
<!-- Tell ant to use my environment variables -->     
      <property name="productName"        value="FILE LIST for WORK FLOW"/>
      <property name="build.dir"          value="${basedir}/WebRoot/WEB-INF/classes" />
      <property name="src.dir"            value="${basedir}/src"/>
      <property name="docs.dir"           value="${basedir}/docs"/>
      <property name="custom.dir"    value="${basedir}/WebRoot/custom"/>
     
      <property name="encoding.name"      value="GB2312"/>
     
<!-- Win XP -->   
      <property name="deploy.WinXP.dir"   value="${work.path}/WinXP/deploy${version}"/>
      <property name="deploy.WebTop.dir"  value="${webtop.war.path}"/>

<!-- class path -->
      <path id="class.path">
          <fileset dir="${basedir}/WebRoot/WEB-INF/lib/">
              <include name="**/*.jar"/>
              <include name="**/*.zip"/>
          </fileset>
      </path>
     

<!-- clean dir -->
      <target name="remove">
          <delete dir="${build.dir}" includeEmptyDirs="true"/>
          <delete dir="${deploy.WinXP.dir}" includeEmptyDirs="true"/>
      </target>

<!-- construct dir -->
      <target name="makeDir">
          <mkdir dir="${build.dir}"/>
          <mkdir dir="${deploy.WinXP.dir}"/>
      </target>

<!-- compile -->     
      <target name="compile" depends="makeDir">
         <javac     srcdir="${src.dir}"
                    destdir="${build.dir}"
                    debug="on"
                    deprecation="off">
          <include   name="**/*.java"/>
          <classpath refid="class.path"/>
        </javac>
      </target>


<!-- start target task -->     
      <target name="main" depends="remove, makeDir, compile"/>
     
     

<!-- ============================================================= -->         
<!--                                api docs                       -->
<!-- ============================================================= --> 
<!-- remove old javadocs -->
      <target name="removeDocDir">
          <delete dir="${docs.dir}" includeEmptyDirs="true"/>
      </target>

<!-- make docs dir -->
      <target name="makeDocDir">
          <mkdir dir="${docs.dir}"/>
      </target>
     
<!-- create javadocs -->
      <target name="docs" depends="removeDocDir, makeDocDir">          
          <javadoc packagenames="com.documentum.custom.*"
               sourcepath="${basedir}"
               destdir="${docs.dir}"
               author="true"
               version="true"
               use="true"
               charset="${encoding.name}"
               windowtitle="${productName}: ${version}">
           </javadoc>
           <doctitle><![CDATA[<h1>Test</h1>]]></doctitle>
           <bottom><![CDATA[<i>Copyright &#169; 2006 Dummy Corp. All Rights Reserved.</i>]]></bottom>
           <link href="http://java.sun.com/j2se/1.4/docs/api/usr/web/work/j2se/1.4/docs/api"/>
      </target>
    

     
<!-- ============================================================= -->         
<!--                            WinXP deploy                       -->
<!-- ============================================================= --> 
     
<!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  -->
<!-- start deployWin2KBE task -->     
   <target name="deployWinXP" >
       <delete dir="${deploy.WinXP.dir}" includeEmptyDirs="true"/>         
       <mkdir  dir="${deploy.WinXP.dir}"/>    
 
 <!-- difference -->
       <copy    todir="${deploy.WinXP.dir}/classes">
                <fileset dir="${basedir}/WebRoot/WEB-INF/classes"
                         includes="**/**"/>
       </copy> 
       <copy    todir="${deploy.WinXP.dir}">
                <fileset dir="${basedir}/WebRoot/custom"
                         includes="**/**"
                         excludes="**/.bak"/>
       </copy>
 
   </target>
 
  <target name="deployTOwebtop">
     <copy  todir="${deploy.WebTop.dir}/WEB-INF/classes">
        <fileset dir="${basedir}/WebRoot/WEB-INF/classes"
                               includes="**/**"/>
     </copy>
     <copy     todir="${deploy.WebTop.dir}/custom">
            <fileset dir="${basedir}/WebRoot/custom"
                            includes="**/**"
                            excludes="**/.bak"/>
     </copy>
  </target>
       
<!-- run all tasks -->
     <target name="newDeployWin2k" depends="main, deployWinXP"/>
  <target name="realDeployWebTop" depends="deployTOwebtop"/>

</project>

posted @ 2006-07-18 17:32 北国狼人的BloG 阅读(1264) | 评论 (3)编辑 收藏
西谚说:“年轻的本钱,就是有时间去失败第二次。”等到我们老了,就已经没人肯请我们去工作了,所以年轻时努力奋斗是很重要的。
  一位哲人说:“你的心态就是你真正的主人。”一位伟人说:“要么你去驾驭生命,要么是生命驾驭你。你的心态决定谁是坐骑,谁是骑师。”

宁可去碰壁,也不要在家里面壁

  当你遇到挫折时,给你几点小建议:
  找个地方喝点酒,沉醉一回
  找个迪厅跳跳舞,放松一下
  找帮朋友侃侃山,开怀一番
  积极行动起来,分析失败的原因,找出行动的方法

找新工作嘛,怕什么呢!!!!

年轻不尝试新的工作,就是扯淡。
posted @ 2006-07-16 20:23 北国狼人的BloG 阅读(420) | 评论 (0)编辑 收藏
颈椎病是一种严重危害伏案工作者健康的疾病,它的表现多种多样。主要有颈背疼痛、上肢无力、手指发麻,头晕、恶心甚至视物模糊,吞咽模糊。 令人遗憾的是,到目前为止,全世界对这种令人头痛的疾病尚无有效方法。最近脚底研究专家发现。脚底集合了身体的全部器官司的反射区。通过治疗足底反射区即 可产生令人惊奇的疗效。

  颈椎在足部的反射区是:双足拇趾趾腹根部横纹处,双足外侧第五趾骨中部(足外侧最突出点中部),颈部肌肉反射区是:双足底肢趾后方的2cm宽区域。

  按摩方法是:用拇指指尖或指腹;也可用第二指或第三指的关节,以数毫米幅度移动。力度最初较轻,渐渐增强,以稍有痛感为宜,按摩时间可自选抽空进行。最好是每天早晚各一次,每次10-30分钟,坚持两周以后对一般颈椎病患者即可出现神奇效果。

  办公室工作人员如何预防颈椎病

  办公室工作人员首先在坐姿上尽可能保持自然的端坐位,头部略微前倾,保持头、颈、胸的正常生理曲线;尚可升高或降低桌面与椅子的高度比例以避免头颈部过度后仰或过度前屈;此外,定制一与桌面呈10~30度的斜面工作板,更有利于坐姿的调整。

  对于长期伏案工作者,应在1~2小时左右,有目的地让头颈部向左右转动数次,转动时应轻柔、缓慢,以达到该方向的最大运动范围为准;或行夹肩运动,两肩慢 慢紧缩 3~5秒钟,尔后双肩向上坚持3~5秒钟,重复6~8次;也可利用两张办公桌,两手撑于桌面,两足腾空,头往后仰,坚持5秒钟,重复3~5次。

  当长时间近距离看物,尤其是处于低头状态者,既影响颈椎,又易引起视力疲劳,甚至诱发屈光不正。因此,每当伏案过久后,应抬头向远方眺望半分钟左右。这样既可消除疲劳感,又有利于颈椎的保健。

  八式颈椎保健操

  这里特介绍八式颈椎保健操,以供大家在平时练习。

  前俯后仰:做操前,先自然站立,双目平视,双脚略分开,与两肩平行,然后双手叉腰。动作时先抬头后仰,同时吸气,双眼望天,停留片刻;然后缓慢向前胸部位 低头,同时呼气,双眼看地。做此动作时,要闭口,使下颌尽量紧贴前胸,停留片刻后,再上下反复做四次。动作要旨是:舒展、轻松、缓慢,以不感到难受为宜。

  举 臂转身:做操前,先自然站立,双目平视,双脚略分开,与肩同宽,双手自然下垂。动作时先举右臂,手掌向下,抬头目视手心,身体慢慢转向左侧,停留片刻。在 转身时,要注意脚跟转动45度,身体重心向前倾,然后身体再转向右后侧,旋转时要慢慢吸气,回转时慢慢呼气,整个动作要缓慢、协调。转动颈、腰部时,要尽 量转到不能转为止,停留片刻,回到自然式后,再换左臂。而换左臂时,放下的手要沿耳根慢慢压下,换好手臂后同样再做,来回反复做两次。

  左右旋转:做操前,先自然站立,双目平视,双脚略分开,与肩平行,双手叉腰。动作时先将头部缓慢转向左侧,同时吸气于胸,让右侧颈部伸直后,停留片刻,再 缓慢转向左侧,同时呼气,让左边颈部伸直后,停留片刻。这样反复交替做四次。要注意的是,整套动作要轻松、舒展,以不感到头晕为宜。

  提肩缩颈:做操前,先自然站立,双目平视,双脚略分开,与肩平行,双手自然下垂。动作时双肩慢慢提起,颈部尽量往下缩,停留片刻后,双肩慢慢放松地放下, 头颈自然伸出,还原自然,然后再将双肩用力往下沉,头颈部向上拔伸,停留片刻后,双肩放松,并自然呼气。注意在缩伸颈的同时要慢慢吸气,停留时要憋气,松 肩时要尽量使肩、颈部放松。回到自然式后,再反复做四次。

  左右摆动:做操前,先自然站立,双目平视,双脚略分开,与肩平行,双手叉腰。动作时头部缓缓向左户倾斜,使左耳贴于左肩,停留片刻后,头部返回中位;然后 再向右肩左耳贴于在左肩,停留片刻后,头部返回中位;然后再向右肩倾斜,同样右耳要贴近右肩,停留片刻后,再回到中位。这样左右摆动反复做四次,在头部摆 动时需吸气,回到中位时慢慢呼气,做操时双肩、颈部要尽量放松,动作以慢而稳为佳。

  波浪屈伸:做操前,先自然站立,双目平视,双腿略分开,与肩平行,双手自然下垂。动作时下颌往下前方波浪式屈伸,在做该动作时,下颌尽量贴近前胸,双肩扛 起,下颌慢慢屈起,胸部前挺,双肩往后上下慢慢运动。下颌屈伸时要慢慢吸气,抬头还原时慢慢呼气,双肩放松,做两次停留片刻;然后再倒过来做下颌伸屈运 动,由上往下时吸气,还原时呼气,做两次,正反各练两次。

  颈部活动的三种常见方法

  (1)颈项牵拉:先做立正姿式,两脚稍分开,两手撑腰。练习时:头、颈向右转,双目向右后方看;还原至预备姿式;低头看地,以下颌能触及胸骨柄为佳;还原。动作宜缓慢进行,以呼吸一次做一个动作为宜。左右交替运动。

  (2)往后观看:预备姿势同上,练习时:头颈向右转,双目向右后方看;还原至预备姿势;头颈向左转,双目向左后方看;还原。动作要配合呼吸,缓慢进行。

  (3)回头望月:预备姿势同上,练习时:头颈向右后上方尽力转,上身也随同略向右转,双目转视右后上方,仰望天空;还原至预备姿势;头颈向左后上方尽力转,上身也随同略向左转,双目转视左后上方,仰望天空;还原。呼吸一次做一个动作。

  以上三个动作,主要是练习颈部的伸屈与旋转功能。轻症患者可加练侧弯动作。眩晕型患者如做颈部旋转动作有副作用,宜暂停练习往后观看及回头望月动作。

posted @ 2006-06-29 07:23 北国狼人的BloG 阅读(286) | 评论 (0)编辑 收藏

我在参加一个比赛。

欢迎大家都来我的网站参观一下。

http://home.fego.cn/members/lhulcn2008/default.aspx

多谢支持!


当JVM(Java虚拟机)启动时,会形成由三个类加载器组成的初始类加载器层次结构:

       bootstrap classloader
                |
       extension classloader
                |
       system classloader

bootstrap classloader -引导(也称为原始)类加载器,它负责加载Java的核心类。在Sun的JVM中,在执行java的命令中使用-Xbootclasspath选项或使用- D选项指定sun.boot.class.path系统属性值可以指定附加的类。这个加载器的是非常特殊的,它实际上不是 java.lang.ClassLoader的子类,而是由JVM自身实现的。大家可以通过执行以下代码来获得bootstrap classloader加载了那些核心类库:
   URL[] urls=sun.misc.Launcher.getBootstrapClassPath().getURLs();
   for (int i = 0; i < urls.length; i++) {
     System.out.println(urls.toExternalform());
   }
在我的计算机上的结果为:
文件:/C:/j2sdk1.4.1_01/jre/lib/endorsed/dom.jar
文件:/C:/j2sdk1.4.1_01/jre/lib/endorsed/sax.jar
文件:/C:/j2sdk1.4.1_01/jre/lib/endorsed/xalan-2.3.1.jar
文件:/C:/j2sdk1.4.1_01/jre/lib/endorsed/xercesImpl-2.0.0.jar
文件:/C:/j2sdk1.4.1_01/jre/lib/endorsed/xml-apis.jar
文件:/C:/j2sdk1.4.1_01/jre/lib/endorsed/xsltc.jar
文件:/C:/j2sdk1.4.1_01/jre/lib/rt.jar
文件:/C:/j2sdk1.4.1_01/jre/lib/i18n.jar
文件:/C:/j2sdk1.4.1_01/jre/lib/sunrsasign.jar
文件:/C:/j2sdk1.4.1_01/jre/lib/jsse.jar
文件:/C:/j2sdk1.4.1_01/jre/lib/jce.jar
文件:/C:/j2sdk1.4.1_01/jre/lib/charsets.jar
文件:/C:/j2sdk1.4.1_01/jre/classes
这时大家知道了为什么我们不需要在系统属性CLASSPATH中指定这些类库了吧,因为JVM在启动的时候就自动加载它们了。

extension classloader -扩展类加载器,它负责加载JRE的扩展目录(JAVA_HOME/jre/lib/ext或者由java.ext.dirs系统属性指定的)中JAR的类包。这为引入除Java核心类以外的新功能提供了一个标准机制。因为默认的扩展目录对所有从同一个JRE中启动的JVM都是通用的,所以放入这个目录的 JAR类包对所有的JVM和system classloader都是可见的。在这个实例上调用方法getParent()总是返回空值null,因为引导加载器bootstrap classloader不是一个真正的ClassLoader实例。所以当大家执行以下代码时:
   System.out.println(System.getProperty("java.ext.dirs"));
   ClassLoader extensionClassloader=ClassLoader.getSystemClassLoader().getParent();
   System.out.println("the parent of extension classloader : "+extensionClassloader.getParent());
结果为:
C:\j2sdk1.4.1_01\jre\lib\ext
the parent of extension classloader : null
extension classloader是system classloader的parent,而bootstrap classloader是extension classloader的parent,但它不是一个实际的classloader,所以为null。

system classloader -系统(也称为应用)类加载器,它负责在JVM被启动时,加载来自在命令java中的-classpath或者java.class.path系统属性或者 CLASSPATH操作系统属性所指定的JAR类包和类路径。总能通过静态方法ClassLoader.getSystemClassLoader()找到该类加载器。如果没有特别指定,则用户自定义的任何类加载器都将该类加载器作为它的父加载器。执行以下代码即可获得:
   System.out.println(System.getProperty("java.class.path"));
输出结果则为用户在系统属性里面设置的CLASSPATH。
classloader 加载类用的是全盘负责委托机制。所谓全盘负责,即是当一个classloader加载一个Class的时候,这个Class所依赖的和引用的所有 Class也由这个classloader负责载入,除非是显式的使用另外一个classloader载入;委托机制则是先让parent(父)类加载器 (而不是super,它与parent classloader类不是继承关系)寻找,只有在parent找不到的时候才从自己的类路径中去寻找。此外类加载还采用了cache机制,也就是如果 cache中保存了这个Class就直接返回它,如果没有才从文件中读取和转换成Class,并存入cache,这就是为什么我们修改了Class但是必须重新启动JVM才能生效的原因。


每个ClassLoader加载Class的过程是:
1.检测此Class是否载入过(即在cache中是否有此Class),如果有到8,如果没有到2
2.如果parent classloader不存在(没有parent,那parent一定是bootstrap classloader了),到4
3.请求parent classloader载入,如果成功到8,不成功到5
4.请求jvm从bootstrap classloader中载入,如果成功到8
5.寻找Class文件(从与此classloader相关的类路径中寻找)。如果找不到则到7.
6.从文件中载入Class,到8.
7.抛出ClassNotFoundException.
8.返回Class.

其中5.6步我们可以通过覆盖ClassLoader的findClass方法来实现自己的载入策略。甚至覆盖loadClass方法来实现自己的载入过程。

类加载器的顺序是:
先是bootstrap classloader,然后是extension classloader,最后才是system classloader。大家会发现加载的Class越是重要的越在靠前面。这样做的原因是出于安全性的考虑,试想如果system classloader“亲自”加载了一个具有破坏性的“java.lang.System”类的后果吧。这种委托机制保证了用户即使具有一个这样的类,也把它加入到了类路径中,但是它永远不会被载入,因为这个类总是由bootstrap classloader来加载的。大家可以执行一下以下的代码:
   System.out.println(System.class.getClassLoader());
将会看到结果是null,这就表明java.lang.System是由bootstrap classloader加载的,因为bootstrap classloader不是一个真正的ClassLoader实例,而是由JVM实现的,正如前面已经说过的。

下面就让我们来看看JVM是如何来为我们来建立类加载器的结构的:
sun.misc.Launcher,顾名思义,当你执行java命令的时候,JVM会先使用bootstrap classloader载入并初始化一个Launcher,执行下来代码:
  System.out.println("the Launcher's classloader is "+sun.misc.Launcher.getLauncher().getClass().getClassLoader());
结果为:
  the Launcher's classloader is null (因为是用bootstrap classloader加载,所以class loader为null)
Launcher 会根据系统和命令设定初始化好class loader结构,JVM就用它来获得extension classloader和system classloader,并载入所有的需要载入的Class,最后执行java命令指定的带有静态的main方法的Class。extension classloader实际上是sun.misc.Launcher$ExtClassLoader类的一个实例,system classloader实际上是sun.misc.Launcher$AppClassLoader类的一个实例。并且都是 java.net.URLClassLoader的子类。

让我们来看看Launcher初试化的过程的部分代码。

Launcher的部分代码:
public class Launcher  {
   public Launcher() {
       ExtClassLoader extclassloader;
       try {
           //初始化extension classloader
           extclassloader = ExtClassLoader.getExtClassLoader();
       } catch(IOException ioexception) {
           throw new InternalError("Could not create extension class loader");
       }
       try {
           //初始化system classloader,parent是extension classloader
           loader = AppClassLoader.getAppClassLoader(extclassloader);
       } catch(IOException ioexception1) {
           throw new InternalError("Could not create application class loader");
       }
       //将system classloader设置成当前线程的context classloader(将在后面加以介绍)
       Thread.currentThread().setContextClassLoader(loader);
       ......
   }
   public ClassLoader getClassLoader() {
       //返回system classloader
       return loader;
   }
}

extension classloader的部分代码:
static class Launcher$ExtClassLoader extends URLClassLoader {

   public static Launcher$ExtClassLoader getExtClassLoader()
       throws IOException
   {
       File afile[] = getExtDirs();
       return (Launcher$ExtClassLoader)AccessController.doPrivileged(new Launcher$1(afile));
   }
  private static File[] getExtDirs() {
       //获得系统属性“java.ext.dirs”
       String s = System.getProperty("java.ext.dirs");
       File afile[];
       if(s != null) {
           StringTokenizer stringtokenizer = new StringTokenizer(s, File.pathSeparator);
           int i = stringtokenizer.countTokens();
           afile = new File;
           for(int j = 0; j < i; j++)
               afile[j] = new File(stringtokenizer.nextToken());

       } else {
           afile = new File[0];
       }
       return afile;
   }
}

system classloader的部分代码:
static class Launcher$AppClassLoader extends URLClassLoader
{

   public static ClassLoader getAppClassLoader(ClassLoader classloader)
       throws IOException
   {
       //获得系统属性“java.class.path”
       String s = System.getProperty("java.class.path");
       File afile[] = s != null ? Launcher.access$200(s) : new File[0];
       return (Launcher$AppClassLoader)AccessController.doPrivileged(new Launcher$2(s, afile, classloader));
   }
}

看了源代码大家就清楚了吧,extension classloader是使用系统属性“java.ext.dirs”设置类搜索路径的,并且没有parent。system classloader是使用系统属性“java.class.path”设置类搜索路径的,并且有一个parent classloader。Launcher初始化extension classloader,system classloader,并将system classloader设置成为context classloader,但是仅仅返回system classloader给JVM。

  这里怎么又出来一个context classloader呢?它有什么用呢?我们在建立一个线程Thread的时候,可以为这个线程通过setContextClassLoader方法来指定一个合适的classloader作为这个线程的context classloader,当此线程运行的时候,我们可以通过getContextClassLoader方法来获得此context classloader,就可以用它来载入我们所需要的Class。默认的是system classloader。利用这个特性,我们可以“打破”classloader委托机制了,父classloader可以获得当前线程的context classloader,而这个context classloader可以是它的子classloader或者其他的classloader,那么父classloader就可以从其获得所需的 Class,这就打破了只能向父classloader请求的限制了。这个机制可以满足当我们的classpath是在运行时才确定,并由定制的 classloader加载的时候,由system classloader(即在jvm classpath中)加载的class可以通过context classloader获得定制的classloader并加载入特定的class(通常是抽象类和接口,定制的classloader中是其实现),例如web应用中的servlet就是用这种机制加载的.


好了,现在我们了解了classloader的结构和工作原理,那么我们如何实现在运行时的动态载入和更新呢?只要我们能够动态改变类搜索路径和清除classloader的cache中已经载入的Class就行了,有两个方案,一是我们继承一个classloader,覆盖loadclass方法,动态的寻找Class文件并使用defineClass方法来;另一个则非常简单实用,只要重新使用一个新的类搜索路径来new一个classloader就行了,这样即更新了类搜索路径以便来载入新的Class,也重新生成了一个空白的cache(当然,类搜索路径不一定必须更改)。噢,太好了,我们几乎不用做什么工作,java.netURLClassLoader正是一个符合我们要求的classloader!我们可以直接使用或者继承它就可以了!

这是j2se1.4 API的doc中URLClassLoader的两个构造器的描述:
URLClassLoader(URL[] urls)
         Constructs a new URLClassLoader for the specified URLs using the default delegation parent ClassLoader.
URLClassLoader(URL[] urls, ClassLoader parent)
         Constructs a new URLClassLoader for the given URLs.
其中URL[] urls就是我们要设置的类搜索路径,parent就是这个classloader的parent classloader,默认的是system classloader。


好,现在我们能够动态的载入Class了,这样我们就可以利用newInstance方法来获得一个Object。但我们如何将此Object造型呢?可以将此Object造型成它本身的Class吗?

首先让我们来分析一下java源文件的编译,运行吧!javac命令是调用“JAVA_HOME/lib/tools.jar”中的“com.sun.tools.javac.Main”的compile方法来编译:

   public static int compile(String as[]);

   public static int compile(String as[], PrintWriter printwriter);

返回0表示编译成功,字符串数组as则是我们用javac命令编译时的参数,以空格划分。例如:
javac -classpath c:\foo\bar.jar;. -d c:\ c:\Some.java
则字符串数组as为{"-classpath","c:\\foo\\bar.jar;.","-d","c:\\","c:\\Some.java"},如果带有PrintWriter参数,则会把编译信息出到这个指定的printWriter中。默认的输出是System.err。

其中 Main是由JVM使用Launcher初始化的system classloader载入的,根据全盘负责原则,编译器在解析这个java源文件时所发现的它所依赖和引用的所有Class也将由system classloader载入,如果system classloader不能载入某个Class时,编译器将抛出一个“cannot resolve symbol”错误。

所以首先编译就通不过,也就是编译器无法编译一个引用了不在CLASSPATH中的未知Class的java源文件,而由于拼写错误或者没有把所需类库放到CLASSPATH中,大家一定经常看到这个“cannot resolve symbol”这个编译错误吧!

其次,就是我们把这个Class放到编译路径中,成功的进行了编译,然后在运行的时候不把它放入到CLASSPATH中而利用我们自己的 classloader来动态载入这个Class,这时候也会出现“java.lang.NoClassDefFoundError”的违例,为什么呢?

我们再来分析一下,首先调用这个造型语句的可执行的Class一定是由JVM使用Launcher初始化的system classloader载入的,根据全盘负责原则,当我们进行造型的时候,JVM也会使用system classloader来尝试载入这个Class来对实例进行造型,自然在system classloader寻找不到这个Class时就会抛出“java.lang.NoClassDefFoundError”的违例。

OK,现在让我们来总结一下,java文件的编译和Class的载入执行,都是使用Launcher初始化的system classloader作为类载入器的,我们无法动态的改变system classloader,更无法让JVM使用我们自己的classloader来替换system classloader,根据全盘负责原则,就限制了编译和运行时,我们无法直接显式的使用一个system classloader寻找不到的Class,即我们只能使用Java核心类库,扩展类库和CLASSPATH中的类库中的Class。

还不死心!再尝试一下这种情况,我们把这个Class也放入到CLASSPATH中,让system classloader能够识别和载入。然后我们通过自己的classloader来从指定的class文件中载入这个Class(不能够委托 parent载入,因为这样会被system classloader从CLASSPATH中将其载入),然后实例化一个Object,并造型成这个Class,这样JVM也识别这个Class(因为 system classloader能够定位和载入这个Class从CLASSPATH中),载入的也不是CLASSPATH中的这个Class,而是从 CLASSPATH外动态载入的,这样总行了吧!十分不幸的是,这时会出现“java.lang.ClassCastException”违例。

为什么呢?我们也来分析一下,不错,我们虽然从CLASSPATH外使用我们自己的classloader动态载入了这个Class,但将它的实例造型的时候是JVM会使用system classloader来再次载入这个Class,并尝试将使用我们的自己的classloader载入的Class的一个实例造型为system classloader载入的这个Class(另外的一个)。大家发现什么问题了吗?也就是我们尝试将从一个classloader载入的Class的一个实例造型为另外一个classloader载入的Class,虽然这两个Class的名字一样,甚至是从同一个class文件中载入。但不幸的是JVM 却认为这个两个Class是不同的,即JVM认为不同的classloader载入的相同的名字的Class(即使是从同一个class文件中载入的)是不同的!这样做的原因我想大概也是主要出于安全性考虑,这样就保证所有的核心Java类都是system classloader载入的,我们无法用自己的classloader载入的相同名字的Class的实例来替换它们的实例。

看到这里,聪明的读者一定想到了该如何动态载入我们的Class,实例化,造型并调用了吧!

那就是利用面向对象的基本特性之一的多形性。我们把我们动态载入的Class的实例造型成它的一个system classloader所能识别的父类就行了!这是为什么呢?我们还是要再来分析一次。当我们用我们自己的classloader来动态载入这我们只要把这个Class的时候,发现它有一个父类Class,在载入它之前JVM先会载入这个父类Class,这个父类Class是system classloader所能识别的,根据委托机制,它将由system classloader载入,然后我们的classloader再载入这个Class,创建一个实例,造型为这个父类Class,注意了,造型成这个父类 Class的时候(也就是上溯)是面向对象的java语言所允许的并且JVM也支持的,JVM就使用system classloader再次载入这个父类Class,然后将此实例造型为这个父类Class。大家可以从这个过程发现这个父类Class都是由 system classloader载入的,也就是同一个class loader载入的同一个Class,所以造型的时候不会出现任何异常。而根据多形性,调用这个父类的方法时,真正执行的是这个Class(非父类 Class)的覆盖了父类方法的方法。这些方法中也可以引用system classloader不能识别的Class,因为根据全盘负责原则,只要载入这个Class的classloader即我们自己定义的 classloader能够定位和载入这些Class就行了。

这样我们就可以事先定义好一组接口或者基类并放入CLASSPATH中,然后在执行的时候动态的载入实现或者继承了这些接口或基类的子类。还不明白吗?让我们来想一想Servlet吧,web application server能够载入任何继承了Servlet的Class并正确的执行它们,不管它实际的Class是什么,就是都把它们实例化成为一个Servlet Class,然后执行Servlet的init,doPost,doGet和destroy等方法的,而不管这个Servlet是从web- inf/lib和web-inf/classes下由system classloader的子classloader(即定制的classloader)动态载入。说了这么多希望大家都明白了。在applet,ejb等容器中,都是采用了这种机制.

对于以上各种情况,希望大家实际编写一些example来实验一下。

最后我再说点别的, classloader虽然称为类加载器,但并不意味着只能用来加载Class,我们还可以利用它也获得图片,音频文件等资源的URL,当然,这些资源必须在CLASSPATH中的jar类库中或目录下。我们来看API的doc中关于ClassLoader的两个寻找资源和Class的方法描述吧:
        public URL getResource(String name)
        用指定的名字来查找资源,一个资源是一些能够被class代码访问的在某种程度上依赖于代码位置的数据(图片,音频,文本等等)。
               一个资源的名字是以'/'号分隔确定资源的路径名的。
               这个方法将先请求parent classloader搜索资源,如果没有parent,则会在内置在虚拟机中的classloader(即bootstrap classloader)的路径中搜索。如果失败,这个方法将调用findResource(String)来寻找资源。
        public static URL getSystemResource(String name)
               从用来载入类的搜索路径中查找一个指定名字的资源。这个方法使用system class loader来定位资源。即相当于ClassLoader.getSystemClassLoader().getResource(name)。

例如:
   System.out.println(ClassLoader.getSystemResource("java/lang/String.class"));
的结果为:
   jar:文件:/C:/j2sdk1.4.1_01/jre/lib/rt.jar!/java/lang/String.class
表明String.class文件在rt.jar的java/lang目录中。
因此我们可以将图片等资源随同Class一同打包到jar类库中(当然,也可单独打包这些资源)并添加它们到class loader的搜索路径中,我们就可以无需关心这些资源的具体位置,让class loader来帮我们寻找了!

posted @ 2006-05-25 22:49 北国狼人的BloG 阅读(6484) | 评论 (6)编辑 收藏
     摘要: 面试经常问一些模棱两可的问题,也就是一些在一些条件成立时,才能给出确定答案的问题。比如问Java是否支持多继承。那么回答要缜密,接口支持,类不支持。多继承导致网状继承结构。  F            Fsoft          bed    softbedF这层的成员变量会在softbed会出现两份。所以在C++中采用虚继承来解决,达到了一种菱形结构。         Fsoft       ...  阅读全文
posted @ 2006-04-22 12:34 北国狼人的BloG 阅读(531) | 评论 (2)编辑 收藏

 
积极心态的力量之一:改变世界的力量

积极心态的力量之二:正确思考的力量

积极心态的力量之三:探索心理的力量

积极心态的力量之四:探索失败的力量

积极心态的力量之五:克服困难的力量

积极心态的力量之六:赢得幸福的力量

积极心态的力量之七:充满自信的力量

积极心态的力量之八:受人喜欢的力量

积极心态的力量之九:克服心理近视的力量

积极心态的力量之十:立即行动的力量

积极心态的力量之十一:激励自己和他人的力量

积极心态的力量之十二:吸引财富的力量

积极心态的力量之十三:投资理财的力量

积极心态的力量之十四:知足常乐的力量

积极心态的力量之十五:帮助他人的力量

积极心态的力量之十六:自我充电的力量

积极心态的力量之十七:健康长寿的力量

积极心态的力量之十八:克服心病的力量

积极心态的力量之十九:掌握至善的力量

积极心态的力量之二十:不屈不挠的力量

积极心态的力量之二十一:和平心态的力量

积极心态的力量之二十二:克服忙碌的力量

积极心态的力量之二十三:克服不安的力量

积极心态的力量之二十四:不知疲倦的力量

积极心态的力量之二十五:新奇想法的力量

世上唯一最重要的人只有一个——你自己!

我们往往把自己想象成什么样,就真的会成为什样子。

对于那些积极心态的人来说,每一种逆境都隐含着一种等量或更大的利益种子,有时你虽然身处逆境,说不定其中正隐藏着良机。

当你面临被别人误解的问题时,你必须首先从检查你自己开始。

相信有志者事竟成的人终将获得成功。

良好的想法紧跟以切实的行动,能把失败转变为成功。

播下一个行动,你将收获一种习惯;播下一种习惯,你将收获一种性格;播下一种性格,你将收获一种命运。

建功立业的秘诀就是:“立即行动”。

记住每天说句话:我健康!我快乐!我大有作为!

探索心理的力量:人的心理具有某种神秘的力量,要敢于探索这种心理力量;你的心理有两部分:有意识心理和下意识心理,二者相伴相随;你能用积极健康的暗示来帮助自己,也能阻止有害的、消极的暗示;学会使用适当的暗示区影响他人,学会应用正确的、有意识的自动暗示。做到了这两点,你就能在生理、心理和道德上获得健康、幸福与成功。

(一)保持积极的心态,并引导它为你的生活目标服务的话,你就能享受到良好的结果:1.为你带来成功环境和成功意识;2.生理和心理的健康;3.独立的经济;4.出于爱心而且能表达自我的工作;5.内心的平静;6.没有恐惧的自信心;7.长久的友谊;8.长寿而且平衡的生活;9.免于自我设限;10.了解自己和他人的智慧、长处。(二)如果你是抱一种消极的心态,工作和生活将会是另一种面貌:1.贫穷与凄惨的生活;2.生理和心理的疾病;3.自我设限——使你变得平庸;4.恐惧以及其它破坏性的结果;5.限制你帮助自己的方法;6.敌人多,朋友少;7.产生各种烦恼;8.成为所有负面影响的牺牲品;9.屈服于他人的意志;10.过着一种毫无意义的颓废生活。

如何培养积极心态:1.切断和你过去失败经验的所有关系,消除你脑海中的那些与积极心态背道而驰的所有不良因素;2.确定你需要的资源之后,便制定如何得到这些资源的计划,计划一定不要太过渡。记住,贪婪是使野心家失败的最主要因素;3.培养每天说或做一些使他人感到舒服的话或事;4.使你自己了解一点,打倒你的不是挫折,而是你面对挫折时所抱的心态;5.务必使自己养成精益求精的习惯,并以你的爱心和热情发挥这项习惯,努力把这种习惯变成一种嗜好;6.彻底盘点一次你的资产,你会发现你所拥有的最有价值的资产就是健全的思想;7.改掉你的坏习惯,连续一个月每天减少一项恶习,并在一周结束时反省一下成果;8.放弃想要控制别人的念头,转而把你的精力用来控制你自己;9.使自己多活动以保持自己的健康,生理上的疾病很容易造成心理上的失调;10.增加自己的耐性,并以开阔的心胸包容所有事物;11.把你的全部思想用来作你想做的事,而不要留半点思维空间给那些胡思乱想的念头;12.除非有人愿意以足够的证据证明他的建议具有一定的可靠性,否则别接受任何人的建议,你将会因谨慎而避免被误导,或被当成傻瓜;13.以相同或更多的价值回报给你好处的人。“报酬增加率”最后还会给你带来好处,而且可能会为你带来所有你应得到的东西的能力;14.对于善意的批评应采取接受的态度,而不应采取消极的反应,接受学习他人如何看待你的机会。别害怕批评,你应该勇敢的面对;15.避免任何具有负面意义的说话形态,尤其应根除吹毛求疵,闲言碎语、中伤他人名誉的行为;16.随时随地都表现出真实的自己,没有人会相信骗子;17.任何与你共事的人不值得你信任时,就表示你选错人了;18.…………

成功的17大原则:1.积极的心态;2.明确的目的;3.多走些路;4.正确的思考;5.自我控制;6.集体心理;7.具有信心;8.令人愉快的个性;9.富有首创的精神;10.充满热情;11.集中注意力;12.与他人协作;13.总结经验教训;14.创造性的见识;15.预算时间和金钱;16.保持身心健康;17.运用普遍规律的力量。

一个星期六的早晨,我要准备次日将要进行的讲道,妻子出去买东西了。那天在下雨,我的小儿子吵闹不休、令人讨厌。最后我在失望中拾起一本旧杂志,一页一页的翻阅,直到翻到一幅色彩鲜艳的大图画——一幅世界地图。我就从那本杂志上撕下这一页,再把它撕成碎片。丢在起居室的地上,对儿子说道:“小约翰,如果你能拼拢这些碎片,我就给你2角5分钱。”我以为这件事会使他打法掉上午的大部分时间。可是没过10分钟,就有人来敲门了,原来是我的儿子,他手里拿着一幅刚拼好的地图。我惊愕地看到约翰如此之快的拼好了一幅世界地图。“孩子,你怎样把这件事做的这样快?”我问道。“啊,”小约翰说,“这很容易。在另一方面有一个人的照片。我就照着这个人的照片拼到一起,然后把它翻过来。我想,如果这个人是正确的,那么这个世界也是正确的。”

posted @ 2006-04-21 14:35 北国狼人的BloG 阅读(606) | 评论 (1)编辑 收藏
     摘要: <% @ page contentType = " text/html;charset=gbk "  pageEncoding = " gbk "   %> ...  阅读全文
posted @ 2006-04-20 15:43 北国狼人的BloG 阅读(585) | 评论 (0)编辑 收藏
转:

今天试着把大虾写的系统登录模块加到我们现有的模块里来,他写的时候因为有些试验的成分,所以没有按照我们项目的配置来写,也没有按照我们的模块来划分配置,加过来以后重新配置了模块信息,结果居然无法正常运行。显示错误:“cannot retrieve action mapping  。废了九牛二虎之力,都无法解决。web.xml、struts-config、模块配置,一切看起来都无比的正常,但就是运行不了。真搞不清楚是哪里出了问题。还以为搞不定,晚上要加班了,谁知道,踏破铁鞋无觅处,柳暗花明又一村,在google上搜索关键字"action mapping 找不到",第一个链接居然就是问题的答案!(还从来没有只点一次就可以找到问题答案的经验,所以兴奋无比^O^)

        总的来说,问题的原因就在于,struts是在第一次收到对action的请求(注意:不包括jsp的请求)时,提取这个请求的url的路径信息,把相应模块的mapping信息设置到请求中去。如果在进入一个模块时,第一次访问的是一个jsp页面,而在这个jsp页面中提交到该模块的一个action,就会出现找不到action mapping的情况。这就是因为,在进到这个模块时,访问的是jsp,这个模块的任何一个action都没有被访问到,所以struts的ActionServlet还没有来得及把这个模块的mapping设置到请求中,自然找不到该模块的action。

        因此,这就引出一个约定,就是系统中尽量避免对Jsp的直接访问,如果要访问也要通过action来forward。虽然看起来麻烦一点,但是安全性、健壮性都会有所提高。

        关于以上提到的模块mapping的设置原理,具体的文章在这里(不长),值得收藏:

        原文链接:http://202.100.72.44/news/itschool/pro/pro44134.htm

posted @ 2006-04-19 18:27 北国狼人的BloG 阅读(3659) | 评论 (2)编辑 收藏
这类问题真是不容易,因为一般搞软件开发的,不会在自己上装一些不常见的字体。可是本人就是既精通Photoshop,又精通软件开发(Java)。

呵呵,让我郁闷了很多天,装不上 RSA。

看到有人因为装BEA WORKSHOP也出现莫名问题。给我了启示。

workshop fontmanager.dll 问题解决贴

http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=103&threadID=23679&messageID=173082

解决办法:

到控制面板,找到字体,找到文鼎字体,删之!

最后出现:

rsa.jpg

posted @ 2006-04-14 21:05 北国狼人的BloG 阅读(864) | 评论 (0)编辑 收藏

db2

 select * from recruit fetch first 5 rows only

经典oracle sql

select   *   from  ( select  newtable. * ,rownum rownum_  from  ( select   *   from  s_emp) newtable  where  rownum  <=   20 where  rownum_  >   5

rownum在用于大于号时,不可以,必须先造一个table把rownum这个伪列当作这个新造出的表中的一个字段,才能进行特定行之间的查询。



DML Data manipulation language
   insert update delete

DDL Data definition language
   create alter drop rename trancate

Transaction control
   commit rollback savepoint

DCL
   GRANT REVOKE

==========================

 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER(7)
 LAST_NAME                                 NOT NULL VARCHAR2(15)
 FIRST_NAME                                         VARCHAR2(15)
 USERID                                             VARCHAR2(8)
 START_DATE                                         DATE
 COMMENTS                                           VARCHAR2(15)
 MANAGER_ID                                         NUMBER(7)
 TITLE                                              VARCHAR2(20)
 DEPT_ID                                            NUMBER(7)
 SALARY                                             NUMBER(11,2)
 COMMISSION_PCT                                     NUMBER(4,2)

select last_name,salary, 12*salary + 100 from s_emp;

支持操作符

支持别名

select last_name ln from s_emp;

支持Concatenation,级联操作符

select first_name||last_name from s_emp


对于NULL值

select  last_name,title,salary * commission_pct / 100  COMM  from  s_emp;

这样查询会有很多NULL值

有一个NVL函数,以便在NULL出现时,给予一个默认值。

select  last_name,title, salary * NVL(commission_pct, 0 ) / 100  COMM  from  s_emp;

commission_pct,出现NULL,就会被0替换。

Eliminate duplicate rows by using distinct in select clause;

select   distinct  name  from  s_dept;


=============================================================

SQL> select name,salary,deptno from ( select concat(last_name,first_name) name,salary,department_id deptno,rank() over (partition by department_id order by salary desc) rnk from employees) where rnk = 2 or rnk = 3;

NAME                                              SALARY     DEPTNO
--------------------------------------------- ---------- ----------
FayPat                                              6000         20
KhooAlexander                                       3100         30
BaidaShelli                                         2900         30
WeissMatthew                                        8000         50
KauflingPayam                                       7900         50
ErnstBruce                                          6000         60
AustinDavid                                         4800         60
PataballaValli                                      4800         60
PartnersKaren                                      13500         80
ErrazurizAlberto                                   12000         80
KochharNeena                                       17000         90

NAME                                              SALARY     DEPTNO
--------------------------------------------- ---------- ----------
De HaanLex                                         17000         90
FavietDaniel                                        9000        100
ChenJohn                                            8200        100
GietzWilliam                                        8300        110

15 rows selected.

SQL>

SQL> desc employees;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 EMPLOYEE_ID                               NOT NULL NUMBER(6)
 FIRST_NAME                                         VARCHAR2(20)
 LAST_NAME                                 NOT NULL VARCHAR2(25)
 EMAIL                                     NOT NULL VARCHAR2(25)
 PHONE_NUMBER                                       VARCHAR2(20)
 HIRE_DATE                                 NOT NULL DATE
 JOB_ID                                    NOT NULL VARCHAR2(10)
 SALARY                                             NUMBER(8,2)
 COMMISSION_PCT                                     NUMBER(2,2)
 MANAGER_ID                                         NUMBER(6)
 DEPARTMENT_ID                                      NUMBER(4)

SQL 排名问题

找出部门工资排名第二,三的员工

=====================

复习一下外连接Outer Join

SQL> desc s_emp;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER(7)
 LAST_NAME                                 NOT NULL VARCHAR2(15)
 FIRST_NAME                                         VARCHAR2(15)
 USERID                                             VARCHAR2(8)
 START_DATE                                         DATE
 COMMENTS                                           VARCHAR2(15)
 MANAGER_ID                                         NUMBER(7)
 TITLE                                              VARCHAR2(20)
 DEPT_ID                                            NUMBER(7)
 SALARY                                             NUMBER(11,2)
 COMMISSION_PCT                                     NUMBER(4,2)

SQL> desc s_customer
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 NAME                                      NOT NULL VARCHAR2(25)
 ZIP_CODE                                           VARCHAR2(20)
 CREDIT_RA                                          VARCHAR2(25)
 SAL                                                NUMBER
 ID                                                 NUMBER(5)

客户表里的SAL字段是s_emp的外键。表示该客户的销售代表。

那么要想查出所有客户(包括没有销售代表的)所对应的销售代表记录。

  1  select e.last_name,e.id,c.name
  2  from s_emp e,s_customer c
  3  where e.id(+) = c.sal
  4* order by e.id

LAST_NAME               ID NAME
--------------- ---------- -------------------------
_dumas                  12 athletes attic
_dumas                  12 great athletes
_dumas                  12 bj athletics
_dumas                  12 athletic for all
_dumas                  12 sports,inc
                           athletics two
                           athletics one
                           shhes for sports
                           athletic attire
                           toms sporting goods

可以看到相应的部分客户并不存在销售代表也出现在结果集中,而用等值链接是不能查出的。

  1  select e.last_name,e.id,c.name
  2  from s_emp e,s_customer c
  3  where e.id = c.sal(+)
  4* order by e.id

查出所有销售代表所对应的客户。

LAST_NAME               ID NAME
--------------- ---------- -------------------------
_dumas                   8
hui                      8
aaa                     10
%ss                     11
_dumas                  11
_dumas                  12 sports,inc
_dumas                  12 athletic for all
_dumas                  12 bj athletics
_dumas                  12 great athletes
_dumas                  12 athletes attic
_dumas                  13

LAST_NAME               ID NAME
--------------- ---------- -------------------------
_dumas                  15
_dumas                  16
_dumas                  17
_dumas                  18
_dumas                  19
_dumas                  21
payn                    23
_dumas                  25
_dumas                  47
_dumas                  70
_dumas                  76

LAST_NAME               ID NAME
--------------- ---------- -------------------------
_dumas                  95
liganfeng              112
lgf                    122
lgf                    134
Biri                   333
qu                     555
_dumas                2271
tarena               25999
tarena               26999

空的旧更多了。

也就是哪边缺,哪边方加号。

这就是外连接。

posted @ 2006-03-30 23:46 北国狼人的BloG 阅读(548) | 评论 (0)编辑 收藏
Atomic Consistent  Isolated  Durable

An atomic database transaction is one which is guaranteed to complete successfully or not at all. If an error prevents a partially-performed transaction from proceeding to completion, it must be "backed out" to prevent the database being left in an inconsistent state.

ACID is an acronym used to describe the properties that a transaction should have in an enterprise environment. A transaction should be Atomic, and its results should be Consistent, Isolated, and Durable. A transaction is Atomic if it either completes itself or is completely undone. The results of a transaction should consistently change the system from one state to another, be isolated or independent of one another, and, once completed, be durable or permanent.

什么是事务

   事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。

   
   事务的结束有两种,当事务中的所以步骤全部成功执行时,事务提交。如果其中一个步骤失败,将发生回滚操作,撤消撤消之前到事务开始时的所以操作。



事务的ACID

事务具有四个特征:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持续性(Durability)。这四个特性简称为ACID特性。


    

1、原子性

    事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做

2、一致性

     事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。 

3、隔离性

    一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。

4、持续性

   也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。

事务的属性

   

一个事务的属性控制了事务的使用范围。EJBSpring以及.net下的事务属性都很类似的,事务属性有如下几种:


   Required:
      如果在一个事务中调用,就把该方法加到此事务中来,如果还没有启动事务,就启动一个新事务。

   RequiredNew:
不管当前有没有事务,都会启动一个新事务,如果当前有事务,会被挂起直到方法结束。

NotSupported:
不能在事务中执行此方法。如果有事务,将会被挂起直到方法结束。

Supports:
如果当前有事务,此方法会加到当前事务,如果没有,容器也不会启动新事务。

Mandatory:
必须在事务中调用此方法,否则抛出异常。

Never:
必须不在事务中调用此方法,否则抛出异常。


三.事务的回滚

CMT在以下两中情况下,事务将回滚。第一,如果产生一个系统异常,容器将自动回滚该事务。第二,通过调用EJBContext接口SetRollbackOnly方法,Bean方法通知容器回滚该事务。如果Bean抛出一个应用异常,事务将不会自动回滚,但可以调用SetRollbackOnly回滚。

五.隔离级别

事务不仅保证事务界限内的数据库操作全部完成(或回滚)同时还隔离数据库更新语句。隔离级别描述被修改的数据对其他事物的可见度。隔离级别的控制会跟具体的DBMS厂商不同而不同。

     隔离级别与并发性是互为矛盾的:隔离程度越高,数据库的并发性越差;隔离程度越低,数据库的并发性越好。

通过一些现象,可以反映出隔离级别的效果。这些现象有:

l         更新丢失(lost update):当系统允许两个事务同时更新同一数据是,发生更新丢失。

l         脏读(dirty read):当一个事务读取另一个事务尚未提交的修改时,产生脏读。

l         非重复读(nonrepeatable read):同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。

l         幻像读(phantom read):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻像读。

 

SQL-99 标准定义了下列隔离级别:

l         未提交读(read uncommitted)(隔离事务的最低级别,只能保证不读取物理上损坏的数据)

l         已提交读(read committed)(数据库引擎 的默认级别)当一个事务运行在这个隔离级别时,一个 SELECT 查询只能看到查询开始之前提交的数据,而永远无法看到未提交的数据,或者是在查询执行时其他并行的事务提交做的改变。

l         可重复读(repeatable read),不会脏读和非重复读,可能发生幻像读

l         可序列化(serializable)(隔离事务的最高级别,事务之间完全隔离)

posted @ 2006-03-28 23:30 北国狼人的BloG 阅读(320) | 评论 (0)编辑 收藏
启动Weblogic服务器,由于JMS,需要一个消息中间件,Tuxedo。本文使用的是WebLogic 9.1,与8.1的有所不同。

登录

logon.jpg

创建JMS servers

server.jpg


设置完JMS服务器以后,要设置JMS的Modules,以便JMS客户端和接受端能查找相应的JMSFactory和JMSdestination。

module.jpg


C:\bea\user_projects\domains\base_domain\config\jms

会出现配置相关的配置文件

建立两个资源

一个是ConnectionFactory,配置一个JNDI。

另外一个是Queue-0,配置一个JNDI。

resource.jpg

import javax.jms.*;
import java.util.Hashtable;
import javax.naming.*;
import java.io.*;

public class QueueSend
{
    
    
public static void main(String[] args) throws Exception
    
{
        Hashtable hash 
= new Hashtable();
        hash.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
        hash.put(Context.PROVIDER_URL,
"t3://localhost:7001");
        
        InitialContext ic 
= new InitialContext(hash);
        
        
//找工厂
        QueueConnectionFactory factory = (QueueConnectionFactory)ic.lookup("jms/factory");
        
        System.out.println(factory.getClass());
        
        
        
//找文件夹,也就是目的地
        Queue queue = (Queue)ic.lookup("queue");
        
        System.out.println(queue.getClass());
        
        
        
//查API,接口有什么方法阿        
        QueueConnection conn = (QueueConnection)factory.createQueueConnection();
        
        
        
//消息的接受者,是否给消息中间件回复,否则重复发送。第二参数使用自动确认
        QueueSession session = conn.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);
        
        
//根据目的地,确定发送者
        QueueSender sender = session.createSender(queue);
        
        
        
//Message的创建要使用Session
        
        BufferedReader buffer 
= new BufferedReader(new InputStreamReader(System.in));
        
        
while(true)
        
{
            String line 
= buffer.readLine();
            
if(line.equals("quit"))
            
{
                TextMessage message 
= session.createTextMessage("over");
                sender.send(message);         
                
break;                
            }

            TextMessage message 
= session.createTextMessage(line);
            sender.send(message);         
        }

        
              
        
    }



}


察看一下Queue资源,就能看到自己发送的TextMessage。

下回分解MDB。
posted @ 2006-03-25 21:34 北国狼人的BloG 阅读(412) | 评论 (0)编辑 收藏
为了解决RMI无法解决的分布式事务控制,安全,并发等问题。

EJB解决访问就是一种可以高校的开发分布式应用的解决方案。

编写EJB,其实只需要编写2个接口和一个Bean类,和一个部属描述就可以了。

服务接口:

import javax.ejb.*;
import java.rmi.*;
//business   remote
public interface Compute extends EJBObject{
    
public double add(double a,double b) throws RemoteException;
}


Home接口:

import javax.ejb.*;
import java.rmi.*;

public interface ComputeHome extends EJBHome{
    
public Compute create() throws RemoteException,CreateException;
}

Bean,业务逻辑实现的地方

import javax.ejb.*;

public class ComputeBean implements SessionBean
{
    
public void setSessionContext(SessionContext ctx)
                       
throws EJBException,
                              java.rmi.RemoteException
{
    }

    
public void ejbRemove()
               
throws EJBException,
                      java.rmi.RemoteException
{
    }

    
public void ejbActivate()
                 
throws EJBException,
                        java.rmi.RemoteException
{
    }

    
public void ejbPassivate()
                  
throws EJBException,
                         java.rmi.RemoteException
{
    }

    
public void ejbCreate() throws CreateException{
    }

    
public double add(double a,double b){
        
return a*b;
    }

}


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar>
    
<enterprise-beans>
        
<session>
            
<display-name>Compute</display-name>
            
<ejb-name>abc</ejb-name>

            
<home>ComputeHome</home>
            
<remote>Compute</remote>
            
<ejb-class>ComputeBean</ejb-class>

            
<session-type>Stateless</session-type>
            
<transaction-type>Container</transaction-type>     
        
</session>
    
</enterprise-beans>
    
<assembly-descriptor>
        
<container-transaction>
            
<method>
                
<ejb-name>abc</ejb-name>
                
<method-name>*</method-name>
            
</method>
            
<trans-attribute>Required</trans-attribute>
        
</container-transaction>
        
    
</assembly-descriptor>
</ejb-jar>

JNDI的实现各个服务器的实现不同,所以需要依赖于服务器的一个xml。

JNDI也是一种面向接口编程,工厂模式的典范。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE weblogic-ejb-jar PUBLIC '-//BEA Systems, Inc.//DTD WebLogic 8.1.0 EJB//EN' 'http://www.bea.com/servers/wls810/dtd/weblogic-ejb-jar.dtd'>
<weblogic-ejb-jar>
    
<weblogic-enterprise-bean>
        
<ejb-name>abc</ejb-name>        
        
<jndi-name>efg</jndi-name>
    
</weblogic-enterprise-bean>
</weblogic-ejb-jar>


想编译EJB,需要j2ee jar,那就用\bea\weblogic81\server\lib\weblogic.jar

做一个META-INF放置两个xml文件

jar -cvf Compute.jar *.class META-INF/*.xml

c创建,v看到它创建的过程,f文件名



部属EJB,看看Weblogic帮助吧。

=============================

那么会发现jar文件中并没有出现_stub或者_skeleton文件阿,那是因为由容器在运行EJB时动态创建在容器内部了。

那么怎么才能看到呢?我们要分析阿。

java weblogic.appc ejb.jar

如果抱错,在classpath中添加\jdk142_04\lib\tools.jar

如果想看原文件的话,就是-keepgenerated

rmi2.jpg

===============================

开始分析EJB工作原理

看下面一张图,就清楚了,实际就是两次RMI 调用。

27229257.ejb2.jpg

要细致来说。

基本是这样的。

定义Home接口,主要是为让客户端有可能在创建EJB Bean对象时,给予初始化。

import javax.ejb.*;
import java.rmi.*;

public interface ComputeHome extends EJBHome{
    
public Compute create() throws RemoteException,CreateException;
}


这只是一个接口,weblogic.appc会生成一个HomeImpl,并生成Stub和Skeleton对象。在客户端JNDI查找时,返回就是这个HomeImpl的Stub对象,注意类文件也会动态下载的。

create()与ejbcreate()方法是对应的。

可有参数。

//Bean

   
public void ejbCreate(String param) throws CreateException {
        
// TODO Auto-generated method stub
        this.userName = param;
    }



//Home

public com.infogo.interfaces.Shopping create(java.lang.String param)
      
throws javax.ejb.CreateException,java.rmi.RemoteException;

===========

那么客户端实际调用的是HomeImpl的Stub对象的方法,通过网络传送到服务器上的Skeleton,Skeleton再调用真正的HomeImpl对象的方法,创建一个创建Bean对象放入实例池,Impl调用Bean的ejbcreate方法,初始化参数。

并且HomeImpl,还要创建一个业务业务接口的实现类,并把业务接口实现类(EOImpl)对象的Stub返回给客户端。

客户端拿到Stub,调用响应服务方法(别忘了,真正的服务方法实现可是在Bean类里),所以调用Stub方法,通过网络传递EOImpl的Skeleton对象,然后调用EOImpl的响应方法。

这是注意,EOImpl被称为请求拦截器,因为它会在这时察看ejb-jar.xml,看一看方法声明的事务类型,并调用容器提供的API(安全、事务等)。所以这种服务器或者容器叫做隐式容器,它有工具生成的类来调用容器相关API。而不是用户直接调用。

在EOImpl调用完容器API之后,就会调用Bean的业务方法。

最后将接口-Skeleton-Stub-客户端。

所以是两次RMI调用。

这就是EJB工作原理。

import javax.naming.*;
import java.util.*;
import javax.rmi.*;


public class Client
{
    
public static void main(String[] args) throws Exception
    
{
        Hashtable hash 
= new Hashtable();
        hash.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
        hash.put(Context.PROVIDER_URL,
"t3://localhost:7001");
        InitialContext ic 
= new InitialContext(hash);
        
        ComputeHome home 
= (ComputeHome)ic.lookup("efg");
        
        
//(ComputeHome)ProtableRemoteObject.narrow(ic.lookup("efg"),ComputeHome.class);
       /*
        * 客户端从服务器获得HomeImpl_stub .class文件,并获得HomeImpl_stub的对象
        * 
        * home.create()-->HomeImpl_stub.create()-->网络发送-->HomeImpl_skel.create()-->HomeImpl创建ComputeBean对象-->ComputeBean.ejbcreate()&&HomeImpl还要创建EOImpl_stub对象,返回HomeImpl_skel--->[网络往回传输]--->HomeImpl_stub--->客户端拿到EOImpl_stub对象。
        *
        * 这时完成了第一次rmi
        *
        * c获得了EOImpl_Stub对象,
        * 
        * c.add(32,32)----> EOImpl_Stub.add()--->网络发送--->EOImpl_Skel.add()--->EOImpl--->[根据xml描述的事务,进行事务描述]--->判断add方法是否开始事务--->调用创建好Bean对象的add方法---->方法结果给EOImpl_Skel---->网络往回传输---->EOImpl_Stub----客户端拿到结果。
        *
        * 第二次rmi完成。
        
*/

        
        
        
        Compute c 
= home.create();
        System.out.println(c.add(
32,32));
        
    }
   
}
posted @ 2006-03-19 23:45 北国狼人的BloG 阅读(967) | 评论 (0)编辑 收藏
简单来说,要实现A机器上JVM上运行的Java程序,远程调用B机器上JVM上的Java程序,计算完毕,返回给A机器。

在没有RMI的情况下,我们使用普通的网络传输技术能完成么?当然,两种选择,Socket直接通讯,将参数传给B,B在通过Socket返还给调用者。或者通过Servlet也可以远程调用阿。

那么这样解决问题时没有问题,但对于A和B来说,代码量、程序复用程序、维护性都不会太理想。

如果能让调用者不知道网络操作,实现对于用户透明,也就是像调用本地一样,对象名.方法名。

那么就是RMI规范涉及到一些接口。

面向接口的编程方式,就可以达到代码的实现与声明分离。

这样用户就只关心接口了。很多细节让遵守规范(也就是一些编写好的工具)的实现类去完成吧。[就是Stub和Skeleton]

那么就先定一个用户A要知道怎么用,B要知道方法签名完成实现,的同一接口吧。

import java.rmi.*;

public interface Compute extends Remote{
    
    
public double add(double a,double b) throws RemoteException;
    
}

两点要求

1,继承标记接口Remote。

identify interfaces whose methods may be invoked from a non-local virtual machine.

标识该接口可以被非本地VM调用呗。

2,里面每个方法都要抛出RemoteException


业务接口的实现类,也就是做实事的类

import java.rmi.server.*;
import java.rmi.*;

public class ComputeImpl extends UnicastRemoteObject implements Compute
{
    
//要在构造方法抛出异常
    public ComputeImpl() throws RemoteException{}
    
    
public double add(double a,double b){
        
return a+b;
    }

}


=====================
javac *.class

rmic -keep ComputeImpl
带参数,可以保留Stub和Skeleton源码。

通过ComputeImpl的实现类来生成负责通讯的Stub(存根)和Skeleton(框架)

======================

那么就是要把这个对象绑定到一个端口上。

以便别人来使用

编写一个Server

import java.rmi.*;

public class Server
{

    
public static void main(String[] args) throws Exception
    
{
        ComputeImpl c 
= new ComputeImpl();
        Naming.bind(
"rmi://localhost:8888/compute",c);//compute别名
    }


}

客户端

import java.rmi.*;

public class Client
{
    
public static void main(String[] args) throws Exception
    
{
        Compute c 
= (Compute)Naming.lookup("rmi://localhost:8888/compute");//rmiregistry首先响应
        
//实际c是Stub对象
        System.out.println(c.getClass());
        System.out.println(c.add(
12.3,34));
    }
   
}


 看到没有,客户端通过rmi协议到服务器上寻找/compute资源对象。那个Naming是RMI专用,不是JNDI。

那么Server类并没有负责监听阿。

哦,最后有一个强大的工具在JAVA_HOME/bin/下,叫做rmiregistry,专门负责监听固定端口上,rmi协议的请求。

=================
rmiregistry 8888

=================

启动Server,绑定远程对象阿

java Server

=================

启动一个Client,调用一下

java Client

=================

rmi.jpg

===============

另外一些小问题

由于rmiregistry 工具的不断强大,jdk1.4已经可以不再使用skeleton,到1.5,根本就不生成skeleton了。

rmiregistry可以充当skeleton角色完成功能。

记住EJB中,还不行,因为没有rmiregistry工具了。呵呵,明白了?

=========================

所以什么呢,RMI就是一种代理模式的应用Stub,就是实际实现类的客户代理。

但需要统一的接口,才能对于用户、调用者透明啊!

------------------------


我说的比较通俗。还有很多深刻的东西。
posted @ 2006-03-19 22:42 北国狼人的BloG 阅读(1330) | 评论 (0)编辑 收藏
     摘要: public   class  ValidatorPlugIn     implements  PlugIn {.     public  String getPathnames()     ...  阅读全文
posted @ 2006-03-12 18:14 北国狼人的BloG 阅读(1532) | 评论 (1)编辑 收藏

^

输入或行的起始部分。

^T 匹配"This good earth"中的"T",但与"Uncle Tom's Cabin"中的"T"不匹配

$

输入或行的结尾部分。

h$ 匹配"teach"中的"h",但与"teacher"中的"h"不匹配

*

0 个或多个前置字符。

um* 匹配"rum"中的"um"、"yummy"中的"umm"和"huge"中的"u"

+

1 个或多个前置字符。

um+ 匹配"rum"中的"um"和"yummy"中的"umm",但在"huge"中没有任何匹配项

?

前置字符最多出现一次(即,指示前置字符是可选的)。

st?on 匹配"Johnson"中的"son"和"Johnston"中的"ston",但在"Appleton"或"tension"中没有任何匹配项

.

除换行符外的任何单字符。

.an 匹配短语"bran muffins can be tasty"中的"ran"和"can"

x|y

x 或 y。

FF0000|0000FF 匹配 bgcolor="#FF0000" 中的"FF0000"和 font color="#0000FF" 中的"0000FF"

{n}

恰好 n 个前置字符。

o{2} 匹配"loom"中的"oo"和"mooooo"中前两个"o",但在"money"中没有任何匹配项

{n,m}

至少 n 个、至多 m 个前置字符。

F{2,4} 匹配"#FF0000"中的"FF"和"#FFFFFF"中的前四个"F"

[abc]

用括号括起来的字符中的任何一个字符。用连字符指定某一范围的字符(例如,[a-f] 等效于 [abcdef])。

[e-g] 匹配"bed"中的"e"、"folly"中的"f"和"guard"中的"g"

[^abc]

未在括号中括起来的任何字符。用连字符指定某一范围的字符(例如,[^a-f] 等效于[^abcdef])。

[^aeiou] 最初匹配"orange"中的"r"、"book"中的"b"和"eek!"中的"k"

\b

词边界(例如空格或回车符)。

\bb 匹配"book"中的"b",但在"goober"或"snob"中没有任何匹配项

\B

词边界之外的任何内容。

\Bb 匹配"goober"中的"b",但在"book"中没有任何匹配项

\d

任何数字字符。等效于 [0-9]。

\d 匹配"C3PO"中的"3"和"apartment 2G"中的"2"

\D

任何非数字字符。等效于 [^0-9]。

\D 匹配"900S"中的"S"和"Q45"中的"Q"

\f

换页符。

 

\n

换行符。

 

\r

回车符。

 

\s

任何单个空白字符,包括空格、制表符、换页符或换行符。

\sbook 匹配"blue book"中的"book",但在"notebook"中没有任何匹配项

\S

任何单个非空白字符。

\Sbook 匹配"notebook"中的"book",但在"blue book"中没有任何匹配项

\t

制表符。

 

\w

任何字母数字字符,包括下划线。等效于 [A-Za-z0-9_]。

b\w* 匹配"the barking dog"中的"barking"和"the big black dog"中的"big"和"black"

\W

任何非字母数字字符。等效于 [^A-Za-z0-9_]。

\W 匹配"Jake&Mattie"中的"&"和"100%"中的"%"


<script>
    
    function testfn(str)
    
{
        var ex 
= "^\\w+$";
        var re 
= new RegExp(ex,"i");
        alert(re.test(str));
    }

</script>

<script>
testfn(
"dfda");
testfn(
"123");
testfn(
",");
testfn(
".");
testfn(
"123.3");
</script>

自己试验一下

实际应用,Email验证
<script>
    function testmail(str)
    
{
        var ex 
= "^\\w+@[\\w]+\\.+[a-z]{2,3}$";
        var re 
= new RegExp(ex,"i");
        alert(re.test(str));   
    }

</script>

<script>
testmail(
"aacom@fda.com");
</script>

注意.的转义处理,因为.本身在正则表达式中有含义,代表非换行的单个字符

而我们想要的是.的实际标点


<script>
    function spliturl(str)
    
{
        var ex 
= "\\w{3}\.\\w+\.\\w{2,3}\\.\\w{2,3}";
        var re 
= new RegExp(ex);
        var arr 
= re.exec(str);
        alert(arr[
0]);
    }

</script>

<script>
spliturl(
"www.itnow.com.cn");
</script>


 

<script>
    function spliturl(str)
    
{
        var ex 
= "(\\w{3})\.(\\w+)\.(\\w{2,3})\\.(\\w{2,3})";
        var re 
= new RegExp(ex);
        var arr 
= re.exec(str);
        alert(arr);
        alert(RegExp.$
1);
        alert(RegExp.$
2);
    }

</script>

<script>
spliturl(
"www.itnow.com.cn");
</script>


加了小括号就是定义了一个变量,可以使用,js中保存在RegExg.$1 ---- RegExg.$9中
posted @ 2006-03-11 13:23 北国狼人的BloG 阅读(287) | 评论 (0)编辑 收藏
准备使用IBM收购Rational以后的最新产品RSA 6.0,作为开发建模工具。

人写程序与类在打交道,而在程序运行时,是对象在运行。

人写的是类型,而动态的是对象,使机器在运行代码。

OO是一种系统建模的技术,是一个过程!

对对象进行描述。

在这个过程中,要使用UML语言进行类型的描述。

========================================

比如模拟达内,可以说有很多老师对象和学生对象,但在达内,关注学生这个个体什么呢?只关心姓名,性别,背景,而绝对不关心它的婚姻情况。

可以对这些对象进行共性的提取,变为老师类型和学生类型。而运行时就是一个个有特性的实例。

========================================

什么是对象,就是一个属性确定的实体。比如找对象,这个对象在你心中早就有特定的要求,那么这样的一个对象肯定是有确定属性的对象。是单个的,唯一的,识别的实体。

那么由于成员变量的值不同,方法调用的结果不同。

所以对象是构建系统的基石。
它包括:<1>标识也就是引用名
             <2>数据
             <3>方法

什么是Class,它是对对象的定义。对于在某一个环境下的对于对象关心属性的提取和抽象。

====================================

面向对象编程的特点

1抽象,就是一个提炼过程
2封装,隐藏细节(属性和私有方法)
3继承,上下层次
4多态
--------------------------------------------
5,关联,对象的依赖程度
6,聚合
7,组合
8,内聚&耦合

1,抽象的目的,主要是隐藏细节,可以简化信息,看到显著特征。
2,封装的目的,隐藏数据和行为,
      
                  注意,类有两个视图,对外视图(别人使用此类,不关心实现)
                                                         内视图(自己拿着代码,要知道实现)

3,关联
            一个类型使用其他类型对象的服务。
4,聚合
            一种强关联,一个是另外一个的组成部分,而不是必要部分。
            一个汽车和一个音响。
5,组合
            一个对象包含另外一个对象
            一个是另外一个组成部分
            大的东西决定着组成部分的生命周期

6,继承,是一种实现代码复用的手段,语言的特性。另外一种代码复用的方式就是组合。

      减少代码量,维护方便。


组件的开发

在开发过程中,要遵循高内聚,低耦合的规律。

组件内部要相互的调用,来统一对外实现一个功能,而外界为实现这个功能,基本不需要再做什么,那么这个组件的重用性,就愈高。依赖于别人的越少,那么组件的复用价值也就愈高。


多态

有统一的接口,而行为有它的子类型的行为确定。

运行时多态,就是子类型重写了父类型virtual方法。

能使用编译时多态就是用编译时多态。

================

所以可以将上面的几个特点按类别分类,比如,单个类型、类型之间、层次结构、编程规则。





posted @ 2006-02-28 23:57 北国狼人的BloG 阅读(550) | 评论 (1)编辑 收藏
     摘要: 在继承于HttpServlet,进行实际的HTTP开发中,可以获得很多来自父类功能的封装。来自于GenericServlet的部分函数getInitParameter(java.lang.String name)相当于ServletConfig.getInitParameter(String name)。public ServletConfig getServletConfig()拿到S...  阅读全文
posted @ 2006-02-25 22:11 北国狼人的BloG 阅读(249) | 评论 (0)编辑 收藏
     摘要: 容器就是负责运行和销毁servlet的一组类的程序,一组代码的运行环境。为了开发方便,可以从javax.servlet.GenericServlet 继承实现主要业务方法。注意几点,1.有一个无参数的init()方法,是GenericServlet实现的,它不是Servlet接口中的方法,所以不会由容器调用,而是因为GenericServlet本身已经覆盖了带参数的init方法,并且在方法的最后调...  阅读全文
posted @ 2006-02-11 12:10 北国狼人的BloG 阅读(439) | 评论 (0)编辑 收藏

javax.servlet
Interface Servlet

是规范的接口,为了深入了解Servlet原理,要实际开发一个实现该接口的类,来作为第一个Servlet。

public void init(ServletConfig config)
          throws ServletException

这个方法,是由容器在实例化一个Servlet实例后,确切会调用该方法一次。通过判断是否抛出异常来确认Servlet是否被正确初始化。

public void service(ServletRequest req,
                    ServletResponse res)
             throws ServletException,
                    java.io.IOException

这个方法,是我们实现业务逻辑的方法,req和res就是由Web服务器对于请求和相应的有效封装。

没有什么神秘的,java网络编程中,ServerSocket的accept方法返回之后,会获得相应的一个Socket对象,通过该对象可以进而获得对应客户端的输入流和输出流。在对其进行封装就进而到Request和Response对象。

传入service方法,req可以获得请求的头部信息,res.getWriter,获得一个输出,进行输出信息,作为真正响应。

public void destroy()

 This method is only called once all threads within the servlet's service method have exited or after a timeout period has passed.

只有在service方法运行完,或者一个timeout后,会被调用。

After the servlet container calls this method, it will not call the service method again on this servlet.

一旦调用它,就不会再提供服务。

public ServletConfig getServletConfig()

返回传入init方法的那个ServletConfig,也就是服务器的ServletConfig。这个方法主要为了其他实例来使用ServletConfig实例。

public java.lang.String getServletInfo()

好比普通的toString()方法,返回注册信息。


编译注意事项:

要在环境变量的classpath中将servlet-api.jar的路径加上,这样编译才能通过。

所以最好先准备好tomcat服务器,以便利用它内置的jar文件。

D:\jakarta-tomcat-5.0.19\common\lib\servlet-api.jar

======================================

编译好后,是一个带包结构的.class文件目录层次。

如何部署呢?

很简单,在D:\jakarta-tomcat-5.0.19\webapps中建立一个自己的应用文件夹,例如:imshark

这时就可以将静态网页放入该文件夹了,然后要按照java web 应用的规范,建立一个WEB-INF的文件夹,然后里面放置一个标准的web.xml文件,就可以访问了。

web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version
="2.4">
    

</web-app>


然后部署servlet,在WEB-INF文件夹中,建立一个classes的目录,然后,将带目录结构的.class文件放入该文件夹,然后修改web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version
="2.4">
    
     
<servlet>
        
<servlet-name>TimeServlet</servlet-name>
        
<servlet-class>imshark.servlet.basic.TimeServlet</servlet-class>
    
</servlet>
    
     
<servlet-mapping>
        
<servlet-name>TimeServlet</servlet-name>
        
<url-pattern>/getTime.jsp</url-pattern>
    
</servlet-mapping>

</web-app>

1.gif

http://localhost:8080/imshark/getTime.jsp

所以可看出getTime.jsp是一个虚拟的路径地址,并不实际存在,完全有web.xml构造的。

以上就是最基本的Servlet的知识点。

posted @ 2006-02-09 00:01 北国狼人的BloG 阅读(1725) | 评论 (0)编辑 收藏

环境变量,在程序中获取。

shell命令,env 命令 (whereis ps which ps)

env|grep JAVA

程序中获取环境变量

#include <iostream>
using namespace std;

int main(int argc,char** argv, char** env)
{
        
while(env&&*env){
                cout 
<< *env << endl;
                
++env;
        }

        
return 0;
}


c++,一个字符串数组,以char**的指针代表的。

Untitled-1.gif
所以遍历时,既要判断env指向的指针数组是否为空,也要判断*env是不是到末端。

=======================================

Unix 系统调用函数,getenv。

man getenv (或者man -k getenv    man -a getenv)

SYNOPSIS
     #include <stdlib.h>

     char *getenv(const char *name);

得到函数原型和需要包含的头文件。

RETURN VALUES
     If successful, getenv() returns a pointer to  the  value  in
     the  current  environment;  otherwise,  it  returns  a  null
     pointer.

#include <stdlib.h>
#include 
<iostream>

using namespace std;

int main()
{
        
char javahome[200];
        strcpy(javahome,getenv(
"JAVA_HOME"));
        cout 
<< javahome << endl;
        
return 0;
}

int putenv(const char* str); 成功返回0;

在程序中添加和修改的环境变量只对本进程起作用。

Untitled2.gif
代码栈,存储着函数调用的入口地址,通过pstack命令可以查看相应函数调用关系,也就是代码栈。

openlab.tarena.ca% pstack 3212
3212:   ljlserver
 ff198958 accept   (0, ffbefad8, ffbefad4, 1)
 00010e74 main     (1, ffbefb84, ffbefb8c, 216c4, 0, 0) + 348
 000109f4 _start   (0, 0, 0, 0, 0, 0) + 5c

Unix每个进程的启动都回调用_start,然后向main传入参数,在main调用前,env环境变量就已经拷贝到进程空间中了。_start负责提供前提条件。

posted @ 2006-02-05 21:41 北国狼人的BloG 阅读(398) | 评论 (0)编辑 收藏
     摘要: 我这天,开发网络连接程序,遇到n多问题,都得以解决。总结一下。首先是环境。我用的开发SDK和模拟器都是Sun的,J2ME Wireless Toolkit 2.2现在UltraEdit下面写一个网络程序。注意一定要在网络连接动作时,另外启动一下线程,否则模拟器运行会有错误。很不好的代码:不要使用!!!!!!!!!! import java.io.InputStream;import&n...  阅读全文
posted @ 2006-02-05 13:28 北国狼人的BloG 阅读(4973) | 评论 (0)编辑 收藏

局部变量,块内的变量(函数为最大的块)

全局变量在所有函数之外(函数都可用)

内存:

   代码区      数据区

   栈为局部变量
   堆区为动态分配
   全局数据区,静态数据区
   常量区,主要是字面量,内存为只读的。

函数的形参,可以给默认值

可以为形参指定默认值(从右向左),调用时可以不用传递参数。

fact(int n,int m = 1);

但是不能跳跃传递参数,二义性!

enum Sex{
  MALE,FEMALE
}

void disp(char* name, Sex gender = MALE);

函数声明中指定了默认值,不能在定义时,再指定默认值,但可以追加默认值。

fact(int , int  =1);  这样声明没问题。

内联函数,提高程序运行效率,调用函数时,不是调用,而是搬一份到调用处,不用进行真正函数调用,所以无开辟栈的开销。

会增加代码的长度

如果函数很复杂,不能成为内联函数。不支持控制结果。

规定1,必须先定义,不支持函数原形。
因为搬函数代码时,是在编译过程中进行的。

比较  调用开销 VS 执行开销,来判断是否使用内联函数,对于很简单的函数值得内联。

2.是否能成为内联函数完全有编译程序决定

3.不支持控制结构。

#include <iostream>
using namespace std;
inline 
int isnumber(char ch)
{
       
return ((ch >= '0' && ch <='9')? 1:0);       
}
 

int main()
{
    
char in
    
while(true)
        cout 
<< "please input a char:(input q to exit) >";
        
in = cin.get();
        
if(isnumber(in))
        
{
              cout 
<< "you input is num " << in - '0' << endl;                 
        }

        
else
        
{
              
if(in == 'q')
                    
break
              cout 
<< "you input is not num " << endl;     
        }
 
        cin.ignore(
100,'\n'); 
    }
 
    cout 
<< "please input any key to exit" << endl; 
    cin.
get(); 
    cin.
get(); 
    
return 0;    
}

 

递归函数

一个函数自己调用自己,不管问题多复杂,只要把问题简化为最简单的形式。

递归函数不可能是内联函数

效率,递归 < 循环 < 公式

任何递归都可以改为非递归,需要用到栈,代码就很看懂了。改后,不一定提高效率。因为递归本身就是去开辟栈完成的。为何不保留代码可读性呢。

唯一条件,递归必须存在一个必须满足的条件,以结束推出。

菲波那契数列,求对应位置的值

头文件

#ifndef FIB_H
#define FIB_H 
double fib( int );
double fi( int );
#endif

函数定义文件,递归

double fib( int n )
{
    
if( n<1 )
        
return 0;
    
if( n<3 )
        
return 1;
    
return fib( n-1 ) + fib( n-2 );
}


double fi( int n )
{
    
if( n<1 )
        
return 0;
    
if( n<3 )
        
return 1;
    
double d,d1,d2;
    d1
=1;
    d2
=1;
    
forint i=3;i<=n;i++ ){
        d
=d1+d2;
        d1
=d2;
        d2
=d;
    }

    
return d;
}


主函数文件

#include <iostream>
using namespace std;
#include 
"fib.h"

int main()
{
    cout
<<"please input item no.:";
    
int n;
    cin
>>n;
    cout
<<"item "<<n<<" is "<<fi(n)<<endl;
    
return 0;
}



posted @ 2006-02-04 23:35 北国狼人的BloG 阅读(521) | 评论 (0)编辑 收藏
     摘要: 某些接口的实现类,我们要做一个代理,来代理对这些实现类对象的方法调用。 public class SomeClassImpl {  private String userName;    public SomeClassImpl(final String u...  阅读全文
posted @ 2006-01-30 18:27 北国狼人的BloG 阅读(2022) | 评论 (0)编辑 收藏
char -128~127     无符号:0~255
int
short -32768~32767        无符号:0~65535
long -2G~2G            无符号:0~4G-1

有其他修饰符时,int可以省略,short = short int  long = long int,signed = signed int,unsigned = unsigned int。

float     +/- 3.4*10E38
double     +/- 1.7*10E308
long double    +/-1.1*10E4932

常量定义,必须初始化。

整数型,数据超出后,会发生回绕,char     127+1 => -128了。

==============================

正数与负数转换,别忘了是取反加1,

有符号正数:00000111
负数,全部取反+1
<1>11111000
<2>11111001

正数0:00000000(正0)
<1>取反:11111111
<2>加一,进位,还要保留符号位,所以是10000000,即为-128

==============================

#include <iostream>
using namespace std;
int main()
{
    cout
<<"please input a number:";
    
int i,num;
    cin
>>num;
    
int mask=0x80000000;
    cout
<<"binary is ";
    
for( i=0; i<32; i++ ){
        
if( (i&3)==0 )
            cout
<<' ';
        cout
<<(mask&num?'1':'0');
        num
<<=1;
    }

    cout
<<endl;
    
return 0;
}



整型包括:char,unsigned/signed [int/short int/long int],enum,枚举项。

C++运算符,优先级顺序

() []
. -> .* ->* ::
! ~ ++ -- + -
& sizeof
* / %
+ -
<< >>
< > <= >=
== !=
&
^
|
&&
||
?:
=    +=    -=    *=   /=   %=       << =    >>=     &=    |=    ^=
,

由上到下,级别越低。

单目,赋值,条件  ,从右向左结合,其他从左向右

==============================================

函数与多文件结构

函数是把若干语句组合在一起完成某一个功能。

组成:参数(条件) (结果)返回值

形参和实参

void disp(char str[])形参
{
      cout << str << endl;
}
disp(name);实参


函数声明可以和函数定义分开,函数声明在使用的地方,可以有多处,定义只有一处。

float average(int ,int)

编译只做语法检查,链接才真正去找函数的定义,主要从标准库、当前文件中。

当一个项目包含多个文件时,需要一起编译。

头文件包含一些简短声明,不要有代码,以避免重复。

#ifndef __STU_H_
#define __STU_H_
函数声明
类定义
结构定义
宏定义
#endif

函数的工作原理与栈。

1,参数从后向前将实参压入栈
2,依次传递给形参

返回不确定,可以通过寄存器,也可以通过栈。

函数的局部变量一定在栈中分配空间。并且一定要初始化再使用。因为C++是不会清理空间的值的(Java的方法中的变量一定是先赋值,再使用,同理)

posted @ 2006-01-15 17:13 北国狼人的BloG 阅读(283) | 评论 (0)编辑 收藏

人的颈椎上连头颅,下接躯体,支配着颈部、躯干及四肢的许多活动,同时也潜在着容易受伤和受损的危险性。特别对于长期伏案和低头工作的人来说,颈椎病的发病率较高。颈椎病的发生和发展,还会导致其他系统一些疾病,如动脉硬化、高血压、冠心病、头痛头晕等,严重影响着人们的正常工作与身心健康。

颈椎运动既能预防颈椎病也能治疗颈椎病,且锻炼的方法简单,或坐或站都能进行。活动的准备姿势:双脚分离与肩同宽,两手臂放在身体两侧,指尖垂直向下(坐时两手掌放在两大腿上,掌心向下),眼平视前方,全身放松。活动方法如下:

1.抬头缓慢向上看天,要尽可能把头颈伸长到最大限度,并将胸腹一起向上伸(不能单纯做成抬头运动)。

2.将伸长的颈慢慢向前向下运动,好似公鸡啼叫时的姿势。

3.再缓慢向后向上缩颈。

4.恢复到准备姿势。

注意:第一,每做一次(1~4)连续运动约需1分钟;第二,向上伸颈和向后缩颈都要挺胸收腹;第三,结合每人不同情况每天可做数遍,每遍可做数次。

这种伸颈运动可以改善颈部肌肉韧带的供血,使血液循环加快,使肌肉韧带更加强壮,使骨密度增加,预防骨质疏松,从而减少颈椎病的发生。这种运动不止使颈椎得到锻炼,还能使胸部、腹部及内脏得到锻炼。这种锻炼方法不需要运动场地,随时随地都可进行,也是一种积极的休息方法。

posted @ 2006-01-15 17:04 北国狼人的BloG 阅读(399) | 评论 (0)编辑 收藏

吴闻文主任医师强调,颈椎病是一种后天性的疾病,应该以预防为主,从青少年时期就引起足够的重视。他提出了预防颈椎病的“七办法”:

  第一、有研究表明,长期压抑感情,遇事不外露,多愁善感的人易患神经衰弱,神经衰弱会影响骨关节及肌肉休息,长此以往,颈肩部容易疼痛。所以,要经常保持乐观向上的好心情。

  第二、日常生活中应注意保持头颈正确的姿势,不要偏头耸肩,看书、操作电脑时要正面注视,保持脊柱的正直。睡觉时要选择合适的枕头,不宜过高或过低,一般枕头以10厘米的高度为宜。不要躺着看书、看电视。

  第三、尽可能少坐多动,能走路的不要骑车,能骑车的不要坐车。特别是有车族和长期坐办公室的人员,每天要抽出一定的时间进行锻炼,尤其注意加强颈肩部肌肉的锻炼,可做一做头及双上肢的前屈、后伸及旋转运动,既可缓解疲劳,又能使肌肉发达,韧度增强,有利于颈段脊柱的稳定性,增强颈肩顺应颈部突然变化的能力。爬山、游泳,对预防颈椎病效果较好。

  第四、长期低头伏案工作者,要注意动静结合,每工作一小时左右就要站起来做做工间操,活动活动四肢、颈椎,消除颈部肌肉、韧带的疲劳,防止劳损。

  第五、平时要注意保暖,不要用电风扇和空调直接吹,乘车或运动时注意颈部保护,避免急拐弯、急刹车或突然转颈。

  第六、要防止酗酒。酒精会影响钙质在骨上沉积,使人们易患骨质疏松症、骨质软化症,加速颈椎退行性变。

  第七、中医认为胡桃、山萸肉、生地、黑芝麻等具有补肾髓功能,可在医生指导下合理地少量服用,以起到强壮筋骨,推迟肾与关节退变的作用。

posted @ 2006-01-15 15:48 北国狼人的BloG 阅读(390) | 评论 (0)编辑 收藏
颈椎病是颈椎的一种劳损退变疾患,与长期的屈颈动作有关。严重的可以压迫通向上肢的神经根或通向脑子的椎动脉而引起臂至指的酸麻痹痛或眩晕,甚至压迫神经的低级中枢──脊髓,而产生半身无力。病变是难以逆转的,但是可以作些预防措施以避免它继续恶化,下面几点是我的体会,特编成歌诀以便于记忆:

晚上不宜高枕卧,俯首工作有限时;看书毋妨添支架,沈思亦可托腮颐;头晕忌望天花板,手软宜常牵脖子;早起嗽口练抬头,闲时多躺靠背椅;俯卧垂头能复位,自行"吊颈"少求医。

  低头屈颈长时间工作,颈后椎旁肌肉因持续紧张而容易疲劳,颈椎关节亦会劳损。因此伏案不宜过久,最好一两小时便休息一下,或变换一下体位或动作。晚上睡高枕亦使颈椎屈曲,长年如此,会增加颈椎劳损。看书时自然要低头对着书本,如果把书用支架斜放,头可以略为抬起,不必长时间屈颈。用脑子时以手支撑下颏,对颈椎病患者来说无疑是个好习惯,可以减轻颈肌的负担,避免颈肌过劳。颈椎病如果椎动脉受压会引起脑缺血而产生晕眩,头后仰动作时会增加压迫,故每抬头望天花板时便晕眩,应注意避免这个动作。颈椎压迫到神经根则会引起从上肢至指端的麻木痹痛无力,做颈部牵引可以扩大椎间孔,减轻神经根的压迫,症状自然会缓解,颈椎病患者应多做颈部功能锻炼,尤其是伸颈动作,一方面可使颈椎关节保持一定的活动范围,避免关节囊、韧带等软组织退化僵硬;另一方面可使颈部肌肉发达,增加支撑力,避免劳损萎缩。早上嗽口时顺便活动一下脖子,是一举两得的事。为着避免颈肌长时间因支撑头颅而产生疲劳,休息时多躺靠背椅,使颈肌放松,亦是避免劳损的一法。由于椎间盘变性变窄,颈椎小关节松弛,有时会在某个位置卡住了,即发生了移位,此时会有颈痛、活动不灵、容易疲劳,甚至引起晕眩、头痛等症状。用推拿、牵引等方法可以迅速复位,症状便缓解。没有就医时,亦可以俯卧靠近床边,使头自然下垂到床沿外,利用头颅本身的重量自行牵引,有时也能复位。不过年纪大,有高血压者忌用;没有人在旁也不可擅用此法。牵引是治疗颈椎病的一种有效方法,长期有症状的患者可以在家里自行安装一套简易的牵引用具,只需仿效医院缝制一条用以固定头颅、悬吊脖子的颌枕带,加上一个滑车、一条绳子,以及代替砝码的重物便可。但是牵引的角度、重量和时间亦要讲究,最好征询一下理疗科大夫的意见。

posted @ 2006-01-15 15:44 北国狼人的BloG 阅读(329) | 评论 (0)编辑 收藏
如何实现程序查看系统环境变量

[ljl@dhcp-8116-1 uc]$ env

C++程序:

#include <iostream>
using namespace std;

int main(int args,char** argv,char** env)
{
        
while(env&&*env)
        {
                cout 
<< *env <<endl;
                
++env;
        }
        
return 0;
}


使用main函数的重载.

char** env 是一个二维数组指针,可以遍利二维数组得到环境变量.

=================================================
#include <iostream>
using namespace std;
const unsigned size = 5;
void printInfo(char** env)
{
        
while(env && *env)
        {
                cout 
<< *env << endl;
                env
++;
        }
}

void init(int** data)
{
        
while(data && *data)
        {
                
for(int i = 0; i < 5; i++)
                        (
*data)[i] = i;
                data
++;
        }
}

void printInfo(int** point)
{
        
while(point && *point)
        {
                
for(int i = 0; i < 5; i++)
                {
                        cout 
<< (*point)[i] << "\t";
                }
                cout 
<< endl;
                point
++;
        }
}

int main()
{
        
char p[4][15= {{"hello"},{"world"},{"my"},{"girl"}};
        
char* point[5];
        
for(int i = 0; i < sizeof(p)/sizeof(p[0]); i++)
        {
                point[i] 
= p[i];
        }
        point[
4= NULL;
        printInfo(point);



        
int* piArr[size];
        
for(int i = 0; i < size-1; i++)
        {
                
int* pi = new int[5];
                piArr[i] 
= pi;
        }
        piArr[size
-1= NULL;
        init(piArr);
        printInfo(piArr);
        
return 0;
}


=================================================


posted @ 2006-01-15 15:12 北国狼人的BloG 阅读(265) | 评论 (0)编辑 收藏

咖啡含咖啡因,咖啡因是天然西藥,故咖啡是典型的"含藥食物"。上午喝一杯咖啡,對大多數人而言提神的藥理作用頗為顯著,能使人更為機警,頭腦反應更快,學習能力更強,手腳也顯得更為靈活,讓人整個上午過得神采飛揚。等上午過去了,咖啡因的藥效也消退了,下午再來一杯,可維持整個下午的生活效率。其他的休閒時間就不要再喝咖啡了,每天喝三杯以上的咖啡時, 骨鈣會從尿裡流失,若不懂得刻意補充鈣質,就注定要得骨質疏鬆症了;最容易疏鬆的骨骼是腰部脊椎,此處骨頭斷裂後,日子絕不會好過的。咖啡適量有益,過量有毒,其毒性還不只骨質疏鬆一項而已。

綠茶含茶多酚,即鞣酸(單寧酸),能抑制正常細胞癌變,經西醫研究後,被視為有預防癌症療效,再經電視和文字媒體傳播後,綠茶防癌似乎已是家喻戶曉的普通常識了。但問題並非這般單純,有一派學者指出,單寧酸消費量大的地區居民得食道癌的機率較高,從而認為長期攝食茶裡的單寧酸有可能增加得食道癌的機會。

也有學者指出綠茶製造過程中沒有發酵,大量鞣酸未被破壞,故有防癌藥效,而紅茶 的製造過程中有發酵,發酵期間原有的鞣酸被氧化殆盡,故無防癌療效。綠茶是否真能防癌,有益而無害,恐怕要由時間來解決了。茶多酚是強力抗氧化劑,長期過量攝食究竟有何毒性,現代醫學還不是很了解,為安全計,喝些無妨,喝多就沒有人敢保證安全了。

不知從何時起,"英國醫學會"警告英國人:喝茶(紅茶)時要加牛奶解毒。因此英國人有喝奶茶的傳統。雖然茶葉含抗癌成分"茶多酚"(鞣酸),現在大家相信可防肺癌,但已有的數據也顯示,鞣酸喝多喝久了,得食道癌和口腔癌的機率升高很多。

加了牛奶後,其蛋白質和鞣酸結合,使鞣酸較容易被胃腸吸收。英國是西醫藥理學發展最早的國家,而且又是喝茶的國家,因此最早注意喝茶的問題。

鞣酸是許多植物的天然成分,分為兩大類:可水解的鞣酸和縮合鞣酸,前者有預防正常細胞癌變的藥理作用,但學者也認為,縮合鞣酸喝久了有可能增加食道癌的發生率。在人類吃進口裡的天然物中,以檳榔的縮合鞣酸含量最高,占總成分的百分之一五;從檳榔草取出來的縮合鞣酸經皮下注射入大老鼠後可使全數老鼠得癌;印度和南非消費大量檳榔地區的居民,得口腔和食道癌的病人很多,學者認為縮合鞣酸引起這些癌症。

茶和中外民間常用的一些草藥也含縮石鞣酸,從茶葉提取出來的縮合鞣酸也可使八成的實驗動物得癌,有吃茶粥習摜的日本人得食道癌的機率也高;使用縮合鞣酸含量高的草藥的民族,其食道癌得病率也高。十八世紀的荷蘭人喝茶不加牛奶,結果有很多人得了吞嚥因難的病,改成喝咖啡後就很少人得此病綜合言之,學者認為長期攝食富含縮合鞣酸的食物或草藥 後,會增加得食道癌的機會。

咖啡有別的問題,西醫證據顯示,每天喝二杯而且喝一輩子(四十五年以上)咖啡的女性可遭遇脊椎骨和髖骨的骨質疏鬆症,咖啡因慢慢使骨鈣流失, 而使骨質失去原有的硬度,但每天另外喝至少一杯牛奶補充鈣質的女性,其骨質則無骨質疏鬆症,可見喝牛奶能解咖啡因的慢性毒。喝少量咖啡的女性,其骨質則無明顯改變。

一九八0年,"美國食品藥物管理局"警告美國人:孕婦應盡量避免攝食富含咖啡因的食物,主要依據是咖啡因會使母老鼠生下畸形的小老鼠。動物的實驗結果大都會表現在人類身上,日前已有許多動物和人類的證據顯示,大量攝取咖啡因會毒害胎兒。一杯二00毫升的煮咖約含一00毫克咖啡因,一杯即溶咖啡含六十五毫克咖啡因,一杯泡茶含五十毫克咖啡因,而一罐可樂也含五十毫克咖啡因。一九九三年十二月,"美國醫學會雜誌"的論文指出,每日攝取三百二十一毫克(相當於三杯煮咖啡或六杯泡茶)以上的咖啡因的孕婦, 流產機率是其他人的三倍;而懷孕前攝取一個月三百二十一毫克以上的咖啡因,也會使流產率加倍;懷孕頭三個月是胎兒全身器官形成期,最怕食毒和藥毒只只要每日攝取一百六十三毫克的咖啡因,就能使流產機率加倍。咖啡因能從母親迅速穿過胎盤進入胎體,因為胎體的肝解毒系統尚未形成,故懷孕後咖啡因的毒性較大。

由於大多數女性都在懷孕一個半月後才發現己經懷孕,大量咖啡因會增加流產和不孕機會,故考慮懷孕的女生應少喝咖啡、茶和可樂(更應戒菸酒), 才能使胎兒的健康獲得更多的保障。

posted @ 2006-01-11 22:37 北国狼人的BloG 阅读(623) | 评论 (1)编辑 收藏
g++ -c 编译成为目标文件

g++ -o 编译指定输出文件名

   g++ Info_test_list.cc Info.cc -o Info_test

如果是在windows上,使用Dev-C++,它支持ANSI-C比较好。

#include <> 包含头文件
#include "" 自己的头文件

   #include <iostream>
   using namespace std;

头文件:

/usr/local/include/c++/3.2/

g++自动能找到标准头文件。

可以自己定义命名空间:

namespace std{

}

#include <iostream>
using namespace std;

namespace czq{
   
int var = 100;
}


int main()
{
    cout 
<< czq::var << endl;
    
return 0;
}


最后一行应该有一个空行。

在C++中表示字符串,有三种方法,string类,char* char name[]。

char name[] = "John",这是一个字符串末位有一个'\0',也就是第五个字符。

'J''o''h''n''\0'

那么char str[5] 只能放四个字符。

int main(int argc,char argv[])
{

}

argc至少为1,因为参数个数包含可执行文件本身。

argv[0],可以用于检查执行文件名是否被修改,用于版权保护哦。

=============================

在C++中,只要不是0,就是真,那么0包括0、'\0'、NULL、false

例子:猜数:

#include <iostream>
using namespace std;

int main()
{
    unsigned 
int t = time( NULL );//随即数产生
    unsigned 
int num = t * 37 % 100;
    unsigned 
int data;
    
int i;
    cout
<<"input a number between 0~99:";
    
for( i=0; i<10; i++ ){
        cin 
>> data;
        
if!cin ){//如果输入流没有读到整型,那么就会设置错误标志
            cout
<<"Invalid number!\n";
            cin.clear();
            cin.ignore( 
100'\n' );//忽略字符,最多100个,遇到\n就结束忽略
            
continue;
        }

        
if( data == num ){
            cout
<<"you got it!"<<endl;
            
break;
        }

        
else if( data < num ){
            cout
<<"too small!"<<endl;
        }

        
else
            cout
<<"too big!"<<endl;
        cout
<<"try again:";
    }

    
if( i >= 10 )
        cout 
<< "the answer is " << num << endl;
    
return 0;
}



atoi函数可以转换字符串变为整数。不成功为0

#include <iostream>
using namespace std;

int main(int argc,char* argv[])
{
    
int score;
    
char* p = "10000";
    
    score 
= atoi(p);
    
    cout 
<< score << endl; 
    cin.
get();
    cin.
get(); 
    
return 0;    
}

 

C++,只要定义变量,就会分配空间。只有纯声明性的东西才不会分配空间。

int a;//这时就已经分配了4个字节

对于对象来说,创建对象有两种途径:1、直接定义  2、new 在堆空间

int a = 0;这是初始化,C++大部分情况不会自己初始化,可能保存着不确定的值,需要程序员完成初始化。

a = 9; 这是赋值,赋值与初始化是完全不同的概念,赋值操作实质是进行内存数据的复制。初始化,定义时分配空间后给一个值而已。

赋值与初始化的区别体现的更明显 对象的初始化和赋值是完全不同的概念

posted @ 2006-01-11 21:51 北国狼人的BloG 阅读(545) | 评论 (0)编辑 收藏
据澳大利亚广播公司10日报道,现在笔记本电脑越来越普及,尤其是很多年轻人,不管走到哪里,想查找资料或玩游戏了,找个地方一坐,将电脑在双腿上一放,一工作或游戏就是半个小时甚至更长的时间。但最新一项研究显示,笔记本电脑产生的热量会使阴囊的温度上升,从而可能影响精液的数量。研究人员警告,频繁使用笔记本电脑可能影响男性的生育能力。
  美国研究人员在《人类繁殖》杂志上公布的研究结果表明,笔记本电脑会令阴囊的温度上升差不多3摄氏度。领导此项研究的纽约州立大学副教授耶菲姆·舍金表示,长期频繁使用接触笔记本电脑已成为现代生活的特征,但频繁使用笔记本电脑会使阴囊温度过高,可能使男性精子的数量减少,尤其对十几岁的男孩和年轻男子影响明显。

  研究人员认为,长时间将笔记本电脑放在双腿上工作,这是男性精子数量减少的一个重要原因。最新研究结果表明,笔记本电脑运行时内部最高温度可达到70多摄氏度。研究人员表示:“在膝盖位置上频繁使用笔记本电脑会将阴囊直接暴露给电脑内部散发出的热量。此外,使用笔记本电脑需要特殊的身体姿势,阴囊会挤在紧闭的大腿之间,影响精子的数量。”

  2001年,《手术刀》杂志曾报道过一名男子在使用笔记本电脑后生殖器和阴囊被灼伤的案例。澳大利亚男性生育专家、墨尔本大学教授戈登·贝克表示,他对男性使用笔记本电脑后阴囊温度上升并不感到奇怪。但他对频繁使用笔记本电脑对男性生育的影响表示怀疑。贝克教授说:“科学家对笔记本电脑的底部提出了不少警告,我能够想象到如果你将笔记本电脑放在膝盖上,这有可能影响你的阴囊。但人们经常暴露于很高的温度环境下,却难以找到表明温度高真正损害精子数量的直接证据。”

  舍金教授领导的这项研究涉及29位年龄在21岁至35岁之间的男性。研究人员称,在他们使用笔记本电脑一小时后,他们左侧阴囊和右侧阴囊的温度分别平均上升了2.6摄氏度和2.8摄氏度。一些研究发现阴囊温度上升1摄氏度就足以抑制精子的产生。尽管研究人员目前还不清楚男性最好使用多长时间笔记本电脑才不至于使精子数量减少,但他们还是建议十几岁的男孩和年轻男子应该尽可能少使用笔记本电脑。
posted @ 2006-01-09 22:52 北国狼人的BloG 阅读(401) | 评论 (0)编辑 收藏

某个类要想实现拷贝的功能,就必须实现Cloneable接口,并覆盖Object的clone()方法,才能真正实现克隆。

浅拷贝,一种默认的实现,Teacher类中的clone方法的实现就是浅拷贝。

Student类的clone方法就是深拷贝。注意super.clone返回的对象实际上是被类的对象,可以放心强制转换,至于为什么,我也不知道,估计得读虚拟机规范,从Object源码看也不到什么,因为是protect native Object clone();


import java.util.*;
public class TestClone{
 
public static void main(String[] args)
 
{
  Teacher t 
= new Teacher("Name",22);
  Teacher m 
= (Teacher)t.clone();
  System.out.println(m);
  
  Student stu 
= new Student();
  Student deepcloneSTU 
= (Student)stu.clone();
  stu.courses.put(
new Integer(1),"Math");
  deepcloneSTU.courses.put(
new Integer(100),"Java");
  disp(stu.courses);
  disp(deepcloneSTU.courses);
  
 }

 
 
static void disp(HashMap h)
 
{
  Set keySet 
= h.keySet();
  Iterator it 
= keySet.iterator();
  
while(it.hasNext())
  
{
   System.out.println(h.get(it.next()));
  }

 }

}


class Teacher implements Cloneable{
 String name;
 
int age;
 Teacher(String name,
int age)
 
{
  
this.name = name;
  
this.age = age;
 }

 
 
public Object clone()
 
{
  
try{
   
return super.clone();
  }
catch(CloneNotSupportedException e)
  
{
   
throw new Error("This should never happen!"); 
  }

 }

 
 
public String toString()
 
{
  
return name + "  " + age;
 }

}


class Student implements Cloneable{
 HashMap courses 
= new HashMap();
 Student()
{} 
 
 
public Object clone()
 
{
  
try{
   Student stu 
= (Student)super.clone();
   stu.courses 
= (HashMap)courses.clone();
   
return stu;
  }
catch(CloneNotSupportedException e)
  
{
   
throw new Error("This should never happen!"); 
  }

 }

}




如何通过对象串行化的方式来做进行拷贝工作呢?

import java.util.*;
import java.io.*;
public class TestClone{
    
public static void main(String[] args) throws Exception
    
{
        BMW mycar 
= new BMW();
        ByteArrayOutputStream memoryOutputStream 
= new ByteArrayOutputStream();
        ObjectOutputStream serializer 
= new ObjectOutputStream(memoryOutputStream);
        serializer.writeObject(mycar);
        serializer.flush();
        
        ByteArrayInputStream memoryInputStream 
= new ByteArrayInputStream(memoryOutputStream.toByteArray( ));
        ObjectInputStream deserializer 
= new ObjectInputStream(memoryInputStream);
        BMW mycopycar 
= (BMW)deserializer.readObject();

        mycar.add(
new String("NB"));
        mycopycar.add(
new String("NBNB"));
      System.out.println(mycar.hashCode());
      System.out.println(mycopycar.hashCode());
      System.out.println(mycar.equals(mycopycar));
    }

}


class BMW implements Serializable
{
    
private int wheels;
  
private String model;
  
private ArrayList forTest;
  
  BMW()
  
{
      wheels 
= 4;
      model 
= "530i";
      forTest 
= new ArrayList();
  }

  
  
public void add(Object o)
  
{
      forTest.add(o);
  }

  
  
public String toString()
  
{
      
return "WHEEL:" + wheels + "MODEL:" + model + forTest.toString();    
  }

  
  
public int hashCode()
  
{
      
return wheels + model.hashCode() + forTest.hashCode();    
  }

  
  
public boolean equals(Object o)
  
{
      
if(o == this)
          
return true;
      
if(o == null)
          
return false;
      
if(!(o instanceof BMW))
        
return false;
      BMW bmw 
= (BMW)o;
      
if(bmw.wheels == wheels&&bmw.model.equals(model)&&bmw.forTest.equals(forTest))
          
return true;
      
else return false;
  }
  
}


记住,如果覆盖了equals方法,应该也覆盖hashCode(),因为如果两个对象相等也就是equals()返回true,那么这两个对象应该有相同的hashCode。

posted @ 2006-01-08 17:15 北国狼人的BloG 阅读(3595) | 评论 (0)编辑 收藏


食物和皮肤之间有着密切的联系,那么,哪些食物是皮肤最喜欢的呢?皮肤科专家们为我们总结出了以下
10种:

 

1.西兰花

它含有丰富的维生素A、维生素C和胡萝卜素,能增强皮肤的抗损伤能力、有助于保持皮肤弹性。

 

2.胡萝卜

胡萝卜素有助于维持皮肤细胞组织的正常机能、减少皮肤皱纹,保持皮肤润泽细嫩。

 

3.牛奶

它是皮肤在晚上最喜爱的食物,能改善皮肤细胞活性,有延缓皮肤衰老、增强皮肤张力、消除小皱纹等功效。

 

4.大豆

其中含有丰富的维生素E,不仅能破坏自由基的化学活性、抑制皮肤衰老,还能防止色素沉着。

 

5.猕猴桃

富含维生素C,可干扰黑色素生成,并有助于消除皮肤上的雀斑。

 

6.西红柿

含有番茄红素,有助于展平皱纹,使皮肤细嫩光滑。常吃西红柿还不易出现黑眼圈,且不易被晒伤。

 

7.蜂蜜

含有大量易被人体吸收的氨基酸、维生素及糖类,常吃可使皮肤红润细嫩、有光泽。

 

8.肉皮

富含胶原蛋白和弹性蛋白,能使细胞变得丰满,减少皱纹、增强皮肤弹性。

 

9.三文鱼

其中的欧咪伽?3脂肪酸能消除一种破坏皮肤胶原和保湿因子的生物活性物质,防止皱纹产生,避免皮肤变得粗糙。

 

10.海带

    它含有丰富的矿物质,常吃能够调节血液
 
posted @ 2006-01-07 22:52 北国狼人的BloG 阅读(280) | 评论 (0)编辑 收藏
手机什么时候辐射最强?

 

    当人们使用手机时,手机会向发射基站传送无线电波,而无线电波或多或少地会被人体吸收,这些电波就是手机辐射。一般来说,手机待机时辐射较小,通话时辐射大一些,而在手机号码已经拨出而尚未接通时,辐射最大,辐射量是待机时的3倍左右。这些辐射有可能改变人体组织,对人体健康造成不利影响。

posted @ 2006-01-06 19:09 北国狼人的BloG 阅读(329) | 评论 (0)编辑 收藏
     摘要: 一台主机有个IP地址(逻辑地址),MAC(物理地址)。用IP可以找到一台主机。能交换数据的是进程,进程之间交换数据,不是计算机。一个程序.exe,静态的概念,一个进程,在内存中,运行态的概念。某些进程会占用固定的端口,进程与端口对应。把一个端口和进程建立联系的叫做绑定。FTP《=》端口21进程间通讯是两个端口建立连接。由于机器通讯,要有相同的语言,为保证数据正常交互,预先约定好协议。网络体系架构,...  阅读全文
posted @ 2005-12-29 14:19 北国狼人的BloG 阅读(376) | 评论 (1)编辑 收藏
指针一个种特殊的变量,用来存放其他变量的地址。

定义一个变量,就会分配内存,就会开空间,有地址,地址与变量的值无关系。变量地址不会改变。

int theVariable = 5;
int *pPointer = &theVariable;

那么寻找变量:
1.通过变量名,可以访问变量。
2.通过地址,可以找到变量。(地址唯一,不变)

指针只保存地址。

一个变量的地址是有意义的,可以进行运算(+/-数字,相减,比较)。

指针就是一个用来保存地址的特殊变量。

=================================

由于地址有类型,所以指针也有类型。(不信?只知道地址,如果不知道类型,取几个字节无从获知)。

int类型的地址就是四个字节。

所以一定要明确  地址需要赋予一个类型的概念。

int i = 5;

取地址符号,会取得有类型的地址,&i(整型变量的地址)

char ch = 'A';

&ch,就是字符类型的地址

int *p = &i;

这个语句的含义:定义一个类型是int的指针变量p,并将i的地址给p,p只存储了地址。

指针类型必须与地址类型一致。

指针的类型由它所指向的存储空间的内容的类型来确定,什么类型的变量,就用什么类型指针。

任何数据类型,都有指针。

指针是用来保存变量的地址,所以int *p = 2000; 不可以!!

指针+1一定是找到下一个变量。有类型信息进而找到下一个同类型的变量。

int i = 100;
int *p = &i;
char ch = 'a';
p = &ch;

错!指针类型严格匹配。

可以给指针赋一个NULL,NULL表示内存0号单元,起始位置。不可以读,也不可以写。禁止访问。
试图访问,段错误。

在使用指针之前,

===========================

char *p = "hello";//存于常量区,不可以修改
"hello"一个字符串,也就是一个字符数组,p的地址就是这个字符数组第一个元素的地址:一个char类型的地址。
p[0] 就是'h'。

===========================

posted @ 2005-12-28 00:27 北国狼人的BloG 阅读(344) | 评论 (0)编辑 收藏
     摘要: 需求,java程序与外届交流数据。实际上是OS与JVM内存交互数据。那么针对程序,有输出流,也有输入流。java.io包下,File类,它表示文件系统上的一个文件或者目录。方法,总体来说是对磁盘文件的磁盘操作,不能看内容,主要是为了获得文件和文件属性。File dir = new File("d:\");File f = new File(dir,"11.txt");// -->创建文件对象...  阅读全文
posted @ 2005-12-25 00:08 北国狼人的BloG 阅读(424) | 评论 (0)编辑 收藏
     摘要: class Stack{    int index=0;    char data[]=new char[6];    public synchronized void push(char c){&n...  阅读全文
posted @ 2005-12-15 00:32 北国狼人的BloG 阅读(573) | 评论 (2)编辑 收藏
     摘要: 由于本人已经有了很多界面开发经验,对于这块不是重点,只列举一些例子。JSF和Web Start(jnlp+jar),将逐步替代Swing和Applet的地位。图形界面开发,步骤一定要记住。1.选择容器2.设置布局管理器,Panel默认为Flow,Frame默认为Border3.添加组件,可能是容器组件的多层嵌套4.添加时间处理,add***Listener,并给出实现。事件模型是重点. impo...  阅读全文
posted @ 2005-12-11 21:15 北国狼人的BloG 阅读(315) | 评论 (0)编辑 收藏
     摘要: 集合java.util.*一个对象,容纳多个对象,用于维护一系列相似对象。数组是一种简单集合。程序中,如何管理数据,需要一种数据结构。(数组是一种线形结构)。Java的集合框架是通过一系列接口和一些层级类形成的一套体系。通过接口来查看整个集合框架,并分类来进行学习和研究。 概述: Collection接口的一个对象会把数据按照一维线形组织。里面都是对象。List代表,会按照元素的相应顺序来组织...  阅读全文
posted @ 2005-12-06 23:13 北国狼人的BloG 阅读(909) | 评论 (1)编辑 收藏
     摘要: 内部类,使用内部类使编程更有层次,结构更清晰,但一切能用内部类解决的问题,外部类都能解决,只是编码是否繁琐的问题。内部类,是作为外部类的成员。内部类,修饰符可以为private protected static四种内部类成员内部类   局部内部类   静态内部类   匿名内部类1.成员内部类,可以作为外部类的...  阅读全文
posted @ 2005-12-03 19:59 北国狼人的BloG 阅读(425) | 评论 (0)编辑 收藏
面向对象高级

static,可以修饰属性、方法、代码块。

每个对象称为类的实例,对象之间的存储区互不干涉。

static int data;是类变量(共享),为类开辟一个空间。共享存储区域。

访问类变量,通过类名访问。一个对象引用也可以使用静态成员,与它的编译时类型的类访问,一致。

MyClass m = new MyClass();
m.data 《= 》MyClass.data;

静态方法-〉没有当前对象概念-〉也就不允许访问的类中的非静态成员(实例变量)

主方法之所以是静态的,它是程序入口,JVM最初没有对象,必须通过使用类名调用方法,主方法必须为静态的。

静态方法不能被覆盖。

静态代码块只执行一次。

static 用于单例模式Singleton模式

class DBConnection{
   
private static DBConnection db = null;
   
private DBConnection{}

   
public static DBConnection getInstance(){
         
if(db == null) db = new DBConnection();
         
return db;
   }

}


final 修饰  类、属性、方法

修饰类,无子类,保证用户使用的一致性。典型范例String类。

修饰属性或者变量一旦赋值,不得更改。

对于对象变量来说,是不能再指向其他对象,而现有的对象内部属性可以改变。

会配合static一起使用,只分配一个存储空间,只需要维护一个空间。

public static final,是一个常量。大写。

class SuperClass{
      final int AGE;

      public SuperClass(){
         AGE=10;
      }
}

初始值0不算,需要显示赋一次值。

初始设定在两个地方,1定义时直接赋值,2构造器

静态常量也在两个地方设定,1初始设定,2静态代码块




final方法不能覆盖,由于多态,一个编译时类型对应多个运行时类型,final保证某方法的稳定性。


private
               左边的修饰符有其中一个,系统都默认添加了final修饰符。
static


所以之前的静态方法不能覆盖。

=====================
方法继承是决定于在子类中是否可见。能见到就是继承。

final不决定继承。

实际上如果实例化一个子类对象,它的父类对象的所有属性(包括private成员都创建了,就是访问不了,所以不能成为继承的一部分,也就是不能继承咯)



=====================


abstract 修饰 类 方法

修饰类 -> 这个类必须被继承使用->不能生成对象

用处,把子类最大的共性提取出来放入其中,面向对象一般原则。

虽然不能生成对象(不能作为运行时类型),但可以声明为类型(可作为编译时类型)。

抽象方法,没有实现,留给子类覆盖。

final永远不可能和abstract在一起,那么private和static也不能和abstract联合修饰。

final表示必须不能被继承,不能覆盖;abstract表示必须继承,方法没有实现,必须覆盖使用。所以矛盾。

abstract class SuperClass{
      abstract void print(); //print(){},这是空实现,也是实现,所以不能带大括号。
}

如果类中有抽象方法的话,那么类只能是抽象类。(一个半成品)

如果子类没有实现父类的抽象方法,就会编译出错,因为子类继承了抽象方法,需要声明为抽象类。

SuperClass sc = new SubClass();

sc.print();动态类型判定,运行时类型不会改变,肯定是一个实现抽象方法的类对象。




接口:是同类,同一个层次的数据结构。

interface IA{
   void print();  
   int A = 1;
}

修饰符省略
一个Java文件,只能定义一个公开接口

一个接口等同于一个抽象类

一个特殊的抽象类:
   所有方法都是公开抽象的:public abstract
   所有属性都是公开静态常量:public static final

interface IA{
   void print();  
   int A = 1;
}

等价于

abstract class IA{
   public static final int A=1;
   public abstract void print();
}

这时可要注意,类实现接口时,覆盖方法的访问控制符一定要写上public,接口是省略为public,类不写可是default,根据Overriding规则,覆盖方法的访问控制等于或者大于父类方法的访问控制。

class IAImpl extends java.util.ArrayList implements IA{}

1一个类除了继承类,还可以实现接口(多个)。

2尽管一个类只能继承一个类,一个类可以实现多个接口

3接口与接口之间可以继承并可以多继承,实现多重继承,但复杂度不增加。

interface IC extends IA,IB{}

IC有着IA,IB所有方法的定义

IA,IB可以作为编译时类型。

========================

接口,被用来定义可以***的东西。

                  存储设备                              输入设备
----|----------------|-----                     ----------|-----------
硬盘                  U盘                                 鼠标
----|----
移动硬盘

使用接口来剥离出一部分抽象。

移动硬盘、U盘、鼠标除了间接父类是统一的设备父类外。

他们都是USB设备,这部分抽象就需要用接口定义。

那么机器上的连接器是一个方法,connect(USB接口),不管你什么具体设备,你都必须实现USB规范,才能往上插。

那么用接口来定义一个规范。


例子2,JDBC,使用Java来访问数据库。

首先,如果由Sun公司自己提供各种数据库的驱动,那么各个DB厂商需要把数据库核心代码提供给Sun,这是不可能的,核心商业机密。

而由各个DB厂商自己写的话,会出现方法名的不同,导致如果数据库迁移,代码需要改动。(例如Oracle提供的方法为ConnectOracle()而ms提供的方法为ConnectSQL)。那么无法真正实现Write Once,Run Anywhere,Sun不同意。

怎么办?使用接口。

由Sun和DB联合制定一些一系列接口。

interface Driver()
{
      void connect();
      ...
}

OracleDriver implements Driver
SQLDriver implements Driver

实现不同的connect()逻辑。

用户Driver d = getDriver();
d.connect();

接口是实现Java一次编译,到处运行的重要技术。

保证了Sun制定规范,数据库厂商实现,用户使用。保证架构稳定性(将三方分开)

对于用户来说,接口最大化屏蔽差异。

1.实现不同层次,不同体系的对象的抽象。
2.保证架构稳定性。对用户透明。


==============================

Object 类,所有类的父类(直接,间接父类)

finalize(),当一个对象被垃圾回收的时候,会调用一下。不适合放入释放资源的方法。

toString(),对象的字符串表现形式。

System.out.println(obj);->obj.toString()

自定义类,覆盖该方法,返回一些有意义的信息。

==  判断字面值是否相等,

String a = new String("hello");
String b = new String("hello");
b==a false

String final类,并且它的值也是immutable的。

String a = "A"
a = a + "B"
这两步操作一共产生了3个对象。

JVM内部有一个字符串池,一个独立存储区域,保存已创建的字符串,如果再有相同的,会将引用指向字符串池中的已有对象,不再创建新的,如果没有再创建。

String a = "abc";
String b = "abc";

所以上面的例子是采用new String("abc")方式创建String对象,不会再去池中找,直接在堆中创建新对象。

String a = new String("hello");
String b = "hello";

a为堆地址,b为串池地址,a==b,false。

这种方式,是一种用时间换空间的做法,比如如果程序中有100个"hello",难道程序要去维护100个对象嘛。

Object.equals   判断对象值是否相等。

/*
 * Student.java
 *
 * Created on 2005年12月3日, 上午10:43
 *
 * To change this template, choose Tools | Options and locate the template under
 * the Source Creation and Management node. Right-click the template and choose
 * Open. You can then make changes to the template in the Source Editor.
 
*/


package javaapplication1;

/**
 *
 * 
@author Administrator
 
*/

public class Student {
    
    String name;
    
int age;
    
    
/** Creates a new instance of Student */
    
public Student() {
    }

    
    
public Student(String n,int a){
        
this.name = n;
        
this.age = a;
    }

    
    
public boolean equals(Object o)
    
{
        Student s 
= (Student)o;
        
if(s.name.equals(this.name)&&s.age == this.age)
            
return true;
        
return false;
    }

    
}

自定义类如果要进行对象值的比较,覆盖Object的equals方法,自行判断,如果不覆盖,直接调用Object.equals是判断地址。

equals方法覆盖标准流程:

    public boolean equals(Object o)
    
{
        
if(this == o)
            
return true;
        
if(o == null)
            
return false;
        
if(!(o instanceof Student))
            
return false;
        Student s 
= (Student)o;
        
if(s.name.equals(this.name)&&s.age == this.age)
            
return true;
        
return false;
    }

double d = 10000.0d;
Double D_d 
= new Double(d);
String D_S 
= D_d.toString();//D + ""
String d_s = String.valueOf(d);//d + ""
double s_d = Double.parseDouble(d_s);
Double S_D 
= Double.valueOf(d_s);
double d_D = D_d.doubleValue();












 

posted @ 2005-12-02 00:03 北国狼人的BloG 阅读(391) | 评论 (0)编辑 收藏

面向对象三大基石:封装,继承,多态。面试会问到。

Overriding  覆盖  只存在于父子类之间,一定。

什么时候才是覆盖呢?

class Father{
   public void run(){
   }
}

class Son extends Father{
   public void run(int a){
   }
}

注意:这是方法的重载,不是覆盖!只是这个重载发生在父子类之间。

覆盖是,子类参数列表与返回值都与父类相同,并且子类在覆盖父类方法时,不能给出更严格的访问控制,并且子类方法例外的类型是等于父子方法抛出的异常类型,或者是其子类型。

The exceptions thrown by an overriding method must be equal to or a subset of the exceptions thrown by the overridden method.

注意构造方法根本不能继承,所以不存在覆盖的问题。

访问控制

private 本类内部可见

default 同类同包

protected 同包+不同包子类

要构造一个对象,先构造父类对象,再构造子类对象

构造一个对象的执行过程。

1.递归的构造父类对象-----------〉也就是说父类本身也要走这样的步骤。
2.顺序调用成员属性赋初值语句
3.调用本类构造方法

后来课程领悟,类加载与构造对象是两回事,类加载过程,1.static静态成员加载,2运行static一次,静态代码块,3如果有静态内部类,赋值,对静态内部类的赋值是指编译产生的Employee$SomeInner.class文件的读取。

如果类有静态变量或者静态块,而且用到时(static初始化只有在必要的时候才会进行,那么就会在第一步之前执行一遍,先静态变量,然后静态块,以后再怎么new都不会执行,回到创建父类开始。

======〉引用Think In Java

在这里有必要总结一下对象的创建过程。请考虑一个名为Dog的类:
(1) 类型为Dog的一个对象首次创建时,或者Dog类的static方法/static字段首次访问时,Java解释器必须找到Dog.class(在事先设好的类路径里搜索)。
(2) 找到Dog.class后(它会创建一个Class对象,这将在后面学到),它的所有static初始化模块都会运行。因此,static初始化仅发生一次——在Class对象首次载入的时候。
(3) 创建一个new Dog()时,Dog对象的构建进程首先会在内存堆(Heap)里为一个Dog对象分配足够多的存储空间。
(4) 这种存储空间会清为零,将Dog中的所有基本类型设为它们的默认值(零用于数字,以及boolean和char的等价设定)。
(5) 进行字段定义时发生的所有初始化都会执行。
(6) 执行构建器。正如第6章将要讲到的那样,这实际可能要求进行相当多的操作,特别是在涉及继承的时候。

=====================

多态-1.编译时多态      方法重载
         2.运行时多态      一个对象可能会具有多个类型

对象是客观的。

人类对对象的认识是主观的

当人看到一个不能识别的,有生命的,区别人的东西时,会类来认识该事物。

也就是Animal a = new Dog();子类对象可以使用父类对象来引用。

Animal被称为编译时类型,而a真正的对象类型是运行时类型。

3个原则:

1.对象不变(运行时类型不变)(客观的肯定不会改变)
2.只能调用编译时类型的方法,方法调用时,检查编译时类型内部是否定义了该方法。
   也就是说,在你以一个一个动物来看待一只狗时,你是不会知道它有散步的方法的。
3.RTTI,运行时,动态类型判定(看运行时类型),子类覆盖了(Overriding)父类方法,那么调用运行时类型对象的方法。

a instanceof 类名(编译时类型)
a为对象变量
判断a是否被声明为后面类的对象。
用在强制类型转换之前。如果转换错了,java.lang.ClassCastException 运行时例外

记住,方法只有覆盖时,调用寻找运行时类型。而Overloading ->编译时多态->看编译时类型。

属性,重载阿,都要看编译时类型。

package com.ljl;

public class TestClass {
    
public void print(B b){
        System.out.println(
"is B");        
    }

    
//    public void print(A a){
//        System.out.println("is A");
//    }
    
    
public static void main(String[] args)
    
{
        TestClass tc 
= new TestClass();
        A a 
= new B();
        tc.print(a);
    }

}


class A{}

class B extends A{}

为什么子类覆盖父类方法时,访问控制符只能更宽泛。因为如果父类方法为public,子类方法为private,那么多态时,察看父类方法可以调用(可调用编译时类型所定义的方法),而动态类型判断时,调用子类方法,发现为private,完蛋了。



posted @ 2005-11-29 21:37 北国狼人的BloG 阅读(393) | 评论 (0)编辑 收藏

面向过程是以时间为顺序的,组成单位是函数。

面向对象是一套思想。它来源于人类对于客观世界的认识的一般规律。

1什么是对象?

什么都是对象!客观存在的就是对象。

对一个事物来说,一是它有什么?(属性)二是它能做什么?(方法)



2为什么面向对象

它人类看待客观事物的一般规律。

人看到事物,首先会想到它能做什么,功能,存在的价值。并不太关心它的属性。

========================================

要注意联系实际来搞懂面向对象,比如面试这件事,实际上,公司是想测试你是否能提供 公司需要的方法,公司并不关心你实现的细节。录用后,就是开始去调用你的方法。如果不能很好的实现方法,就可能被辞退。

那么那些笔试、测试就是想看你是否有知识,知识就是属性,记住属性与方法之间是有联系的,也就是没有公司所需的知识,可以断定这个人肯定不会有公司需要的方法。

一个事物的方法的实现细节是对外界屏蔽的。

那么,之前提交的简历是什么呢,那就是一个方法列表阿,API。比如年龄22,表明你的方法可以很好的被调用;未婚,告诉别人,你可以加班,放心用。

项目1,2,3,每个项目后面一定要写上你在项目中用到什么语言,否则HR的人是不知道你想告诉他们什么,他们只关心公司想要一个有JSP开发经验,或者什么什么技术有经验的人。您叙述一大堆项目的事情,没有任何意义。所以简历不要瞎写。

面试是什么,就是想真正调用一下你的方法,测试一下。

=======================================

那么社会的运转就是各个对象的方法的相互调用。

方法列表公开,方法的实现细节屏蔽。

属性,可见和不可见

一个方法的实现细节谁知道呢?只有这个对象的生成者。



那么人看待客观世界的认识,就是通过类。人类认识的是类。

类是一系列对象的抽象,对象的模版。

一类事物,属性、方法。这类对象也肯定有这些属性和方法。



为什么面向对象的第二点,就是使得开发的系统各思其职,各尽所能。也就是低耦合,高内聚。

为什么,电脑中的部件可以很容易的更换成为其他厂商的,就是因为主板与具体部件的连接是松散的;那为什么,可以很容易的换到其他厂商的呢,是因为各个厂商遵循着标准接口。

比如硬盘的use(电源接口,数据接口),每个厂商都必须实现,而且硬盘是一个类的概念,有属性,比如尺寸。

各个厂商不能在别处下功夫,只能对硬盘内部进行调整,提高性能,才会免予被替换。

高内聚是指完成功能的最小化。

低耦合表现在提高了对象的复用性,比如中间件。



最后总结一下,面向过程是先有算法,后有数据结构。由若干个过程相互调用完成。

面向对象,则是先有数据结构,后有算法,以对象为中心,开发一系列类,拿到特定对象,通过对象之间通信,对象设计要简单。

类(共性)--〉对象(类允许对象在满足共性的同时,存在个性)

一个类,则是一个新的数据类型。



实例变量与局部变量命名冲突,则使用局部变量,除非使用this.来指定某个属性。

调用构造器只是生成对象步骤的最后一步,不是构造对象本身。

方法中使用了this,this表示当前对象,当前对象就是谁调用该方法,谁就是当前对象。

class TestClass{
String name;
public void printAll(String name)
{
   this.name = name;
}

}

上面必须添加上this.来引用实例变量name。因为在局部变量和实例变量冲突时,使用局部变量。





finalize()不是析构方法,因为不能存在真正的释放空间操作。



方法参数,简单类型传值,对象类型传引用(一个实际存储[堆中]的首地址)。

假如方法中,引用赋予一个新的对象,那么方法执行完以后,该引用和实际地址消失。传入引用所指向的对象属性不变。



Overloading,修饰符和返回值可以不同,但参数列表(参数类型个数或者排列顺序)一定要不同。

Overloading,是编译时多态。那么它要看编译时类型。

Overloading,也存在于父与子的关系当中。父有方法,子类可以有同名方法,只有参数列表不同才是重载。

构造器(构造方法可以重载),通过this();可以调用本类无参构造方法。
在其他构造器调用其它构造器,那么需要this关键字,并且必须放置于第一行。

如果一个类不写任何构造函数,系统会默认添加无参空构造方法。不要依赖系统默认行为!自己最好写上。javap查看实际代码。


对于简单类型,如果调用方法传入参数的类型不存在,那么就采用向上匹配原则进行查找。

m(byte)不存在,就用m(short)。(实际上long是int的父类,int是short的父类)



封装

属性尽可能私有。

方法尽可能公开。

private只有类内部本身能访问。

default只有同包能访问。

protected只有存在继承关系,才能访问。

posted @ 2005-11-28 23:43 北国狼人的BloG 阅读(505) | 评论 (2)编辑 收藏

模式是什么?

模式是一个范式,一个在相同环境或者状况下的一种通用解决办法,解决方案。就好像孙子兵法,对于某种特定战局,战况下的一种派兵布阵策略和实施步骤的总结。

模式需要什么呢?

模式需要一个名字,一个问题域(要解决的问题),要有一个解决的方案,最后要达到什么样的结果。

长话短说,Observer模式,所要解决的问题就是,一个事物,当它自身的状态改变了,那么它要通知其他的事物,而它又不能够事先知道要通知谁,只有在Runtime时才能知道。

举个例子吧,钟表和人的关系就是这样,钟表自身的状态,也就是时刻改变了,它通知某些人,某些人看到或者听到后,会做出不同的行为。而钟表在商店里时,并不知道要通知谁?只有买主把钟表买回家,买主的家人注册到这个钟表,这时,钟表的状态改变才会通知到家里的人,那么家人有大人、小孩,他们看到或者听到这个钟表的时间改变,会有不同的行为。

那么将上面的例子可以化解为对象。钟表是个源,它是抽象的概念,可以很多形式的表,手表、挂钟、闹钟等,而家人们都是监听器,实现了监听器接口,监听器方法就是listen()和see(),当人每个人实现了接口会有不同的行为,这些钟表并不关心,它只会在整点时通知之前注册到它内部的家人实例的监听器方法。

那是什么时候注册的呢?就是主人买回家,告诉家人这是新的钟表,也就是Timer.registerListener(Listener l)

那么钟表就是observable,就是那个常说的Subject,而家人就是具体的Observer,实现了Oberver接口的方法。

package com.javapatterns.observer;

public abstract class AbstractTimer {
    
    
public void attach(){};
    
    
public void detach(){};
    
    
void notifyObservers(){};
}

 

package com.javapatterns.observer;

import java.util.Enumeration;
import java.util.Vector;

public class ConcreteTimer extends AbstractTimer {

    
private Vector observersVector = new java.util.Vector();
    
    
public void attach(Listener observer)
    
{
        observersVector.addElement(observer);
    }

    
    
public void detach(Listener observer)
    
{
        observersVector.removeElement(observer);
    }


    
public void notifyObservers()
    
{
        Enumeration enumeration 
= observers();
        
while (enumeration.hasMoreElements())
        
{
            Listener l 
= (Listener)enumeration.nextElement();
            l.see();
            l.hear();
        }

    }



    
public Enumeration observers()
    
{
        
return ((Vector) observersVector.clone()).elements();
    }

    
}

下面是Listner接口,是一个概念模型,提供给Timer,Timer只关心,自身改变状态后,要调用的观察者什么行为,并不关心观察者本身。所以提取人的若干行为,抽象成为接口。

package com.javapatterns.observer;

public interface Listener {
    
    
void see();
    
    
void hear();

}

 

package com.javapatterns.observer;

public class Host implements Listener {
    
    
private String name;
    
    
private short age;
    
    
private String sex;
    
    
public Host(String name,short age,String sex){
        
this.name = name;
        
this.age = age;
        
this.sex = sex;        
    }


    
public void see() {
        
// TODO add see default behavior

    }


    
public void hear() {
        
// TODO add hear default behavior

    }

    
    
public void otherBehavior(){
        
    }


    
public short getAge() {
        
return age;
    }


    
public void setAge(short age) {
        
this.age = age;
    }


    
public String getName() {
        
return name;
    }


    
public String getSex() {
        
return sex;
    }


}


这是一个主人的类,也就是一类具体的Observer。

output.jpg


接口java.util.Observer和类java.util.Observable是Java本身对于观察者模式的支持。

其实这种模式就是一种回调的应用,就是想其它类中注册自己的接口,到特定时候调用自己的方法。

就好像古诗词中,“有朋自远方来不亦乐乎”,意思是说,如果好友光临到门口,叫一声自己,就会很高兴,也就是说,告诉朋友到达自己住处,这个状态满足,那么就叫一声自己,自己就会为朋友开门,高兴等行为就会进行。 如果不采用观察者模式,那就是自己需要不断的到门口察看朋友是否到了,是一种轮循的方式,当然也能达到效果,但会影响自己的事情。

posted @ 2005-11-27 11:26 北国狼人的BloG 阅读(439) | 评论 (0)编辑 收藏
第一次使用Linux,在这上做Java开发.

在Fedora Core 3的发行版中,附带的是GNU版的JRE,下载的最新的 Eclipse SDK 3.1.1,解压以后,根本不能正常启动界面。

由于我们一般能够获取的Linux发行版本都是免费的版本,而不是Professional或者Enterprise Server级别的,这些版本对Sun的JDK支持都很有限


版本检查

我们这个时候可以打开一个命令行终端,输入"java -version",可以看到如下信息:

[ljl@localhost ~]$ java -version
java version "1.4.2"
gij (GNU libgcj) version 4.0.0 20050519 (Red Hat 4.0.0-8)

Copyright (C) 2005 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

看到了吧?这并非Sun官方的Java。

我们需要到Sun的网站上下载最新的JDK,目前的版本是JDK 5.0 Update 5,注意,这里有两个版本:jdk-1_5_0_05-linux-i586-rpm.bin和jdk-1_5_0_05-linux- i586.bin,根据Fedora Core 3的Release Notes说明,应该使用后者,也就是不带rpm的版本。(我用的是jdk-1_5_0_05-nb-4_1-linux-ml.bin,连NetBeans4.1都带了,哈哈)

同时,我们也需要到eclipse.org上下载最新的Eclipse SDK,目前版本3.1.1。需要根据你的系统环境选择合适的下载包,如:我的电脑是x86的,X Window系统用的是GNOME 2.10.0,那么自然应该选「x86/GTK 2」,文件名eclipse-SDK-3.1.1-linux-gtk.tar.gz。需要说明一下,FC3默认的X Window系统是GNOME,但是在KDE环境下,照样可以正常使用GTK的应用程序。


安装和配置

我们现在打开一个命令行终端,输入命令su,提供root用户密码,进入管理员操作模式。然后用ls -l看一下刚刚下载的jdk-1_5_0_05-linux-i586.bin,可以看到它的权限是-rw-r--r--,所有者为sean。为了能够执 行它,需要更改它的权限设置。敲入命令chmod +x jdk-1_5_0_05-linux-i586.bin,再看权限,-rwxr-xr-x,可以执行了。

切换到/opt/目录,运行jdk-1_5_0_05-linux-i586.bin即可。注意:在Linux默认PATH不包含当前目录,即".",因 此执行当前目录的文件,正确的方法是在文件名前面加上"./"。成功以后可以发现在/opt/目录下多了一个jdk1.5.0_05子目录,这就是我们的 JAVA_HOME。

到这里还没完,在终端里检查java -version找到的仍然是原来的GNU版本,我们还需要配置系统的环境变量PATH。检查目前PATH内容的方式是echo $PATH,为了能够直接找到我们自己的java,需要把/opt/jdk1.5.0_05/bin目录加入PATH,并且要在GNU版本的前面,最保险 的办法当然是放到最前面了。方法是PATH="/opt/jdk1.5.0_05/bin:$PATH"。这之后再敲java -version,出来的就是正确的了:

[sean@localhost Java]$ java -version
java version "1.5.0_05"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_05-b05)
Java HotSpot(TM) Client VM (build 1.5.0_05-b05, mixed mode, sharing)

为了今后登录的时候就把这个路径加到环境中,需要修改一下.bash_profile,先cd ~进入自己的主目录,然后用emacs或者vi编辑这个文件,找到PATH这一行,改成:
PATH=/opt/jdk1.5.0_05/bin:$PATH:$HOME/bin
保存,退出,注销然后重新登录。

接下来要做的就是把Eclipse解压到一个你认为合适的路径。


开始使用

有很多方式运行我们的Eclipse:命令行或文件浏览器直接打开都可以。我这里告诉大家一个在GNOME里面比较方便的一种途径:从文件浏览器把eclipse运行文件拖放到系统的面板上,给它一个名字和图标,今后就可以直接点这个面板图标启动Eclipse了。

亲切的Eclipse又出现了,Great!Let's JAVA!
posted @ 2005-11-26 19:23 北国狼人的BloG 阅读(493) | 评论 (0)编辑 收藏
从我第一次认识达内,就是公开课,当然也是免费的.但质量很高,都是资深专家进行讲座.这是达内认真做事的一种侧面表现.

在这里,有经验的精英会和你分享经验,这是无私的,他们原意告诉你IT业界的动态,帮您分析您所处位置,进入IT行业,或者提升职位,要做哪些努力.无论您是否参加达内培训,都可以进行深入交流.

有一点,大家也要注意,达内各个级别的员工都是每周六不休息的,咨询专家,技术专家,人力资源资深专家,每周都有会提供给大家讲座,提供交流的机会.这是 一种反应公司理念的态度.如果再次选择,我仍然选择达内,因为至少我在达内的每时每刻,我永远不会感受到无助.我反倒是觉得现在怎么问题少了,没问题请教 达内的精英,呵呵.

就到这了,假如您在IT职场遇到困惑,可以考虑去听一听,会有收获的.






posted @ 2005-11-26 16:51 北国狼人的BloG 阅读(832) | 评论 (1)编辑 收藏

作为程序员,思维要缜密,对于技术人员,创造只是一小部分,大部分还是要脚踏实地。

所以每个问题一定要想到各种情况,测试人员可能会用你想不到的数据进行测试。

练习1:计算某数的阶乘!

package com.ljl;

public class Factorial {
    
    
public static void main(String[] args)
    
{
        
try{
            
int num = Integer.parseInt(args[0]);
            
if(num < 0)
            
{
                System.out.println(
"please input positive number!");
                System.exit(
0);
            }

            
if(num > 170)
            
{
                System.out.println(
"this program can't calculate this num!");
                System.exit(
0);
            }

            
double result = 1d;
            
for(int i = 2; i <= num; i++)
            
{
                result 
*= i;
            }

            System.out.println(
"The factorial of " + num + " is " + result);
        }

        
catch(Exception ex)
        
{
            
if(ex instanceof ArrayIndexOutOfBoundsException)
            
{
                System.out.println(
"Please input the num to calculate!");
                System.exit(
0);
            }

            
if(ex instanceof NumberFormatException)
            
{
                System.out.println(
"Please input a number!");
                System.exit(
0);
            }

            System.out.println(
"error occured!please run it again!");
            System.exit(
0);
            
        }
        
    }

}


那么对于数据输入的合法性判断,对于数据是否合理,对于程序是否能够计算所有的数,有无上界。

记住,即使不能计算,也要告诉用户,决不能给用户提供错误的答案!!

result 类型如果为int只能算到12,如果为long能算到20,如果为float只能算到32,如果为double,则可以算到170。

为什么double和long同占用8个字节,为什么表示数的范围差那么多?因为double类型支持科学计算法。

The factorial of 170 is 7.257415615307994E306

所以可能用指数方式来表达大数。

那么如果表示170以后的数的阶乘呢?可以猜用类,也可以找两个变量,一个存底数,一个存指数。


=================================

数组

int[] mark = new int[10];40字节存储空间。

-----------------------
对于局部变量,需要初始个值。

而局部变量的数组,不需要初值,会根据类型给定相应默认值。数值为0/0.0,布尔false,对象null,char /u0000

----------------------

mark 是一个int[]数组类型的对象,它保存的是那40字节存储空间的首地址。

Java中,引用和地址都保存在栈中,而具体的值开辟的空间存储在堆中。


System.arraycopy(a,0,b,0,a.length);
int[] a = {1,2,3,4,5}
int[] b = new int[10];
a.length

数组特点
1.不可变长
2.可以保存简单类型数据
3.查找快,插入和删除效率低。



2维数组

int[][] a = {{1,2},{3,4},{5,6}};
int[][] a = new int[3][];
a[0] = new int[2];
a[1] = new int[3];
a[2] = new int[1];

a类型?是一个对象,但是是虚拟机级别对象,无法用getClass().getName()显示。

哥德巴赫猜想

package com.ljl;

public class Goldbach {
    
    
public static void main(String[] args)
    
{
        
int num = Integer.parseInt(args[0]);
        
if(num < 6)
        
{
            System.out.println(
"the num must larger than six!");
            System.exit(
0);
        }

        
if(num%2 != 0)
        
{
            System.out.println(
"it should be a even!");
            System.exit(
0);
        }

        
for(int i = 1; i <= num/2; i++)
        
{
            
if(isZhiShu(i)&&isZhiShu(num-i)){
                System.out.println(num 
+ "=" + i + "+" + (num-i));
                
break;
            }

        }

        
    }

    
    
private static boolean isZhiShu(int num)
    
{
        
for(int i = 2; i <= (int)Math.sqrt(num); i++)
        
{
            
if(num%== 0)
                
return false;
        }

        
return true;
    }

}

posted @ 2005-11-25 23:35 北国狼人的BloG 阅读(302) | 评论 (0)编辑 收藏
变量

1.对局部变量,要先赋值,后使用。
2.一个局部变量,作用域,是定义它的代码块

public class Test{
   public static void main(String[] args){
        {
            int a = 4;
         }
         System.out.println(a);          
   }   
}

a的作用域在main里面的两个括号之间。所以,此程序编译不通过。cannot resolve symbol

3.对于两个局部变量,在同一作用域内不允许两个同名变量出现。

public class Test{
   public static void main(String[] args){
      int a = 6;
      {
         int a = 4;
      }
      System.out.println(a);
   }

}

在小代码块,重了。Duplicate local variable a。

------------------------------

命名规范

1.语义
2.包,所有字母小写
3.类,所有单词首字母大写
4.变量、方法,首字母小写,其余单词首字母大写
5.常量,所有字母大写


byte b=1;
b=b+1;报错,因为b+1运算后,系统转为int,无法隐式转换
b+=1;不报错。请查看JVM,字节码差异。



>>   右移  除2,左补符号位
<<   左移  乘2,右补0
>>>  右移,左永远补0

虽然比乘除运算符快,但是有问题。

12>>32

回变为12。

12&9    按位与
12|9    或
12^9   异或

(a>b)&(c>d)
非短路方式,都判断,并不会因为a>b为假而不进行后面表达式的判断。

(a>b)&&(c>d)
短路方式,a>b为假,后面不执行,直接返回false。

int i = 3;
int count = (i++)+(i++)+(i++);
count = 3 + 4 + 5
            i=4  i=5  i=6

int i =3;
i = i++;
那么流程如下

i++这个表达式的值是3。然后执行i自加1,变为4(因为++操作比赋值优先级高),最后i 再次被赋值为3。



不记运算符优先级,最好用括号老解决,很明白,否则像这样的b+++a表达式,实际上(b++)+a。
posted @ 2005-11-24 23:26 北国狼人的BloG 阅读(380) | 评论 (0)编辑 收藏

Core Java是核心竞争力。

一个.java文件中,只能有一个public class文件,因为Sun规定,Java文件名必须与public的类的名称一致(大小写)

如果没有public class,都是一个个class,编译完成,就会生成若干.class文件。

设置环境变量:

三个变量

JAVA_HOME  指向JDK目录,主要为其他工具能够找到JDK。

PATH 添加JAVA_HOME/bin,为了能找到javac ,java 命令

CLASSPATH .  找到.class文件。可以有多个,逐一路径寻找.class文件,找到第一个为止。好像Unix中,ps有两种具体实现,但是ps只能调出一个一个意思。

表示类路径,.为当前目录。

javac -d . HelloWorld.java
按照源文件包结构生成文件。

package lujl01;

/**
*
*
*/
public class HelloWorld{//类名称
    public static void main(String[] args)
    {
         System.out.println("My name is ");
    }
}

java lujl01.HelloWorld
My name is


byte 1一个字节
short 2个字节
int 4个字节
long 8个字节

int a = 030;
8进制

int a = 0x30
16进制

long l = 40l

byte a = 1;
byte b = 2;
byte c = a + b;

注意,一旦运算,就会变成int。int以下byte,short运算后,一律变为int型。系统对于整型的默认类型就是int。

char 2字节
与int类型互通,而不是short,上面已经说到没有字面值来区分short,byte,int,系统就按int来记整数。

Java中使用Unicode 2字节来进行字符编码。

float f = 1.3f;

末尾f必须写。

double d = 1.3d(或者1.3)

1.3E10,E表示10的为底。

========================

System.out.println(2.0-1.1)
0.899999999999999999

为什么?
因为二进制的缺陷问题,在2进制表达方式下无法进行精确表示0.1,不信可以手算,会丢失精度。

 那么float和double决不能用作精确计算领域(金融,证券,银行),使用java.math.BigDecimal类。


========================
a+b 两个操作数进行计算,转换在Java中如何处理。

1.如果任意一个为字符串,有,结果为字符串
2.如果任意一个为double,有,结果为double
3.如果任意一个为float,有,结果为float
4.有无long,有,则结果为long
5.以上都不是,那么就是int







posted @ 2005-11-23 23:31 北国狼人的BloG 阅读(395) | 评论 (0)编辑 收藏

表的建立有4个步骤

1.表名
2.列名
3.主键,外键,非空,唯一约束
4.外键表,外键列
5.数据类型
6.数据


建表语句

create table lujl11
(id number(7),
start_date DATE DEFAULT SYSDATE)

在同一个用户表空间,不能有同名的表。


========================================


                                 RDBMS
---|---------------------------|-------------------|
DB1(TLAB1)
|-----------------------------|-------------------------|
Table Space(users)         T.S(temp)                    
|---------------------|
schema(s0510)         (j0510)其他用户的目录读权限
|---------|
s_emp    s_dept

为什么sqlplus,一登陆就是某个库,1个用户只能登陆一个库,那么这个库在.cshrc环境变量中,ORACLE_SID表明。在登录到对应用户,使用对应用户的表空间。

openlab上。

SQL> !more .cshrc
# @(#)cshrc 1.11 89/11/29 SMI
umask 022
setenv ORACLE_BASE /tarenadb
setenv ORACLE_HOME /tarenaora/software/9.0.1
setenv ORACLE_SID TARENADB

=======================================

数据类型

VARCHAR2(size)
CHAR(size)
NUMBER(p,s)  p为有效位数,s为小数位数,那么NUMBER(5,2),整数位为3位。
DATE 日期与时间值。
LONG 大文本
RAW和LONG RAW 图像或者声音

约束类型

NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK

约束起名,如果不起名,系统会分配一个名字,SYS_Cxxxx。
约束 最好是 表名_列名_约束类型 
lujl11_dept_id_fk 外键
lujl11_id_pk主键
lujl11_name_nn非空
lujl11_title_uk唯一
lujl11_salary_ckCHECK约束

定义,有列一级定义也有表一级定义,但是效果完全一样。

约束与数据是一对矛盾。谁先存在,谁有理,数据已存在,那么得添加约束要符合数据情况。

非空约束,列级约束。

create table friend
(phone varchar2(15) constraint friend_phone_nn NOT NULL,
)

create table lujl04
(
id number(5) constraint lujl04_id_uk unique,
last_name varchar2(10),
first_name varchar2(20),
salary number(10,2),
constraint lujl04_first_last_name_uk
unique(last_name,first_name)
);

表一级约束,constraint开头。

constraint lujl11_dept_id_fk
foreign key(dept_id)
references s_dept(id)
on delete cascade
级联删除
没有级联更新。


create table emp_41
as
select id,last_name..
from s_emp
where..

除了非空约束存在,其他丢失。



数据字典

user                               users
all     ------->_-------->views
dba                                indexs
                                     constraints

user_tables
user_views
user_indexs
user_constraints
user_sequeces

DML

insert into table
values (102,null,....)

insert into table(id)
values(102)

时间问题,依然要重视

insert into s_emp(id,first_name,last_name,start_date)
values
(25,'Donna','Smith',TO_DATE('01-JAN-99 09:00','DD-MON-YY HH:MI'));

update s_emp
set dept_id = 100
where id = 2;


delete from s_emp;

delele from s_emp
where start_date>TO_DATE('01.01.1996','DD.MM.YYYY')

Transaction 事务

一个事务
多个DML语句
但是一旦遇到DCL(grant),DDL(alter,drop)就会自动提交事物

或者COMMIT提交,

或者ROLLBACK回滚到事物开始。

也就是说,如果先插入了很多记录,再删很多记录,没有commit或者退出,或者DCL,DDL,那么ROLLBACK可以回滚到插入数据之前。

sqlplus--->另外的buff保存着,当前事务涉及到的行,这是操作修改的是buff中的数据,但是这些行记录被锁定,行级所,所以可以rollback,一旦提交,就更新到数据库中了。

除非实时修复DBA能恢复数据。

可以SAVEPOINT,保存事物中间某个标志为,回滚到该标志地方。




ALTER table s_emp
ADD
MODIFY
DROP

约束只能添加和删除,不能修改(除了alter table jerry03 modify (id null))。

ALTER TABLE s_dept
DROP PRIMARY KEY CASCADE

一个表一个主键约束,可以不指定列。正常有外键关联主键,主键约束不能删除,除非CASCADE。

ALTER TABLE s_emp
ENABLE CONSTRAINT s_emp_id_pk;

恢复需要一个一个将外键的表恢复外键约束。

DROP TABLE table CASCADE CONSTRAINTS

Truncate table s_emp;
删除所有数据,不同于delete from s_emp;,它释放了表占据的空间。磁盘空间。

建Sequences,序列独立于表,没关系,,谁都能用该序列。

create sequence lujl11_id
increment by 1
start with 54
maxvalue 9999999
nocache
nocycle

user_sequences

drop sequence lujl11_id;




View

一面墙上有一幅画(数据),前面是一面墙,墙上有窗,那就是视图,不是数据本身,就是select语句,

两类,简单视图(可以DML),复杂视图(不能DML)。

CREATE OR REPLACE VIEW empvu45
(id_number,employee,job)
as select id,last_name,title
from s_emp
where dept_id = 45


CREATE OR REPLACE VIEW empvu44
AS SELECT *
FROM s_emp
WHERE dept_id = 41
WITH CHECK OPTION CONSTRAINT empvu41_ck;一个约束!

就是条件中(where)出现的列不能修改。

WITH READ ONLY 只读


INDEX

B*Tree,就是平分法排序,实现快速查找。

索引会提高查询速度,但会降低插入速度。

1.值分散
2.空值多
3.多列
4.表大
5.更多索引不能提速更多。


  1  select rowid,s_dept.*
  2* from s_dept
SQL> /

ROWID                      ID NAME                       REGION_ID
------------------ ---------- ------------------------- ----------
AAAIlTAAIAAABeqAAA         10 Finance                            1
AAAIlTAAIAAABeqAAB         31 Sales                              1
AAAIlTAAIAAABeqAAC         32 Sales                              2
AAAIlTAAIAAABeqAAD         33 Sales                              3
AAAIlTAAIAAABeqAAE         34 Sales                              4
AAAIlTAAIAAABeqAAF         35 Sales                              5

rowid是地址,天生的主键。非空,唯一。


posted @ 2005-11-22 22:57 北国狼人的BloG 阅读(433) | 评论 (0)编辑 收藏

上回,Select DISTINCT dept_id,title from s_emp,注意DISTINCT是作用于两列的组合。

Group Functions

分组函数

SELECT column,group_function
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BY column];

AVG(DISTINCT|ALL|n)
COUNT(DISTINCT|ALL|expr|*)
MAX(DISTINCT|ALL|expr)
MIN(DISTINCT|ALL|expr)
SUM(DISTINCT|ALL|n)


SQL> select AVG(salary),MAX(salary),
  2  MIN(salary),SUM(salary)
  3  from s_emp
  4  where UPPER(title) LIKE 'SALES%';

AVG(SALARY) MAX(SALARY) MIN(SALARY) SUM(SALARY)
----------- ----------- ----------- -----------
    1463.75        1515        1400        5855


SQL> select count(*)
  2  from s_emp
  3  where dept_id=31
  4  ;

  COUNT(*)
----------
         1

SQL> select count(commission_pct)
  2  from s_emp
  3  where dept_id = 31;

COUNT(COMMISSION_PCT)
---------------------
                    1

注意,count具体列,只统计非空数目。

  1  select dept_id,Count(*) "Number"
  2  from s_emp
  3* group by dept_id
SQL> /

   DEPT_ID     Number
---------- ----------
        31          1
        32          1
        33          1
        34          1
        35          1
        41          2
        42          2
        43          2
        44          2
        45          3
                      8

不写Group by,只是一组,

加了Group by,多组。

出现在Select中,非组函数的值,必须出现加在Group by中。可以不Select某列,但是group by该列,但结果当然也没有这一列,只是按照它来分组显示其他组函数数据。


组函数的判断不能在Where子句中,必须是在Having中。

SELECT title,12*AVG(salary) "ANNUAL SALARY",COUNT(*) "NUMBER OF EMPLOYEES"
FROM s_emp
GROUP BY title
HAVING COUNT(*)>2;

第一步,分组
第二步,应用组函数
第三步,匹配Having子句的组函数

select title,sum(salary) PALALL
FROM s_emp
WHERE title NOT LIKE "VP%"
GROUP BY title
HAVING SUM(salary) > 5000
ORDER BY SUM(salary);

Subqueries 子查询

select last_name,title
from s_emp
where title=
(select title
from s_emp
where last_name='Smith');

select last_name,title,salary
from s_emp
where salary<
(select avg(salary)
from s_emp);

自查询有多值返回时,使用IN关键字

select last_name,first_name,title
from s_emp
where dept_id IN
(select id
from s_dept
where name = 'Finance' or region_id = 2);

子查询也可以出现在Having中

Select dept_id,AVG(salary)
from s_emp
group by dept_id
having avg(salary)>
(select avg(salary)
from s_emp
where dept_id=32);

子查询有效率问题,既能够用连接又能用子查询时,请使用连接,一次查询快!

设置变量

SQL> select id,last_name,salary
  2  from s_emp
  3  where dept_id=&department_number;
Enter value for department_number:

where title = '&job_title';

一般用于插入数据时,进行定义。

可以保存一个.sql文件,在文件的开头设定变量,在执行insert,但sqlplus中,只保存sql命令,不保存sqlplus命令,DEFINE和ACCEPT是sqlplus命令。

DEFINE did=105(CHAR) 都是字符型。

insert into lujl11
values (&did,'&address',&salary);

使用ACCEPT命令来进行变量定义,可以区分类型,和添加提示符

ACCEPT p_dname PROMPT 'Provide the department name'
ACCEPT p_salary NUMBER PROMPT 'Salary amoount:'
ACCEPT pswd CHAR PROMPT 'Password:' HIDE

UNDEFINE或者退出sqlplus,会清楚变量。



SET VERIFY ON
察看新旧值开关。


数据库建模

立项
----〉需求分析
----------------〉设计,设计细化
----------------------------------〉建表,测试(逻辑测试,需求满足否,物理测试,数据量承受力),优化
--------------------------------------------〉真实数据,产品。

实线---必然的联系

虚线---可能的联系

范式

第一范式 解决单值问题。
第二范式 解决依赖性。
第三范式 解决非传递性问题。

例子:一想就明白了

经过需求分析,整理出下列属性。

product#,order#,name,date,price,quantity,customer#,customer_name,customer_address(Province,city,address))

INF分析后

(product#,order#,name,date,price,quantity,customer#,customer_name,Province,City,Address)

2NF分析后

(product#,name,price)
(order#,date,customer#,customer_name,Province,City,Address)
(product#,order#,quantity)

3NF分析后

(product#,name,price)
(order#,date,customer#)
(product#,order#,quantitiy)
(customer#,customer_name,Province,City,Address)





今天安装FC3,费了些时间,为能够在自己机器上也跑上Redhat,安装了Fedora Core 3,http://fedora.linuxsir.org/main/
不错的网站,我就是照着装上的,以后就可以研究一下了。哈哈











 

posted @ 2005-11-22 00:05 北国狼人的BloG 阅读(395) | 评论 (0)编辑 收藏

Data retrieval
-Select

Data manipulation language (DML)
-INSERT,UPDATE,DELETE

Data definition language(DDL
-CREATE,ALTER,DROP,RENAME,TRUNCATE

Transacation control
-COMMIT, ROLLBACK,SAVEPOINT

Data control language(DCL)
-GRANT,REVOKE

使用SQL *Plus进行数据库操作。

openlab.tarena.ca% sqlplus tarena/tarena@TARENADB

用户名/密码

注意这样登录是强烈不推荐的,因为这样别人能看到你的用户名和密码。

SQL> !ps -ef|grep sqlplus
    lujl   966   955  0 08:43:17 pts/1    0:00 sqlplus tarena/tarena@TARENADB
    lujl   969   966  1 08:45:45 pts/1    0:00 /bin/csh -c ps -ef|grep sqlplus
    lujl   971   969  0 08:45:45 pts/1    0:00 grep sqlplus

由于本人已有很多编写SQL语句的经验,所以只记录重点信息。

SQL中可以使用数学表达式

+
-
*
/

先乘除后加减。

SQL> select last_name,salary, 12*salary + 100
  2  from s_emp

注意每一个子句最好单独占一行。这样以便以后的修改,要想写完就执行,最后添加  ‘;’

1。可以给列取别名 Aliase,
2。可以级联两列,作为整体,输出结果。

SQL> select first_name||last_name "Employees"
  2  from s_emp;

Employees
------------------------------
benqu
hui
lgf
liganfeng
lgf
BenDumas
AntoinetteDumas


使用单引号,将字符括起来。

select first_name||' '||last_name
from s_emp;

NULL是一个不确定的值!

对空的任何操作,返回都是空。

使用nvl函数,处理空值,为空就使用默认值。

NVL(salary,1000)

select distinct name
from s_dept;



sqlplus有很多命令。


SQL> help index

Enter Help [topic] for help.

 @             COPY         PAUSE                    SHUTDOWN
 @@            DEFINE       PRINT                    SPOOL
 /             DEL          PROMPT                   SQLPLUS
 ACCEPT        DESCRIBE     QUIT                     START
 APPEND        DISCONNECT   RECOVER                  STARTUP
 ARCHIVE LOG   EDIT         REMARK                   STORE
 ATTRIBUTE     EXECUTE      REPFOOTER                TIMING
 BREAK         EXIT         REPHEADER                TTITLE
 BTITLE        GET          RESERVED WORDS (SQL)     UNDEFINE
 CHANGE        HELP         RESERVED WORDS (PL/SQL)  VARIABLE
 CLEAR         HOST         RUN                      WHENEVER OSERROR
 COLUMN        INPUT        SAVE                     WHENEVER SQLERROR
 COMPUTE       LIST         SET
 CONNECT       PASSWORD     SHOW


DESCRIBE s_dept

SQL> describe s_dept
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER(7)
 NAME                                      NOT NULL VARCHAR2(25)
 REGION_ID 

NUMBER(p,s)p为整数位,s为小数位数
VARCHAR2(s)
DATE  (Oracle中只有一种日期格式!)
CHAR(s)

SQL Plus  提供了很强的编辑SQL语句的能力。

SQL> l 
  1  select first_name||last_name "Employees"
  2* from s_emp
SQL> 1
  1* select first_name||last_name "Employees"
SQL>

list(简写l)
列出缓存中的SQL语句。

1(数字)就是将当前编辑行

看前面有*的,为当前编辑行,再才使用行编辑命令,就需要确定是否是想编辑的行。

A[PPEND] text
C[HANGE] /old/new
CL[EAR]BUFF[ER]
DEL
I[NPUT] text
L[IST] n
n text

由于有时会查出很多记录,这时,需要分页停顿。

SET PAUSE {[OFF|ON] text}

SAVE file写缓存到文件
GET file读入缓存

START filename读文件到缓存,并执行。
@filename = START filename
EDIT filename
SPOOL filename 开始记录,并将执行的命令和结果都写入相应文件。
SPOOL OFF,这时会写入文件。EXIT,正常退出,也会写入文件。

关键命令

COL[UNM] [{column|alias} [option]]

FOR[MAT] format

9
0
$
L
.
,

col last_name format a15   调整last_name为15字符长度,默认为last_name数据类型的长度。(VARCHAR2(35),那就是35),调整列宽。


HEA[DING] text
设置表头

JUS[TIFY] {align}
left center right

column last_name HEADING 'Employee|Name' FORMAT A15
column salary JUSTIFY LEFT FORMAT $099,999,99    保证位数,$012,345,00
column start_date FORMAT A8 NULL 'Not hired'    等同于nvl函数

column last_name
显示某列的格式

column last_name CLEAR





select last_name
from s_emp
order by last_name;
升序默认

desc降序

select last_name,salary*12
from s_emp
order by 2;

按照select子句中的第二项 排序

select last_name,dept_id,salary
from s_emp
order by dept_id,salary DESC;

先按部门排序,如果相同,再按salary降序排。

-------------------------------------------------
where 子句,last_name='Megee',单引号!

日期格式默认为日日-月月月-年年  DD-MON-RR(RR不同于YY,它只取1950到2049年的年,是为解决千年虫问题设定的)

逻辑比较符
= > >= < <=

SQL比较符
BETWEEN...AND...
IN(LIST)  IN(1,3) 1和3
LIKE
IS NULL

逻辑操作符
AND
OR
NOT

不等于!= <> ^=

NOT BETWEEN
NOT IN
NOTLIKE
ISNOTNULL

===============================

LIKE

select last_name from s_emp where last_name like '_M%'

'_' 代表有且只有一格字符

---------------------------

这时,老师发现缓存不够,察看老师的几条命令,应用性很强哦。记下来,以后自己用!

du -sk *|sort
当前目录按照大小的数字排序,

df -k .
察看当前目录的文件系统使用情况。

rm -rf *
不提示删除文件

---------------------------

select table_name
from user_tables
where table_name like 'S\_%' ESCAPE '\';

以S_开头的表名,escape定义了转义字符\


IS NULL  

IS NOT NULL

不要 = null    不出错,但是逻辑不对!

执行顺序

比较操作符〉AND〉OR



==============================

函数

单行函数,输入一个值,输出一个值

多行函数,多输入,单输出。

LOWER('SQL Course')=sqlcourse

UPPER

INITCAP('SqL COurse')=SqL COurse

CONCAT级联

SUBSTR('String',1,3)=Str

LENGTH

NVL


ROUND(45.923,2)=45.92
ROUND(45.923,-1)=50

TRUNC(45.923,2)=45.92
TRUNC(45.923,-1)=50

MOD(1600,300)=100  余数

===========================================

Oracle Date Format是重点

日期包括世纪、年、月、日、小时、分钟、秒几类数

Oracle时间可以保存10负9次方妙

默认显示日期格式为DD-MON-RR

SYSDATE一个能返回当前系统时间的函数

select sysdate from dual;

dual是了保证select语句完整性,设置的,没有实际意义。我认为是个测试函数的好帮手。

YY   05
YYYY   2005
RR   05
RRRR   2005
YEAR   two thousand and five
MM   12
MON   NOV
MONTH   NOVEMBER
DD   18
DDTH   18TH
DDSP   EIGHTEEN
DDSPTH   EIGHTEENTH
HH   03   (12小时)
HH24   15
MI   31   分钟
SS   48   秒
AM   PM
D   5
DY   FRI
DAY   FRIDAY


SQL> select to_char(sysdate,'yyyy mm ddhh miss')
  2  from dual;

TO_CHAR(SYSDATE,'
-----------------
2005 11 1904 1946



时期+/-数字,可以得到一个新的日期。(加在日子上)
两个日期相减,得到一个数字。
如果想加小时到日期上,必须先除以24,在与对应日期相加。

  1  select to_char(sysdate+0.25,'yyyy mm dd hh miss')
  2* from dual

当前时间+6小时的时间。

日期相关函数

MONTHS_BETWEEN('01-SEP-95','11-JAN-94')
19.774194

1  select ROUND(MONTHS_BETWEEN('01-SEP-95','11-JAN-94'))
  2* from dual
  3  ;

20

返回两个日期之间的月差值。

ADD_MONTHS('11-JAN-94',6)

NEXT_DAY('01-SEP-95','FRIDAY')

注意:下一个星期几,但不一定下一周的星期几,找到第一个为准。

LAST_DAY('01-SEP-98')

'30-SEP-98'

ROUND('25-MAY-95','MONTH')
01-JUN-95

TRUNC('25-MAY-95','MONTH')
01-MAY-95




TO_CHAR(date,'fmt')

fm是一个去除前置0或者空格的开关,fm....fm....

fm作用域,是从当前到下一个fm之间的范围。第二个fm后面表示不去除前置0,奇偶变。


TO_CHAR(number,'fmt')

9
0
$
L
.
,


TO_NUMBER(char)

char必须是一个‘数字’



TO_DATE(char[,'fmt'])
不给定日期转换格式,就按照默认的dd-mon-rr,进行转换。



函数可以嵌套

  1  select last_name,
  2  NVL(TO_CHAR(MANAGER_ID),'No Manager')
  3  from s_emp
  4* where manager_id IS NULL




Join方法

等值
非等值
外连接
自连接


必须有连接键,否则就是迪卡尔连接。

  1  select s.last_name,s.dept_id,d.id,d.name
  2  from s_emp s,s_dept d
  3* where s.dept_id=d.id

LAST_NAME          DEPT_ID         ID NAME
--------------- ---------- ---------- -------------------------
Dumas                   31         31 Sales
Dumas                   32         32 Sales
Dumas                   33         33 Sales
payn                      34         34 Sales

外连接是一种特殊的等值连接,用于有空值出现时,寻找到所有记录。

  1  select s.last_name,s.id,c.sal,c.name
  2  from s_emp s,s_customer c
  3* where s.id(+) = c.sal

LAST_NAME        ID        SAL      NAME
--------------- ---------- ---------- -------------------------
Dumas                   12         12         athletes attic
Dumas                   12         12         great athletes
Dumas                   12         12         bj athletics
Dumas                   12         12         athletic for all
Dumas                   12         12         sports,inc
                                          14         athletics two
                                          14         athletics one
                                          14         shhes for sports
                                          14         athletic attire
那个+ 表示有一侧可能没有对应数据。

表示有部分客户没有销售代表。

如果+ 在另外一侧,表示查找所有销售的客户情况。


posted @ 2005-11-19 16:29 北国狼人的BloG 阅读(676) | 评论 (0)编辑 收藏
复习,
Solaris上,比如ftp rusers finger,等都是需要开启服务,才能用的。

需要在/etc/inet/inetd.conf配置才有效。

inetd为超级监听进程,相当于“客户代表”,需要具体工程师来完成任务,比如in.telnetd。

CShell 在执行命令时,实际上是将自己复制一份,再在这个子进程中执行,完成后,就终结了。

后面source ~/.cshrc,这条命令是由C Shell本身来执行的。

=====================================================================

Shell 脚本编程基础。B Shell

那么第一行都是

#!/bin/sh

告诉下面为B Shell下的脚本。

#!/bin/sh
#lowercase any filenames with uppercase chars
for oldname in $*
do
   if [ -f $oldname ]
   then
         newname = `echo $oldname | tr "[A-Z]" "[a-z]"`
         if [ $oldname != $newname ]
         then
               mv $oldname $newname
         fi
   fi
done

sh,很严格。

exec ls

是用当前Shell来执行ls,最后会退出的!

====================================

---------------------------

crontab是另外一种执行程序的手段

crontab -l

croutab是另外一种执行程序的方式,叫做自动调度程序。

crontab -e

      该命令用来编辑cront的执行任务列表,需要设置环境变量EDITOR,来编辑,

      setenv EDITOR vi

crontab -r

      取消cront

0 2 * * * /tmp/a.sh
第一位是分钟,第二位是小事,第三位是天,第四位是月,第五位是星期几 最后是执行哪个文件

13 5 13 * 5 /tmp/b.sh
每月13号并且是星期5的5点13分,执行b.sh

0,30 8-17 * * 1-5 /tmp/c.sh
每月每天并且是周一到周五之间,8点到17点,每半小时执行一次。

/var/spool/cron/crontabs

可以查看mail来查看,执行结果,执行成功或者失败都会 发mail

%mailx

---------------------------
列出目录中隐含文件

ls -al|awk '{print $9}'|grep '^\.'

awk很有用
---------------------------

====================================================

环境变量

两类环境变量

系统的环境变量

应用环境变量

setenv LANG C
setenv LANG zh.GBK

用户主目录下.cshrc

echo $LANG

--------------------------------
setenv AA something

这是临时设置变量,不能永久保存。

想永久保存,需要在配置文件中写入。

C Shell

     /etc/.login ------> $HOME/.cshrc ---> $HOME/.login ----> $HOME/.logout

一般情况下,useradd 命令执行后,会将系统的local.profile local.login local.cshrc拷贝到$HOME/ 下。

而实际做法是,将同组人的配置文件,考到自己主目录,做相应修改,最有效率。



初始化文件的内容,有几个方面

umask,就是创建文件或者目录的默认权限,777-umask 666-umask(文件)

缺省提示符

$path

TERM 终端类型

别名

vi .cshrc 或者 cp ~hiloo/.cshrc
source .cshrc

注意source是当前Shell本身来执行的。


临时
setenv AA abc
unsetenv AA

set bb=abc
局部变量,作用域不同,切换Shell后,失效。

B Shell

AA=abc这是还是局部变量
export AA 将局部变量提升为全局变量

.profile永久,需要自己先行建立。

unset

env 查看所有环境变量



setenv WHO `uname -n`

可以将一个命令执行结果作为环境变量的值

setenv USERCOUNT `who|wc -l`

注意`是飘号,不是引号'

单引号,是字符串
echo '$WTO'
\斜杠,为转义
echo \$WTO
就是表达$WTO的本来面目




$PATH与$path同步更新,一个是全局,一个是局部变量。
因为它太重要了

寻找命令,在PATH中找到第一个的为主。

有时,编写了一个脚本,在当前目录下加入执行权限,但是a.sh不能执行,Command not found!

那是因为环境变量中,没有. ,没有当前目录. ,作为寻找的路径,这也是./a.sh可以执行的原因,强制本地执行命令。

which ps,查看使用的ps命令的路径
whereis ps 查看有哪些ps,路径。





set history=30

alias h history

!!上一条
!n  以开头最近的命令,或者数字 第几条
!48



薛老师的课程结束了,回味无穷,很多以前每天敲很多变的命令变得更有意,老师讲的很到位!对于日后深入学习UNIX,打下良好基础。

==================================================================================
Oracle SQL 张靖老师的口头语为,这说的清楚么?比较亲近
==================================================================================

DML Data manipulation language

DDL Data definition language
         TRUNCATE
         删除数据

DCL GRANT REVOKE


select salary+salary*nvl(commission_pet,0)/100 totalsalary from s_emp;

select first_name||' '||last_name||','||title "Employees" From s_emp;

双引号,大小写敏感。

sqlplus username/password

edit ed
list l

! 临时切换

posted @ 2005-11-17 23:16 北国狼人的BloG 阅读(544) | 评论 (0)编辑 收藏

补充两点

echo 反显命令
可以用来创建文件

echo aaa>a.txt
echo bbb>>a.txt追加

users 查看在线用户
比who看到的信息少,但是同时刻用户数一样

统计当前在线用户数

openlab.tarena.ca% users
xiaoyao lujl xiaoyao tanjh
openlab.tarena.ca% users|wc -w
       4

等价于

openlab.tarena.ca% who|wc -l
       4

===========================================================

find / -name file
find . -mtime 10 -print 修改时间距现在正好10天
find /etc -user 0 -size +400 -print /etc目录下 user为0,也就是root为owner的文件,并大小大于400的文件
      注意两个条件为与关系,并且大于400,是data block。

      1data block = 512bytes   也就是 400 data block = 200K

find ~ -perm 777 > ~/holes
      权限为777的
find /export/home -type f atime +365 -exec rm {} \;

      注意后面,-exec空格rm空格{}空格\;  一个都不能少,才可执行删除,删除目录-exec rm -r {} \;

可以用于删除文件名为rm某参数的不可删除文件

例如
      echo aaa>-i 为形成-i的文件

      openlab.tarena.ca% rm -i
      usage: rm [-fiRr] file ...

那么就需要这样来删除
      find . -name '-i' -exec rm {} \;

grep -i  不区分大小写
grep -v 过滤不匹配后面的串

ls -l|grep ^d
      那么就是列出该目录中的子目录

ls -l|grep -v ^d
      列出文件了,因为是-v
与li -l|grep ^-等价

grep file *
到每个文件中寻找"file"串
         
more file*
可以同时查看多个file1,file2,file3。。。的内容。

diff file1 file2

openlab.tarena.ca% echo aaa>file1
openlab.tarena.ca% echo bbb>file2
openlab.tarena.ca% diff file1 file2
1c1
< aaa
---
> bbb

提示说明,将第一个文件的第一行修改成为bbb

openlab.tarena.ca% more file*
::::::::::::::
file1
::::::::::::::
aaa
ccc
::::::::::::::
file2
::::::::::::::
bbb
openlab.tarena.ca% diff file1 file2
1,2c1
< aaa
< ccc
---
> bbb

提示,第一、二两行都变成bbb



openlab.tarena.ca% more file*
::::::::::::::
file1
::::::::::::::
aaa
ccc
::::::::::::::
file2
::::::::::::::
aaa
ccc
zzz
openlab.tarena.ca% diff file1 file2
2a3
> zzz

在第一个文件的第二行后,加入第二个文件的第三行的内容

openlab.tarena.ca% more file*
::::::::::::::
file1
::::::::::::::
aaa
ccc
::::::::::::::
file2
::::::::::::::
aaa
ccc


zzz
openlab.tarena.ca% diff file1 file2
2a3,5
>
>
> zzz

第一个文件第二行,加入第二个文件中的3到5行内容。

openlab.tarena.ca% diff file1 file2
6d5
< xxx

----------------------------------------

openlab.tarena.ca% more file1 file2
::::::::::::::
file1
::::::::::::::
aaa
ccc

zzz

xxx
::::::::::::::
file2
::::::::::::::
aaa
ccc

zzz
openlab.tarena.ca% diff file1 file2
5,6d4
<
< xxx

注意是将第一个文件的5到6行删除,到第二个文件的第四行。


--------------------------------------------------------------------------

ps -ef

e所有进程 f详细列表方式

PID 进程号
PPID 父进程号

任何进程最后都能追踪到inetd

sh -> csh -> in.telnetd -> inet -> init(1) -> sched(0)

ps -ef|grep inetd|grep -v grep|wc -l



ps -ef|more 有各列表头

STIME进程开始时间

TTY 终端 Console
?表示与终端脱离关系的进程,应该是daemon

TIME 累计占用时间

CMD进程名称


/usr/ucb/ps -auwx|more

ps的另外一个实现版本



进程有几种状态,运行,就绪,挂起,僵尸进程。

<default>,由于父进程出现问题,当子进程已经没有了,告诉父,但是父没有消除它,这样造成任在进程表中保留一项,累计多后,对系统造成影响。

上述情况,由程序员造成。解决,杀死父进程。

kill -9 12487

-9表示无条件杀死

pkill sleep
      不需要进程号

-------------------------------------
sleep 100 前台运行,不释放终端控制
sleep 100& 后台运行

jobs -l 列任务

bg 任务号
fg 任务号


stop 进程号 挂起后台进程
Control -z挂起前台进程。
Control -c放弃前台进程。


------------------------------------------

ls file*|xargs grep file

分解输入

grep file file1 file2

查内容了,不等同于ls file*|grep file,将结果给grep,而是分解file*为file1 file2再给grep

--------------------------------------------

/etc/hosts
ip与主机名的对应表
/etc/netmasks
/etc/defaultrouter
默认网关
/etc/hostname.hme0
主机名称

/etc/resolv.conf
DNS

/etc/nodename
网卡对应的名称,一台机器有可能有多个网卡,而主机名只有一个,与/etc/hostname.hme0不同。


ping 127.0.0.1(loop back地址),是检查逻辑地址有效否?也就是检查TCP/IP是否安装好?

netstat -rn 查看硬件

rusers -l tarenalab3
远程看lab3上的在线用户。

traceroute www.sina.com.cn

finger user1@tarenalab1



telnet

rlogin hostname -l lujl

----------------------

ftp hostname

lcd 显示本地目录,和设置本地目录

hash 打#每1024

prompt交互信息开关

mget mput

mdelete

rename  可以移动文件!!!!!!!

wall 广播 Ctrl + D

write

talk

mesg -y|-n

posted @ 2005-11-16 22:47 北国狼人的BloG 阅读(319) | 评论 (0)编辑 收藏

touch命令

如果文件不存在,创建新文件。
文件存在,同时更新访问和修改时间。

注意文件的更新时间和访问时间不一样。

touch file1
vi file1

添加内容。

ls -lt 会看到该文件的最后修改时间。
过一些时候,执行more file参看一下该文件,也就是访问一下。
ls -lu会看到该文件最后访问的时间。

这是再touch file1,ls -lt和ls -lu会看到同样的时间。


做不了事(执行不了动作),你要检查几件事!

1.你是谁 (id命令)

openlab.tarena.ca% id
uid=25791 gid=103(tarena)

2.你在哪(pwd),你对某个文件的关系(owner group同组者 other)

3.你是否能在某目录里做事(读ls 写创建文件 执行cd),看看这个目录的权限
   
      在该目录下,执行 ls -ld,查看该目录
      注意:回上一级,执行ls -l lujl,是查看该目录下文件和子目录的权限。

ls -al lujl 可以查看隐藏文件。

ls -R 将该目录下所有文件夹递归展开

su - somebody 就是将环境变量也更换为somebody的,否则不更新,cd时回原来的用户的主目录。



一些基本命令。

mkdir -p dir6/dir7/dir8 可创建层级目录

cp -i beans apple 文件存在,会提示,-i作用

===============================
openlab.tarena.ca% cp -r dir3 dir4

注意:如果dir4不存在,那么就先建立dir4,在将dir3中内容拷贝过去,如果dir4存在,则是将整个dir3包括dir3本身,整个目录结构拷贝过去。

openlab.tarena.ca% ls
dir3   file1
openlab.tarena.ca% cp -r dir3 dir4
openlab.tarena.ca% ls -R
.:
dir3   dir4   file1

./dir3:
a.txt

./dir4:
a.txt
openlab.tarena.ca% cd dir4   
openlab.tarena.ca% rm *
openlab.tarena.ca% cd
openlab.tarena.ca% ls
dir3   dir4   file1
openlab.tarena.ca% cp -r dir3 dir4
openlab.tarena.ca% ls -R
.:
dir3   dir4   file1

./dir3:
a.txt

./dir4:
dir3

./dir4/dir3:
a.txt


mv 命令相当于给文件改名称

mv 源 目标

目标不存在,相当于给源改名称

目标存在,对于文件,覆盖
                    对于目录,移动整个目录结构到目标目录中。

openlab.tarena.ca% ls
dir3   file2
openlab.tarena.ca% mkdir dir4
openlab.tarena.ca% ls
dir3   dir4   file2
openlab.tarena.ca% mv dir3 dir4
openlab.tarena.ca% ls -R
.:
dir4   file2

./dir4:
dir3

./dir4/dir3:
a.txt

rm -r[i] directory_name(s)
rmdir只能删除空目录

题外话

      /tmp 每个系统根下都有一个临时文件夹,查看该目录权限,

      openlab.tarena.ca% cd /tmp
      openlab.tarena.ca% ls -ld
      total 64
      drwxrwxrwt   4 0        sys          753 11月 15 20:06 .
      openlab.tarena.ca% 

     看好了,那不是777,而是后面有个t,1777,它表示/tmp里,谁都能写,读,删。但是必须是该文件的owner。

     chmod 1777 dir



ln

两种链接,

硬连接和符号连接(软连接)

openlab.tarena.ca% ls -l
total 4
drwxr-xr-x   3 25791    tarena       512 11月 15 20:03 dir4
-rw-r--r--   1 25791    tarena        13 11月 15 19:38 file2

兰色表示硬链接数,对于目录,那个数字表示该目录下文件和子目录数总和。

openlab.tarena.ca% cp file2 file2.bak
openlab.tarena.ca% ln file2 file2.ln
openlab.tarena.ca% ls -il
total 8
    858670 drwxr-xr-x   3 25791    tarena       512 11月 15 20:03 dir4
    409639 -rw-r--r--   2 25791    tarena        13 11月 15 19:38 file2
    409792 -rw-r--r--   1 25791    tarena        13 11月 15 20:23 file2.bak
    409639 -rw-r--r--   2 25791    tarena        13 11月 15 19:38 file2.ln
openlab.tarena.ca%

注意硬链接后,被链接文件和链接文件的inode号,是相同的,他们是同一个inode,硬链接号加1。

=================================================
inode i节点 关键概念

   touch beans这个命令执行时,创建一个文件时到系统中申请一个i节点,如果申请不到,就不会创建成功。

  i节点保存这除文件名以外的关于这个文件的所有属性。大小,属主,属组,权限,数据块指针。

那么那个数据块(data block)指针,指向一个数据块。

一个目录也有inode,inode中数据块指针指向的数据块保存着该目录的文件名与inode的对应信息。

==================================================

软链接

ln -s beans beans.sln

openlab.tarena.ca% ls -il beans*
total 10
    409793 -rw-r--r--   1 25791    tarena         0 11月 15 20:52 beans
    409794 lrwxrwxrwx   1 25791    tarena         5 11月 15 20:53 beans.sln -> beans
openlab.tarena.ca%

注意,beans和beans.sln的inode号不同,说明是两个文件。那么beans.sln的大小是5,基本可以理解为保存着beans的名称,以便能够找到它。

这时,more beans.sln实际上 先找到beans.sln的inode-〉数据块-〉5个字母beans->more beans

系统中就有软链接的例子,

openlab.tarena.ca% cd /
openlab.tarena.ca% ls -l|grep bin
lrwxrwxrwx   1 0        root           9  5月 28  2002 bin -> ./usr/bin
drwxr-xr-x   2 0        sys         1024  5月 16  2004 sbin
openlab.tarena.ca%

可以看到 bin就是./usr/bin的软链接。



man name 查看命令
man -k function 查看函数    man -k setuid

空格
b back
f forward
q
/string search
n 查找一个

ls d??=ls dat
ls [a-f]b*

cd;ls

标准输出重定向
cal 5 2007>a.txt
cal 5 2007>>a.txt追加

ls -l /etc|more

cal 5 2007|tee cal.lst
tee是个3向头,既显示,又重定向到cal.lst文件中。

cal 5 2007|tee -a cal.lst
追加

cat /dev/null > ~/b.txt
清空文件,回收datablock

cat /etc/passwd | awk -F: '{print $1 "\t" $6}' \
|sort >~/userinfo

\是指要换行继续写命令
然后就是awk和sed有很强的文本处理能力。


tail -30 a.txt
head -30 a.txt
tail -f ServiceStartupLog.txt

more filename(s)操作和man一样!

openlab.tarena.ca% who am i
lujl       pts/2        11月 15 19:27   (219.236.137.165)

查看登陆用户

whoami显示有效用户。su后,会看到结果。

==========================================================

 VI

  底行模式 :/? 命令模式 i a o 输入模式(Esc退出)

kljh 上右下左

i插入
a后
o当前行下插入新行 大写O当前行上插入新行

vi file1

i

some words

Esc

:w!

直接输入vi

编辑到最后

Esc
:wq! file2

保存file2,并退出

不保存直接退
:q!

保存后直接退
:wq!
:x!
ZZ


命令模式下

G 最后一行
1G第一行,输入没有时间限制

当前屏幕

Shift +L 最下
Shift +H 嘴上
Shift +M中间

Ctrl D 滚下半屏
Ctrl U 滚上半屏
Ctrl F 滚下整屏
Ctrl B 滚上整屏

r 修改一个字母
cw 修改某个单词
cc 整行
C 替换光标到行尾

yw
yy
p
:1,8co6
:1,6m8

x
dw
dd
5dd
:5,10d

u UNDO

~
大小写
J 连接下一行
:set nu
:21=21G
/
?
n 继续查找
:r file2

:1,$/要替换/新串/g
g表示全部替换

:1,19/^/#/
表示1到19行开头加入#,注释掉


^表示行首,这也是为什么Shift +6回到当前行行首,(Shift+4行尾)















posted @ 2005-11-15 21:51 北国狼人的BloG 阅读(439) | 评论 (0)编辑 收藏

hanlj给我们做了精要的开学典礼。

1,时刻想想1万3千8可不是小数字对于没毕业的自己,所以当你在能听讲的时候,走神;能练习的时候发呆;能复习的时候,看电视,那你就是在浪费1万多块钱!

2,对自己执行归零操作,如果权限不够,请使用ROOT强制执行,把你原来那点东西收起来吧,重新输入正统功力,至少让达内精英帮你自己原有内功重新梳理,理顺吧!

3,专注(专心学习,学好了,挑战到高薪,才是对关爱你的人最大回报,而不是嘴上说,身边陪。)

      勤劳(多用功,学习容量很大哦)
   
      积极(用最大的热情去学习每一个知识点,没有漏洞)

      沟通(应该有很多人能够认识)

4,安排时间,培养好习惯。

学习流程:

      [Core Java]JDBC[Core C++][C++ 高级][Java 高级][Web实战][J2EE OO OA OD][IP计费项目实战]

今天正题:

[Unix基础] 老师用最易懂的方式将我看了很多书或者帖子都没弄懂的问题,搞懂了,印象很深刻。

学习路径

登录、登出Solaris系统
漫游Solaris文件系统
建立文件和文件夹,并且改变权限
操作文本文件,并使用vi编辑器
使用命令来查找目录以及文件
使用基本网络命令
识别和改变初始化文件,环境变量的设置*(不同Shell)


Solaris = SunOS + CDE

Solaris 2.5 = SunOS 5.5

Solaris 在1980,由Berkeley加入了VM(虚拟存储)支持,TCP/IP网络,vi,csh等

三大概念

Kernel

Kernel管理设备,内存,进程,控制系统程序/工具和系统硬件,管理交换去,精灵进程,文件系统和其他功能。

Shell

File System

C Shell和文件系统比较重要对于开发者。

A shell is an interface between the user and the kernel,which acts as an interpreter or translator.

Shell实质上是一个程序,一登录,系统帮你运行的。

B Shell
K Shell
*C Shell
ba Shell

B Shell系统管理员比较喜欢用,很多启动脚本中,都是B Shell写的。

C Shell是B Shell的扩展,支持history,并且编程环境与C类似,每个Shell脚本都是C语言风格。与B Shell的语法不兼容,例如设置环境变量不同的句法不同。

tcsh是csh的增强扩展版本。

ps命令,查看当前用户使用的Shell。

从csh进入sh,那么csh是sh的父Shell。exit退出子Shell,回到上一级Shell。

进入系统的默认Shell,叫做登录Shell,在/etc/passwd中记录。

bash有保存命令历史的作用,支持 上 下 键。

$su进入超级用户root。

Solaris文件系统

命令df -k,查看目录,与文件系统关系以及使用情况。

会发现,

/dev/dsk/c0t0d0
/dev/dsk/c0t1d0

如果c0t0d0部分不完全相同,表示两块硬盘,那么上面的是两块物理硬盘。

c控制位,t目标位,d磁盘位。

那么对于一个5G的磁盘,要进行分区,那么分出来的叫做Slice:片

c0t0d0s0~c0t0d0s7,一共是8个,但是c0t0d0s2表示整个磁盘不能分,也就不能表示。所以一块磁盘最多分7个Slice。

/c0t0d0     ------>   format -------> s0 2G大小 s1 3G大小。

/c0t0d0s0   -------> newfs 做文件系统,那么文件系统是建立在Slice上的。那么newfs实质上是在分数据块block.

那么最后新的文件系统要挂接到(mount)到根上,那么就是钩在目录上。

挂接命令mount  /dev/dsk/c0t0d0s0 /opt

那么可以仔细看一下文件系统了。

/dev/dsk/c0t1d0s0 8260757 4269347 3908803 /newusers

8260757 由于是以kbytes为单位,三位一分,基本上是8G总大小。

===================================================================

/sbin/ifconfig -a 查看ip地址。

====================

more /etc/passwd
   
   luolu:x:30662:10::/newusers/sd0510/luolu:/bin/csh

用户名:密码位(密码信息存在在/etc/shadow中,密文保存):UID:GID::主目录:登陆Shell。

===================================================================

pwd - print working directory

cd ~hiloo 表示进入hiloo的主目录。cd直接空格和cd ~表示自己的主目录。
cd ../.. 退两级

查看文件类型的三种方式

ls -l

- 文件 d 目录

file 文件名

ls -F

显示文件类型


目录的读权限,是否可以查看文件列表
目录的写权限,是否可以生成文件和子目录或者删除文件与子目录
执行权限,就是指是否可以'cd 该目录'

rw-          r--                      r--
对owner  对同组其他人  对其他人
可以看成由9个0和1组成,所以000到111,对每类用户的权限是8种变化,值为0到7。

rwx r-x r-w 755
rw- r-- r-- 644

只有root和某文件的owner才能修改该文件的权限。

改变文件权限的两种方式:

chmod 644 file
chmod 755 file

chmod g-r file1
chmod u+x,go+r file1在原有权限基础上,给文件owner加执行权限,给同组和其他人加读权限。
chmod a=rw file1 (表示让所有用户,都是rw权限,那么就是666)

touch filename(s)

posted @ 2005-11-14 21:55 北国狼人的BloG 阅读(527) | 评论 (0)编辑 收藏

今天终于有时间去听课了,高兴。

今天最重要的收获,了解了衡量自己的几个基本方面。

1,就是知识结构层次,教育程度
2,技术技能,实际的应用
3,经验,那么做过某项工作,和没做过肯定是不一样的。
4,阅历,阅历主要是指正确知识或者认知,在遇到很多事情时,得到验证,而获得的新的体会。

还有人成功的几点

1,品德,
2,毅力,
3,抓住每次机遇,不一是享福,好的机遇,很多吃苦的机会,也是很重要的。比如三伏天对着电脑,汉流夹背的编程,编一天。或者其他吃苦的机会。为什么?!其实很简单,人类的潜意识会告诉你答案,当你在人生路上再遇到很难过的时候,你会想到之前那么苦,那么累都能支撑过来,这算什么!所以任何机会都是锻炼人的!
4,积累人脉,


posted @ 2005-11-12 17:18 北国狼人的BloG 阅读(752) | 评论 (0)编辑 收藏
2个月前,一个老朋友(发小)让我帮他老板制作网站,那时的我兴致很高,以为很简单的一个商务网站,我就直接信用卡买了空间,就做。

中间,也没有什么需求,就照着经验制作。当然也连老板都没见到就做完了。自己还梦想着拿钱。

结果,人家根本不是这么想的,找了另外的人负责网站的人,一个女人。失败,说界面不行,重新修改。

又说¥……%¥—…………%74#%……¥#·……¥·#

反正需求跟我做的基本不大一样。

我当时恨不得。。。


我正好已经辞职了,所以有功夫,改吧,我就重新设计,重新做网页,重新做程序。

原来的网站,还用Web标准做的,DIV+CSS,其实在我看来都是扯淡,还不够累得呢,脑子全用在CSS上了。还是Table定位方便,几个Table一套。OK。以前的经验让我在短短一周重做了一个新网站。


昨天,又去谈了谈,其实人家老板还是很爽快的,我说支付一部分费用,等都改好了,再支付另外的。

拿到1500,唉,累。。。。


这件事以后,记住不做朋友介绍的活,其实也是不做私活,因为如果拿着高新,您把工作做到家,会有更大利益,私活没有保证阿!!!!

做项目,一定不要先投入太多,把需求谈好,初稿定了,然后拿到定金,再投入。记住了朋友。
posted @ 2005-11-12 08:08 北国狼人的BloG 阅读(717) | 评论 (1)编辑 收藏
今天想在网页中加一个随着滚动的广告吧,竟然郁闷了一下午!原来因为网页中一句不起眼的语句。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

这会导致js无法运行!

========================================================

指定了 HTML 文档遵循的文档类型定义(DTD)。

Microsoft? Internet Explorer 6 的新增内容
你可使用此声明将 Internet Explorer 6 及以后版本切换到标准兼容模式下。

语法

HTML  顶级元素  可用性 "注册//组织//类型 标签//定义  语言""URL"

可能值

顶级元素 指定 DTD 中声明的顶级元素类型。这与声明的 SGML 文档类型相对应。 HTML 默认。HTML。
 
可用性 指定正式公开标识符(FPI)是可公开访问的对象还是系统资源。 PUBLIC 默认。可公开访问的对象。
SYSTEM 系统资源,如本地文件或 URL。
 
注册 指定组织是否由国际标准化组织(ISO)注册。 + 默认。组织名称已注册。
- 组织名称未注册。Internet 工程任务组(IETF)和万维网协会(W3C)并非注册的 ISO 组织。
 
组织 指定表明负责由 !DOCTYPE 声明引用的 DTD 的创建和维护的团体或组织的名称,即 OwnderID。 IETF IETF。
W3C W3C。
 
类型 指定公开文本类,即所引用的对象类型。 DTD 默认。DTD。
 
标签 指定公开文本描述,即对所引用的公开文本的唯一描述性名称。后面可附带版本号。 HTML 默认。HTML。
 
定义 指定文档类型定义。 Frameset 框架集文档。
Strict 排除所有 W3C 专家希望逐步淘汰的代表性属性和元素,因为样式表已经很完善了。
Transitional 包含除 frameSet 元素的全部内容。
 
语言 指定公开文本语言,即用于创建所引用对象的自然语言编码系统。该语言定义已编写为 ISO 639  语言代码(大写两个字母)。 EN 默认。英语。
 
URL 指定所引用对象的位置。

注释

此声明必须出现在文档的起始处,出现在 html 标签之前。

!DOCTYPE 元素不需要关闭标签。

此元素在 Microsoft? Internet Explorer 3.0 的 HTML 中可用。

你可使用此声明在 Internet Explorer 6 及以后版本中切换为严格的标准兼容模式。若想打开此开关,请在你的文档顶部包含 !DOCTYPE 声明,在声明中指定合法的标签,在某些情况下,还需要指定定义和/或 URL。下面的表格列出了标准兼容模式的开关情况。 DOCTYPE 出现 URL 未出现 URL
未出现 DOCTYPE 关 关
HTML (无版本) 关 关
HTML 2.0 关 关
HTML 3.0 关 关
HTML 4.0 开 开
HTML 4.0 Frameset 开 关
HTML 4.0 Transitional 开 关
HTML 4.0 Strict 开 开
XHTML 开 开
XML 开 开
无法识别的 DOCTYPE 开 开


注意 在标准兼容模式下,不能保证与其它版本的 Internet Explorer 保持兼容。当打开标准兼容模式时,文档的渲染行为也许与将来版本的 Internet Explorer 不同。若内容本来就是固定的(如刻录在 CD 上),则不应该使用此模式。

示例

下面的例子演示了如何使用 !DOCTYPE 声明指定文档遵从的 DTD,并将 Internet Explorer 6 及更高版本切换到标准兼容模式。
下面例子中的声明都指定了遵从 HTML 4.0 DTD。第二种声明指定了“Strict”。第一种声明没有指定。这两种声明都将会把 Internet Explorer 6 及以后版本切换到标准兼容模式。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN">

下面例子中的声明都指定了遵从“Transitional”HTML 4.0 DTD。第二种声明指定了 DTD 的 URL。第一种声明没有指定。第二种声明将会把 Internet Explorer 6 及以后版本切换到标准兼容模式。第一种声明不会。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">


======================================================

使用正确的doctype声明

虽然大多数Web文档的顶部都有doctype声明,但很多人都没有注意它。它是在你新建一个文档时,由Web创作软件草率处理的众多细节之一。



虽然doctype被许多人忽视,但在遵循标准的任何Web文档中,它都是一项必需的元素。doctype会影响代码验证,并决定了浏览器最终如何显示你的Web文档。


doctype的作用
doctype声明指出阅读程序应该用什么规则集来解释文档中的标记。在Web文档的情况下,“阅读程序”通常是浏览器或者校验器这样的一个程序,“规则”则是W3C所发布的一个文档类型定义(DTD)中包含的规则。

每个DTD都包括一系列标记、attributes和properties,它们用于标记Web文档的内容;此外还包括一些规则,它们规定了哪些标记能出现在其他哪些标记中。每个Web建议标准(比如HTML 4 Frameset和XHTML 1.0 Transitional)都有自己的DTD。

假如文档中的标记不遵循doctype声明所指定的DTD,这个文档除了不能通过代码校验之外,还有可能无法在浏览器中正确显示。对于标记不一致的问题,浏览器相较于校验器来说更宽容。但是,不正确的doctype声明经常导致网页不正确显示,或者导致它们根本不能显示。


选择正确的doctype
为了获得正确的doctype声明,关键就是让DTD与文档所遵循的标准对应。例如,假定文档遵循的是XHTML 1.0 Strict标准,文档的doctype声明就应该引用相应的DTD。另一方面,如果doctype声明指定的是XHTML DTD,但文档包含的是旧式风格的HTML标记,就是不恰当的;类似地,如果doctype声明指定的是HTML DTD,但文档包含的是XHTML 1.0 Strict标记,同样是不恰当的。

有的时候,也可以根本不使用一个doctype声明。如果没有指定有效的doctype声明,大多数浏览器都会使用一个内建的默认DTD。在这种情况下,浏览器会用内建的DTD来试着显示你所指定的标记。对于一些临时性的、匆忙拼凑的文档(这种文档有许多),你确实可以考虑省略doctype声明,并接受浏览器的默认显示。

完全可以从头编写一个doctype声明,并让它指向自己选择的一个DTD。然而,由于大多数Web文档都需要遵循由W3C发布的某个国际公认的Web标准,所以那些文档通常都要包含以下标准doctype声明之一:

HTML 2:

<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN">

HTML 3.2:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">

HTML 4.01 Strict:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">

HTML 4.01 Transitional:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

HTML 4.01 Frameset:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
"http://www.w3.org/TR/html4/frameset.dtd">

XHTML 1.0 Strict:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

XHTML 1.0 Transitional:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

XHTML 1.0 Frameset:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

XHTML 1.1:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

XHTML 1.1 plus MathML plus SVG:

<!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
"http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">

除了上面列出的doctype声明,具有特殊要求的一些文档还使用了其他几种声明。

doctype声明通常是文档的第一行,要在<html>标记以及其他文档内容之前。注意,在XHTML文档中,doctype的前面偶尔会出现一条XML处理指令(也称为XML prolog):

<?xml version="1.0" encoding="utf-8"?>

为了确保网页正确显示和顺利通过验证,使用正确的doctype是关键。与内容相反的、不正确的或者形式错误的doctype是大量问题的罪魁祸首。在未来的专栏文章中,我还会具体解释如何诊断及纠正这些问题。


==============================================
其他关于这个问题的帖子:
http://search.teein.com/results.aspx?q=DTD&st=PST&SiteID=29&hl=zh-cn&lu=http%3A%2F%2Fwww.blueidea.com%2Fimg%2Fcommon%2Flogo.gif&rt=%BE%AD%B5%E4%C2%DB%CC%B3%CB%D1%CB%F7%BD%E1%B9%FB&ku=http%3A%2F%2Fwww.blueidea.com%2F



曾经也是网页大师,现在也要好好学学细节问题了,呵呵

http://www.w3cn.org/article/step/2004/26.html





posted @ 2005-11-08 15:40 北国狼人的BloG 阅读(399) | 评论 (0)编辑 收藏
昨天辞掉了不开心的工作,准备去进行外企IT培训,在达内科技。在写这篇随笔的时候,我已经重新ghost了本本,完全是全新的,因为我要开始进行旅程,我要去提升自己,挑战未来,挖掘出我的潜力,我能做出这样的决定,我真的要感谢我生命中一个特殊的人,她将会改变了我的一生(我上完课会把这句话改为“已经改变”,那时会有坚实的证据),资深人力资源总监Nancy Sun。

8月的我很迷茫,因为我那时觉得工资较低,又没有项目做,只能天天看AdventNet的技术文档,虽然说我们公司(远达网络)是全国第一个也是唯一一个能够真正应用AdventNet分布式版本到实际项目(联通VoIP网络管理系统)的公司,但是毕竟是基于WebNMS的进行的二次开发,当然也需要深刻了解网管系统的作用以及基本实现方法,例如网管系统包括拓扑管理、故障管理、性能管理、配置管理、资源管理。还需要透彻掌握基本网管理协议(SNMP)的各个方面,比如get、set、trap和共同体。还有mib信息库的树结构(各个网络设备要想被管理一定要实现的保存设备状态的信息库),以及流行网络管理系统的基本架构。然后掌握AdventNet Web NMS架构,了解印度鬼子开发的这个产品的开发接口,最后根据实际需要特定网络设备的被管对象建模,即可进行开发。

我那时对于Java的开发经验主要还是在于Struts,并没有特别好的J2SE功底,呵呵,实话实说。所以我迫切希望能够全面透彻的掌握Java,而不是对于做那些不练功底的项目。我喜欢在项目中来学习、实践,那样学习技术是最好的、最快的途径,这个道理我早在北工大放飞技术网时,做Web项目还有.Net项目时就知道了(我的放飞兄弟和邓萧大哥让我明白,做才是硬道理!)。但是!但是目前没有这样的环境,我陷入了苦恼,我感觉到成天操作着Solaris 9干着无聊的事情,看着很好的分布式Java应用,却不知道是如何设计出来的。我迫切的想提高自己,我想到了培训,大公司都有培训,而我这样的小公司没有培训(一切要毕业的大学生,尤其是北工大校友,你们一定要紧记一定要去大公司,肯定是有好处的)。我确实忘记了是从哪里看到的达内科技网站了,我第一眼看到达内网站首页时,虽然不是很专业和美观,但是可以看出比较朴实,可信。

后来,一次下班后,我去了达内,我惊讶于我是一个普通的咨询者,而达内的业务人员却可以很详细和热心的来为我咨询,虽然那时并没有解决我的问题,因为那时我都有点怀疑我自己的能力了(很严重吧,那时基本上可以说是比较自卑的一段时间),听到业务人员让我改行做测试,或者回到微软的.NET道路上,我内心最深处的最后一点能量挽救了我,告诉我绝不是没有能力的人,不能放弃Java! I love Java!那天我了解到周末会有专门的人生职业规划,我想听听前辈人的话,再做决定。

一周后,我再次来到达内听课,得知资深人力资源总监因身体原因没有来,感到非常遗憾。既然来了,就听听吧,有韩总(当时还不知道代替讲IT人生职业规划就是达内的CEO),我仔细的听了讲解,我唯一感觉到的就是技术功力的深厚,我当时竟然不知道C++的构成,以前也一直不认为掌握好JAVA不一定需要学习C++,然后那堂课之后,我改变很多对于技术深度和编程语言以及软件工程师的很多观点,比如软件工程师决不是年轻饭!收获满大的,就是最后想和韩老单独沟通时,没有机会,很遗憾(技术人员真是很高傲)。

为了我的未来,为了明确未来的目标,又过了一周,我再次来到达内,我选择了第一排第一个(这也是我以后上课的位置),我看到一位美丽的、着装很讲究的职业女性(好似女强人)来到讲台,我深深被您讲课中的每一句话所表现出来的自信和灿烂的笑容所打动,您基本了分析到了我所有遇到的问题,并给与了令人信服的答案。一、各个类型的职业,工资大概范围,这是我第一次意识到选择计算机,选择软件工程师的幸运,也是我第一次从一个职场精英的口中得到的最可信的数据。二、你真帮我分析一个重要的问题,就是何去何从?我想我那时真的不知道自己要去哪里?自己在哪里?更谈不上如何到目的地!我只知道我想赚很多钱,为我的父母,为我的女友。三、我了解到在IT领域内,各个类型的职业重要程度是怎么样的?当我知道答案后,为自己一直选择软件行业领域的工作感到一丝欣慰。结束后,您不顾您讲课后的辛苦,能够很诚恳的接受我的邀请,让我和您单独交流,深深的觉得您是那么资深的专家,却一定架子都没有,我真的想给您鞠一躬。这也是我后来跟您交流时,激动地流泪的原因,虽说好男儿流血不流泪,但那时我确实像找到知音一样非常激动,我控制不了了,后来回想起来,觉得自己像个小孩,但我知道您决不会笑话我。感谢您在我人生低谷时,提携我一把。Nancy Sun,我在这给您鞠躬了!您永远是我人生轨迹上最重要的人之一。

今天,我已经辞退了工作,准备准备要到达内学习了,我是个较内向的人,有时并不像其他人那样会表达,在您身边时,我可能表现得会表现的比较“冷”,您千万不要介意啦。

今天,我去北京口腔医院看牙了,竟然补了三颗牙,请所有的IT工作者,休息一天假,去全面检查一下牙齿吧,中国人太不注意牙齿了,别等到牙疼得要拔牙了,才想起还存在牙科医生。

希望我以后一路走好,也祝所有关爱我的人一路平安、幸福!
posted @ 2005-11-01 16:35 北国狼人的BloG| 编辑 收藏

由于篇幅较长,请查看对于IoC的概要介绍

posted @ 2005-10-31 16:09 北国狼人的BloG 阅读(504) | 评论 (0)编辑 收藏
OFFICE里,电脑是我们最重要的一件办公用品,很难想像,如果没有了电脑,我们将如何工作。但遗憾的是,当我们享受着电脑带给我们的一切方便的同时,也不得不接受它在身心两方面对我们健康的威胁。所以,了解电脑“病”,防治电脑“病”,已经成为我们刻 不容缓的事情。为了全面了解电脑对OL身心的负面影响,我们特地组织这次策划,全面介绍缓解OL们最难逃脱的八大电脑“病”的窍门和方法。

  罪状一:电磁辐射 

  症状:失眠、内分泌紊乱

  致病原因:显示器热度过高,在工作时就会有相当多的电磁辐射,它会使空气发生电离作用,不断产生正电荷(正离子),并不断与空气中的负离子中和,导致负离子的含量几乎为零。负离子多有益,正离子就多有害,长期处于正离子过多的环境中,它们通过呼吸进入 肺,然后随血液循环被输送到人体的各个组织,使人的血液、体液呈酸性,延缓身体正常的代谢功能,使毒素囤积在体内。使人失眠、免疫力下降、女性内分泌紊乱等。

  缓解方法

  1. 仔细地打扫办公环境。因为正离子会牢牢地吸附在灰尘颗粒上,灰尘越多,则正离子越多。
  2. 多喝茶。茶叶中含有的茶多酚等活性物质,有助吸收放射性物质。
  3. 显示器散发出的辐射多数不是来自它的正面,而是侧面和后面。因此,不要把自己显示器的后面对着同事的后脑或者身体的侧面。
  4. 常喝绿茶。绿茶是近几年来最为人所津津乐道的养生饮品,因为其中含强效的抗氧化剂儿茶酚以及维他命C,不但可以清除体内的自由基,还能使副肾皮质分泌出对抗紧张压力的荷尔蒙,对于情绪暴躁有很大改善。不过,最好在白天饮用,以免影响睡眠。
  5. 绿豆可以清热解毒、利尿消肿,薏仁则可以健脾止泻、轻身益气,经常需要熬夜工作或是心烦气躁、口干舌燥、便秘时,对于消除烦躁情绪非常有帮助。
  6. 勤洗脸可以防止辐射波对皮肤的刺激。
  7. 在电脑桌下摆放一盆植物或水,可以吸收电脑所发出的电磁波。
  8. 尽量使用液晶显示器。
  9. 穿着防辐射肚兜。

  罪状二:灰尘场

  症状:皮肤过敏
  致病原因:处于开机状态的显示器周围会形成一个静电场,它差不多会把整个房间的空气中悬浮的灰尘吸入自己的场中,从而使得面部皮肤受到刺激,会出现过敏起疹等现象。坐在电脑前,你的周围便充满了含有大量灰尘颗粒的空气,因此,使用者的皮肤非常容易产生 皮疹等过敏现象。

  缓解方法

  1. 不要在电脑周围摆放堆积如山的纸和文件,应该把所有必需的文件分门别类地放进柜子,因为纸张和文件上的灰尘通常不易清洁。
  2. 电脑桌表面用湿布蘸着抗静电剂擦拭。
  3. 经常开窗通风。
  4. 使用电脑之前在脸上擦些保湿霜,或者用洋甘菊浸液浸湿毛巾(更简单的方法是用湿的洋甘菊茶袋)直接敷在额头和脸颊上。
  5. 在电脑桌上摆放一盆仙人掌,因为仙人掌的针刺能够吸收灰尘。
  6. 经常清洁键盘,使用键盘时及使用后应先洗手再进食,不使用时用布将键盘遮盖。因为键盘凹凸不平,非常容易积累灰尘,更会成为皮肤病病菌、感冒病菌隐藏的场所。

  罪状三:画面闪烁、散发热度造成环境干燥

  症状:干眼症
  致病原因:虽然肉眼无法看出来,但事实上显示器上的画面是一直在闪烁的。看显示器时,我们往往会长时间地盯着某一个点,很少眨眼,因此眼肌容易疲劳,眼黏膜发干,眼睛发红、发炎、疼痛。在电脑前不间断工作4小时后,几乎所有人的眼睛都会出现酸痛和沙眼 的感觉。电脑工作者的工作环境密闭,环境中的湿度低,计算机不断散发热度,在干燥环境下,泪液层几秒钟就蒸发掉了,成为干眼症的重要诱因。

  缓解方法

  1. 距显示器需要70厘米以上,放置位置应比双眼视线略低,并使眼球暴露于空气中的面积减小到最低。
  2. 把亮度调整到不使眼疲劳的程度。
  3. 在电脑前工作时,房间既不能太昏暗,也不能太明亮。理想的办公环境是——房间的亮度和屏幕的亮度相同。
  4. 因为要避免屏幕上显现出你的脸、灯光以及物体的影像(所有的光影会加倍地使眼睛疲劳),所以,要避免室内的光线直接照射在屏幕上而产生干扰光线。光源最好来自电脑使用者的左边或右边。如果你戴眼镜,应该给自己配一副带有防反光加膜的镜片。
  5. 为了防止结膜发干,在使用电脑时滴一些与我们眼泪成分相同的眼药水。
  6. 眼睛疲劳时,用以淡红茶水煮过的湿巾敷几分钟眼睛,会很快消除充血和疲劳。
  7. 将黑豆500克,炒熟后待冷,磨成粉。核桃仁500克,炒微焦去衣,待冷后捣如泥。取以上两种食品各1匙,冲入煮沸过的牛奶1杯后加入蜂蜜1匙,早晨或早餐后服食。能增强眼内肌力,加强调节功能,改善眼疲劳的症状。

  罪状四:长期使用鼠标

  症状:鼠标手(即腕关节综合征)
  致病原因:长期使用电脑键盘和鼠标,可能与一种称为腕关节综合征的疾病挂上钩,出现食指或中指疼痛、麻木和拇指肌肉无力感,发展下去可能导致神经受损,进而引起手部肌肉萎缩。问题出在每天重复在键盘上打字或移动鼠标,手腕关节长期、密集、反复和过度活 动,导致周围神经损伤或受压迫,使神经传导被阻断,从而造成手掌的感觉与运动发生障碍。另外,肘部经常低于手腕,而手高高地抬着,神经和肌腱经常被压迫,手就会开始发麻,手指失去灵活性,经常关节痛。手指频繁地用力,还会使手及相关部位的神经、肌肉因过度 疲劳而受损,造成缺血缺氧而出现麻木等一系列症状。据调查,女性发生“鼠标手”比男性多,这是因为,女性手腕通常比男性小,腕部正中神经容易受到压迫。

  缓解方法

  1. 尽量避免上肢长时间处于固定、机械而频繁活动的工作状态下,使用鼠标或打字时,每工作一小时就要起身活动活动肢体,做一些握拳、捏指等放松手指的动作。
  2. 使用电脑时,电脑桌上的键盘和鼠标的高度,最好低于坐着时的肘部高度,这样有利于减少操作电脑时对手腕的腱鞘等部位的损伤。
  3. 使用鼠标时,手臂不要悬空,以减轻手腕的压力,移动鼠标时不要用腕力而尽量靠臂力做,减少手腕受力。
  4. 不要过于用力敲打键盘及鼠标的按键,用力轻松适中为好。
  5. 鼠标最好选用弧度大、接触面宽的,有助力的分散。
  6. 使用鼠标时配合使用“鼠标腕垫”垫在手腕处。

  罪状五:脑功能减弱

  症状:记忆力帅退
  致病原因:随着个人电脑的日益普及,人们正越来越多地受到记忆力减退的困扰,主要原因是他们对电脑的依赖过强,从而使得自己的脑功能反而减弱。

  缓解方法

  1. 睡前平躺在床上,全身放松,将头仰放在床沿以下,缓解大脑供血及供氧的不足。
  2. 保证充足的睡眠。不论工作有多紧张,每日8小时的睡眠是必不可少的,而且要尽量保证睡眠质量,使大脑皮层的血液循环得到适时的调节。
  3. 静想练习。最好每天能有20-30分钟时间静想生活中轻松美好的事情,聆听自己呼吸的节律,让情绪尽量放松。姿势不拘,或坐或卧,以舒适为准。
  4. 学习使用五笔输入法,不要总是使用智能拼音的联想输入法,平时能用手写的文字就尽量不要使用电脑输入,即便一定需要电子文件,也可以尽量使用手写板输入文字。
  5. 改变不健康的饮食结构,多食用健脑食品。

  罪状六:长时间采用不正确坐姿

  症状:颈、肩、腰部疼痛
  致病原因:如果使用电脑时高高地架着胳膊,低着头,并且在桌子下艰难地跷着二郎腿,那么,工作一小时你就会感到腰背酸痛,脖子和肩膀麻木,手臂也不灵活。这样的坐姿保持一年至一年半,你就可以获得双下巴、颈椎关节僵硬。

  缓解方法

  1. 上半身应保持颈部直立,使头部获得支撑,两肩自然下垂,上臂贴近身体,手肘弯曲呈90度,操作键盘或滑鼠,尽量使手腕保持水平姿势,手掌中线与前臂中线应保持一直线。下半身腰部挺直,膝盖自然弯曲呈90度,并维持双脚着地的坐姿。
  2. 必须选择符合人体工学设计的桌椅,使用专用的电脑椅,坐在上面遵循“三个直角”:电脑桌下膝盖处形成第一个直角,大腿和后背是第二个直角,手臂在肘关节形成第三个直角。肩胛骨靠在椅背上,双肩放下,下巴不要靠近脖子。两眼平视电脑荧幕中央,座椅最好有支持 性椅背及扶手,并能调整高度。
  3. 放风筝:放风筝时,挺胸抬头,左顾右盼,可以保持颈椎、脊柱的肌张力,保持韧带的弹性和脊椎关节的灵活性,有利于增强骨质代谢,增强颈椎、脊柱的代偿功能,既不损伤椎体,又可预防椎骨和韧带的退化,实在是老祖宗留给我们防治颈椎病的一个好方法。
  4. 游泳:因为游泳的时候头总是向上抬,颈部肌肉和腰肌都得到锻炼,而且人在水中没有任何负担,也不会对椎间盘造成任何的损伤,算得上是比较惬意的锻炼颈椎的方式。
  5. 使用电脑每隔一小时应休息5至10分钟,做柔软操或局部按摩,同时养成规律运动习惯,针对肩颈、上肢进行拉筋及肌力训练,以增加柔软度及肌力。
  6. 电脑的摆放高度要合适。将电脑屏幕中心位置安装在与操作者胸部同一水平线上,最好使用可以调节高低的椅子。应有足够的空间伸放双脚,膝盖自然弯曲呈90度,并维持双脚着地,不要交叉双脚,以免影响血液循环。
  7. 眼睛与显示器保持恰当的距离。眼睛与电脑显示器形成轻度向下注视荧光屏的角度,这样可使颈部肌肉得到放松。
  8. 舒缓体操
  A: 基本姿势:每次做各项训练动作前,先自然站立,双目平视,双脚略分开,与肩同宽,双手自然下垂。全身放松。
  B: 前俯后仰:双手叉腰,先抬头后仰,同时吸气,双眼望天,停留片刻;然后缓慢向前胸部位低头,同时呼气,双眼看地。做此动作时,要闭口,使下颌尽量紧贴前胸,停留片刻后,再上下反复做4次。动作要旨是:舒展、轻松、缓慢,以不感到难受为宜。
  C: 左右旋转:双手叉腰,先将头部缓慢转向左侧,同时吸气于胸,让右侧颈部伸直后,停留片刻,再缓慢转向右侧,同时呼气,让左边颈部伸直后,停留片刻。这样反复交替做4次。
  D: 提肩缩颈:做操前,先自然站立,双目平视,双脚略分开,与肩平行,双手自然下垂。动作时双肩慢慢提起,颈部尽量往下缩,停留片刻后,双肩慢慢放松地放下,头颈自然伸出,还原自然,然后再将双肩用力往下沉,头颈部向上拔伸,停留片刻后,双肩放松,并自然呼气 。注意在缩伸颈的同时要慢慢吸气,停留时要憋气,松肩时要尽量使肩、颈部放松。回到自然式后,再反复做4次。
  E: 左右摆动:做操前,先自然站立,双目平视,双脚略分开,与肩平行,双手叉腰。动作时头部缓缓向左侧倾斜,使左耳贴于左肩,停留片刻后,头部返回中位;然后再向右肩倾斜,同样右耳要贴近右肩,停留片刻后,再回到中位。这样左右摆动反复做4次。在头部摆动时需 吸气,回到中位时慢慢呼气,做操时双肩、颈部要尽量放松,动作以慢而稳为佳。

  罪状七:思维形成定式,不习惯与人相处

  症状:电脑忧郁症
  致病原因:长时间的电脑操作形成“非此即彼”的思维定式,不习惯与人达成妥协和谅解,丧失自信,身心疲惫,以致工作难以展开。

  缓解方法

  1. 做好自我心理调整,及时纠正思维方式。
  2. 积极处理好人际关系,尤其与同事的关系。

  罪状八:过度依赖电脑而情绪紧张烦躁

  症状:电脑躁狂症
  致病原因:由于对电脑过度依赖,所以当电脑出现故障后,会精神紧张,情绪烦躁、不安,甚至有对电脑“动武”的倾向,如通过用力敲打键盘、鼠标,大骂电脑,摔砸电脑等方式发泄怒火,有的还将不满情绪发泄在家人或同事身上。

  缓解方法

  1. 一旦电脑出现故障,立即找专业人士来维修,避免独自坐在电脑桌前,应当尽快转移视线和注意力,放松心情。
  2. 随时保存工作文档,用移动硬盘将资料备份,这样一旦电脑出现问题,不会受到太大损失,情绪不至于骤然失控。
  3. 不要长时间坐在电脑前工作,每隔一段时间走开喝杯茶、咖啡或活动一下四肢。

  电脑一族的健康食品

  健脑元素

  1. 脂肪:它是健脑的首要物质。它在发挥脑的复杂、精巧的功能方面具有重要作用。
代表性食物有坚果、芝麻、自然状态下饲养的动物等。
  2. 蛋白质:它是智力活动的物质基础,是控制脑细胞兴奋与抑制过程的主要物质。代表性食物有瘦肉、鸡蛋、鱼类等。而碳水化合物是脑活动的能量来源,它在体内分解为葡萄糖后,即成为脑的重要能源。代表性食物有杂粮、糙米、红糖、糕点等。充足的维生素C可以使大脑 功能灵活、敏锐,并提高智商。代表性食物有鲜果类、黄绿色蔬菜等。
  3. B族维生素:它是智力活动的助手。包括维生素B1、维生素B2、叶酸等,当B族维生素严重不足时,就会引起精神障碍,易烦躁,思想不集中,难以保持精神安定。代表性食物有香菇、野菜等。坚果含有大量的蛋白质、不饱和脂肪酸、卵磷脂、无机盐和维生素,经常食 用,对改善脑营养供给很有益处。香菇对高血压、动脉硬化有较为明显的疗效,有消除疲劳、提神、稳定精神、防止贫血和癌症等功效。
  4. 鸡蛋:它含有丰富的蛋白质、卵磷脂、维生素和钙、磷、铁等,是大脑新陈代谢不可缺少的物质。另外,鸡蛋含有较多的乙酰胆碱,是大脑完成记忆所必需的。
  5. 鱼类:它可为大脑提供丰富的蛋白质、不饱和脂肪酸和钙、磷、维生素B1、维生素B2等,它们都是构成脑细胞及提高其活力的重要物质。
  6. 黄花菜:它富含蛋白质、脂肪、钙、铁、维生素B1,这些都是大脑代谢所需要的物质,因此有“健脑菜”之称。
  7. 洋葱:它含有抗血小板凝聚的物质,能够稀释血液,改善大脑供血,对消除心理疲劳和过度紧张大有益处,每天吃半个洋葱可以收到良好的健脑效果。
  8. 小米:它含有较丰富的蛋白质、脂肪、钙、铁、维生素B1等营养成分,有“健脑主食”之称。小米还有防治神经帅弱的功效。
  9. 龙眼:它能补益心脾,益血安神。凡是因为心脾两虚导致的健忘、失眠、心悸、智力帅退等,可以通过服食龙眼来调整。
  10. 柚子:它含有大量维生素A、维生素B1和维生素C,属于典型的碱性食物,可以消除长期使用电脑对神经系统造成的危害。常吃能使人精力充沛,有醒脑促记忆的作用。此外,橘子、柠檬等也有类似功效。

  护眼元素

  1. 维生素C:它对眼睛也十分有益。人眼中维生素C的含量比血液中高出数倍。随着年龄增长,维生素C含量明显下降,晶状体营养不良,久而久之会引起晶状体变性。所以要多吃维生素C含量丰富的蔬菜、水果。
  2. 菠菜:它含有蛋白质、脂肪、碳水化合物、粗纤维、钙、磷、铁、胡萝卜素、核黄素等,它不仅是营养价值极高的蔬菜,也是护眼佳品。
  3. 西红柿:它含有丰富的维生素、矿物质、碳水化合物、有机酸及少量的蛋白质。因带酸性,所以有保护维生素C的作用,烹煮过程中不易被破坏。
  4. 维生素A:由于电脑作业者眼睛过久注视电脑荧光屏,可使视网膜上的感光物质视紫红质消耗过多,若未能及时补充其合成物质维生素A和相关营养素,会导致视力下降、眼痛、怕光、暗适应能力降低等等。因此,电脑作业者对维生素A的需要量比一般人要高,所以,应多 吃富含维生素A的食物。
  5. 枸杞子:它含有丰富的β胡萝卜素、维生素B1、维生素C、钙、铁,具有补肝、益肾、明目的作用,因为本身就具有甜味,不管是泡茶或是像葡萄干一样当零食吃,对电脑族的眼睛酸涩、疲劳、视力减退等问题都有很大的帮助。
  6. 菊花茶:有明目清肝的作用,有些人就干脆把菊花和枸杞子一起泡茶喝,或是用蜂蜜和菊花茶一起冲泡,对于缓解眼睛疲劳也非常有效。

  眼睛的健康杀手

  酒精
  酒精是漂亮眼睛的头号大敌。过度饮酒会导致眼睛暗淡无神、眼球充血;长期酗酒更会导致眼部皮肤粗糙和色斑。
  对付这个大敌的方法是:对于酒类躲得越远越好;如果实在躲不过,不得已而喝了酒,一定要多饮些水或吃些水果来抵消其对皮肤的不良影响。
  烟草
  近来的科学研究更加明确指出,烟草一旦燃烧起来,绝对是一个不可忽视的敌人。不但对呼吸系统有很大的危害,长期吸烟也会加速皮肤老化。烟草燃烧产生的烟雾会带走皮肤大量的水分,可导致眼睛周围的皱纹产生。
  即使自己不吸烟,也不应放松警惕,二手烟同样会摧残你的身心和容颜。当你和你的烟民朋友们聚会时,是否真的非常快乐?是否真的可以丝毫不介意皱纹渐渐爬上眼角?如果你没有那么释然,就和他们保持一定距离吧。
  电脑“病”往往是慢慢形成的,爆发性不强,对身体的危害也不十分明显,很容易被人们忽视,它虽不会造成生命危险,却不容小觑,它会引发身体其他方面的连锁疾病,影响工作和生活质量,它对人体的潜在危害十分大。因此,对必须长期使用电脑的人来说,做好防 护工作非常重要。
posted @ 2005-10-31 16:05 北国狼人的BloG 阅读(1156) | 评论 (0)编辑 收藏
1、伸伸懒腰,松松骨,每小时都要做


3、不想变硬颈,得转转转,两边转!


4、千万千万千万,每小时转转胳膊!


5、办公坐姿有讲究!


6、拿鼠标有正确姿势哦!!!


7、记住每小时转转脚松松筋


8、记住每小时松松手拉拉筋


9、记住每小时踢踢腿,拉拉筋


posted @ 2005-10-31 16:03 北国狼人的BloG 阅读(1819) | 评论 (1)编辑 收藏
近代研究表明,久坐不动容易诱发多种疾病。

  久坐损心

  久坐不动血液循环减缓,日久则会使心脏机能衰退,引起心肌萎缩。尤其是患有动脉硬化等症的中老年人,久坐血液循环迟缓最容易诱发心肌梗塞和脑血栓形成。

  久坐伤肉

  祖国医学早就认识到“久坐伤肉”。久坐不动,气血不畅,缺少运动会使肌肉松弛,弹性降低,出现下肢浮肿,倦怠乏力,重则会使肌肉僵硬,感到疼痛麻木,引发肌肉萎缩。

  损筋伤骨

  久坐颈肩腰背持续保持固定姿势,椎间盘和棘间韧带长时间处于一种紧张僵持状态,就会导致颈肩腰背僵硬酸胀疼痛,或俯仰转身困难。特别是坐姿不当(如脊柱持续向前弯曲),还易引发驼背和骨质增生。久坐还会使骨盆和骶骼关节长时间负重,影响腹部和下肢血液循环,从而诱发便秘、痔疮,出现下肢麻木,引发下肢静脉曲张等症。

  久坐伤胃

  久坐缺乏全身运动,会使胃肠蠕动减弱,消化液分泌减少,日久就会出现食欲不振、消化不良以及脘腹饱胀等症状。

  伤神损脑

  久坐不动,血液循环减缓,则会导致大脑供血不足,伤神损脑,产生精神厌抑,表现为体倦神疲,精神萎靡,哈欠连天。若突然站起,还会出现头晕眼花等症状。久坐思虑耗血伤阴,老年人则会导致记忆力下降,注意力不集中。若阴虚心火内生,还会引发五心烦热,以及牙痛、咽干、耳鸣、便秘等症。

  健康顾问建议:为了你的身心健康,不要久坐下棋,玩麻将,老年人更不可久坐家中闭门不出。凡工作需要久坐的人,不但要注意保持正确的坐姿,而且一次最好不要连续超过一小时,工作中每2小时中间最少应进行10分钟的工作操,或伸伸懒腰,或自由走动走动,以舒展四肢,缓解疲劳。
posted @ 2005-10-28 11:29 北国狼人的BloG 阅读(928) | 评论 (0)编辑 收藏
一个医生朋友针对我下午犯困的状况,提出了一些防止脑疲劳的建议。主要是调节酸碱平衡,当用脑过度或体力透支时,体液呈酸性;长期酸性血液会使大脑神经功能退化。因此要多吃碱性食物,如海带、绿叶蔬菜、柑橘水果、豆类、茶叶,少吃酸性食物,如肉类、糖类。
  选择恢复精力和体力的食物建议程序员每天下午茶时间补充一些干果,如花生、腰果、杏仁、核桃等,它们含有丰富的VB、VE、蛋白质和必需的脂肪酸及矿物质。还可补充含维生素C的水果。早中晚餐都要多吃西红柿、菜花等蔬菜,千万不要多吃大鱼大肉和油炸食物,饱餐这些食物会使你更感愚钝。
  平日多吃健脑食物蛋白质中的谷胱甘肽可提高脑细胞的活力,如动物肝脏、鱼类就是大脑需要的食物,大脑还“偏爱”卵磷脂,增强记忆力全靠它,蛋黄、大豆就有丰富的卵磷脂,而吸收它们还需要含辅酶的胡萝卜、绿叶蔬菜。另外,天麻、山药、人参也可在煲汤时选用,可增智力。
  喝杯茶也能减缓疲劳,为缓解疲劳,程序员可泡制一杯健脑茶,可选枸杞加五味子、陈皮、麦冬、龙眼肉,还可饮甘菊泡绿茶,但不可太浓。另外,“五禽戏”也可疏通经络,延缓脑衰老。
posted @ 2005-10-27 17:41 北国狼人的BloG 阅读(1245) | 评论 (0)编辑 收藏
内容篇幅较长,请点击这里阅读全文
posted @ 2005-10-27 12:55 北国狼人的BloG 阅读(328) | 评论 (0)编辑 收藏


How To Ask Questions The Smart Way

Copyright (C) 2001 by Eric S. Raymond
中文版Copyleft 2001 by D.H.Grand(nOBODY/Ginux)

英文版:http://www.tuxedo.org/~esr/faqs/smart-questions.html
感谢Eric的耐心指点和同意,本文才得以完成并发布,本指南英文版版权为Eric
Steven Raymond所有,中文版版权由D.H.Grand[nOBODY/Ginux]所有。


====
简介
====

在黑客世界里,当提出一个技术问题时,你能得到怎样的回答?这取决于挖出答案
的难度,同样取决于你提问的方法。本指南旨在帮助你提高发问技巧,以获取你最
想要的答案。


首先你必须明白,黑客们只偏爱艰巨的任务,或者能激发他们思维的好问题。如若
不然,我们还来干吗?如果你有值得我们反复咀嚼玩味的好问题,我们自会对你感
激不尽。好问题是激励,是厚礼,可以提高我们的理解力,而且通常会暴露我们以
前从没意识到或者思考过的问题。对黑客而言,"问得好!"是发自内心的大力称
赞。

尽管黑客们有蔑视简单问题和不友善的坏名声,有时看起来似乎我们对新手,对知
识贫乏者怀有敌意,但其实不是那样的。

我们不想掩饰对这样一些人的蔑视--他们不愿思考,或者在发问前不去完成他们应
该做的事。这种人只会谋杀时间--他们只愿索取,从不付出,无端消耗我们的时间
,而我们本可以把时间用在更有趣的问题或者更值得回答的人身上。我们称这样的
人为"失败者"(由于历史原因,我们有时把它拼作"lusers")。

我们也知道,很多人只想使用我们编写的软件,对技术细节没什么兴趣。对多数人
们而言,计算机不过是一个工具,一种达到目的的手段;他们有更重要的事情要做
,有更重要的生活要过。我们明白这点,也并不奢望每个人都对另我们痴狂的技术
问题有兴致。然而,我们回答问题的风格是针对这样一群人--他们有兴趣,并且愿
意积极参与问题的解决。这点不会改变,也不应该改变;如果变了,我们将失去我
们引以为傲的效率。

我们在很大程度上属于志愿者,从繁忙的生活中抽出时间来解惑答疑,而且时常被
提问淹没。所以我们无情的滤掉一些话题,特别是抛弃那些看起来象失败者的家伙
,以便更高效的利用时间来回答胜利者的问题。


如果你觉得我们过于傲慢的态度让你不爽,让你委屈,不妨设身处地想想。我们并
没有要求你向我们屈服--事实上,我们中的大多数人最喜欢公平交易不过了,只要
你付出小小努力来满足最起码的要求,我们就会欢迎你加入到我们的文化中来。但
让我们帮助那些不愿意帮助自己的人是没有意义的。如果你不能接受这种"歧视"
,我们建议你花点钱找家商业公司签个技术支持协议得了,别向黑客乞求帮助。


如果你决定向我们求助,当然不希望被视为失败者,更不愿成为失败者中的一员。
立刻得到有效答案的最好方法,就是象胜利者那样提问--聪明、自信、有解决问题
的思路,只是偶尔在特定的问题上需要获得一点帮助。

(欢迎对本指南提出改进意见。任何建议请E-mail至esr@thyrsus.com,然而请注
意,本文并非网络礼节的通用指南,我通常会拒绝无助于在技术论坛得到有用答案
的建议。)
(当然,如果你写中文,最好还是寄到DHGrand@hotmail.com;-)

========
提问之前
========

在通过电邮、新闻组或者聊天室提出技术问题前,检查你有没有做到:
1. 通读手册,试着自己找答案。
2. 在FAQ里找答案(一份维护得好的FAQ可以包罗万象:)。
3. 在网上搜索(个人推荐google~~~)。
4. 向你身边精于此道的朋友打听。

当你提出问题的时候,首先要说明在此之前你干了些什么;这将有助于树立你的形
象:你不是一个妄图不劳而获的乞讨者,不愿浪费别人的时间。能说明你从这些操
作中学到了什么就更好了。如果提问者能从答案中学到东西,我们更乐于回答他的
问题。

周全的思考,准备好你的问题,草率的发问只能得到草率的回答,或者根本得不到
任何答案。越表现出在寻求帮助前为解决问题付出的努力,你越能得到实质性的帮
助。

小心别问错了问题。如果你的问题基于错误的假设,普通黑客(J. Random
Hacker)通常会用无意义的字面解释来答复你,心里想着"蠢问题...",希望着
你会从问题的回答(而非你想得到的答案)中汲取教训。

决不要自以为够资格得到答案,你没这种资格。毕竟你没有为这种服务支付任何报
酬。你要自己去"挣"回一个答案,靠提出一个有内涵的,有趣的,有思维激励作
用的问题--一个对社区的经验有潜在贡献的问题,而不仅仅是被动的从他人处索要
知识--去挣到这个答案。

另一方面,表明你愿意在找答案的过程中做点什么,是一个非常好的开端。"谁能
给点提示?"、"我这个例子里缺了什么?"以及"我应该检查什么地方?"比"
请把确切的过程贴出来"更容易得到答复。因为你显得只要有人指点正确的方向,
你就有完成它的能力和决心。

========
怎样提问
========

------------
谨慎选择论坛
------------

小心选择提问的场合。如果象下面描述的那样,你很可能被忽略掉或者被看作失败
者:
1. 在风马牛不相及的论坛贴出你的问题
2. 在探讨高级技巧的论坛张贴非常初级的问题;反之亦然
3. 在太多的不同新闻组交叉张贴

黑客们通常砍掉问错地方的问题,以保护自己的社区不被大量无关帖子淹没。你不
会希望自己的帖子被这样砍掉吧。

总的说来,问题发到精心挑选的公众论坛,比发到封闭的小圈子更容易得到有用的
答案。这一现象有多种原因,其中之一是公众论坛有更多潜在的问题回答者;另一
个原因是公众论坛有更多的听众。黑客们更愿意让尽量多的人--而非有限的一两个
--从回答中受益。

----------------
尽量使用邮件列表
----------------

如果某项目有自己的开发邮件列表,要把问题发到这个邮件列表而不是某个开发者
,即使你很清楚谁最能回答你的问题。仔细查看项目文档和项目主页,找到这个项
目的邮件列表地址,这样做的理由有四:
1. 任何值得问某位开发者的好问题,都值得向整个开发团体提出。反之,若你认
为这个问题不值得在邮件列表中提起,就没有理由用它来骚扰任何一位开发者。

2. 在邮件列表提问可以分担开发者的工作量。某位开发者(尤其当他是项目负责
人的情况下),可能忙得没时间回答你的问题。
3. 大多数邮件列表都有历史存档,而且都能在搜索引擎中检索到。人们可以从中
找到你的问题和答案,不用一遍又一遍在列表中发问。
4. 如果某个问题经常被提出,开发者可以据此改进文档或改进软件,以减少用户
的困惑。而如果问题总在私下提出,就不会有人对此有整体上的把握了。

如果你找不到项目的邮件列表地址,只能看到项目维护者的,那就写给维护者吧。
在这种情况下,也别以为邮件列表并不存在。在你的信中写明你已尽力寻找,仍无
法找到邮件列表。另外表明你不介意将此消息转给他人。(大多数人认为私信就应
该是私下的,即使并没有什么可保密的内容。允许你的消息被转寄给他人,给了收
信者一种处理你邮件的选择。)

----------------------------
用辞贴切,语法正确,拼写无误
----------------------------

我们从经验中发现,粗心的写作者通常也是马虎的思考者(我敢打包票)。回答粗
心大意者的问题很不值得,我们宁愿把时间耗在别处。

因此,明确充分表述你的问题非常重要。如果你嫌这样做麻烦,我们也会懒得搭理
你。注意推敲你的用辞,不一定要用呆板正式的语言--事实上,黑客文化的价值观
是不拘小节。准确的运用俚语和富有幽默感的语言,但别乱用;一定要能表明你在
思考,在关注。

正确的拼写,标点符号和大小写很重要。别把"its"和"it's"或者"loose"和
"lose"搞混淆了。别用全部大写的形式,这被视为粗鲁的大声叫嚷(全都用小写
也好不到哪儿去,因为这会给阅读带来困难。Alan Cox可以用全部小写,但你不行
)。

更一般的说,如果你的提问写得象个半文盲,你很有可能被忽视。如果写得象一个
窥客(破解爱好者)或者灰客(只会用现成工具的捣乱者)绝对是自己找死,保证
你除了无情的抵制什么也得不到(或者,最好的结局是得到一大堆挖苦嘲笑的"帮
助")。

如果你在使用非母语的论坛提问,你可以犯点拼写和语法上的小错--但决不能在思
考上马虎(没错,我们能弄清两者的分别)。另外,除非你确切知道你的回答者会
使用什么语言,否则请用英文。匆匆忙忙的黑客往往简单的跳过他们看不懂的问题
,而英文是网络上的工作语言。用英文可以降低你的问题未被阅读即遭抛弃的风险





------------------
用易读格式发送问题
------------------

如果人为造成你的提问难以阅读和理解,将会更容易被人忽略。因此你要:
1. 使用纯文本邮件,不要使用HTML(关掉HTML并不难)。
2. 通常可以附加MIME附件,但一定要有真正的内容(例如附加的源文件或者补丁
),而不仅仅是你的邮件客户端产生的文件模板(例如你邮件的一份拷贝)。
3. 不要把所有问题放在不停换行的一整段中。(这将让答复的人难于回答其中一
部分问题,即使能回答所有问题,我也更希望条理清楚的一个一个来:)。很可能
收件人只能在80个字符宽度的文本显示器上读信,因此要相应的把行环绕模式设在
80字符以内。
4. 不要在英文论坛使用MIME Quoted-Printable编码发送;这种编码格式对ASCII
码不能表达的语言来说是非常必要的,但很多邮件代理不支持它,这时,满篇的"
=20"符号把文字分割开,既难看,又分散注意力。
5. 永远不要指望黑客会乐于阅读封闭所有权的文件格式,例如萎软的Word格式。
多数黑客对此的反应就象你在门口的阶梯上堆满热烘烘的猪粪(意即谁也不会踏进
你的门--译者注)。
6. 如果你通过一台安装Windows的电脑发送邮件,关闭萎软愚蠢的"智能引用"功
能。这能使你免于在邮件中夹带垃圾字符。

----------------------------
使用含义丰富,描述准确的标题
----------------------------

在邮件列表或者新闻组中,大约50字以内的主题标题是抓住资深专家注意力的黄金
时机。别用喋喋不休的"帮帮忙"(更别说"救命啊!!!!!"这样让人反感的
话)来浪费这个机会。不要妄想用你的痛苦程度来打动我们,别用空格代替问题的
描述,哪怕是极其简短的描述。

蠢问题:
救命啊!我的膝上机不能正常显示了!

聪明问题:
XFree86 4.1下鼠标光标变形,Fooware MV1005的显示芯片。

如果你在回复中提出问题,记得要修改内容标题,表明里面有一个问题。一个看起
来象"Re:测试"或者"Re:新bug"的问题很难引起足够重视。另外,引用并删
减前文的内容,给新来的读者留下线索。

------------------
精确描述,信息量大
------------------

1. 谨慎明确的描述症状。
2. 提供问题发生的环境(机器配置、操作系统、应用程序以及别的什么)。
3. 说明你在提问前是怎样去研究和理解这个问题的。
4. 说明你在提问前采取了什么步骤去解决它。
5. 罗列最近做过什么可能有影响的硬件、软件变更。

尽量想象一个黑客会怎样反问你,在提问的时候预先给他答案。

Simon Tatham写过一篇名为《如何有效的报告Bug》的出色短文。强力推荐你也读
一读。

--------
话不在多
--------

你需要提供精确有效的信息。这并不是要求你简单的把成吨的出错代码或者数据完
全转储摘录到你的提问中。如果你有庞大而复杂的测试条件,尽量把它剪裁得越小
越好。

这样做的用处至少有三点。第一,表现出你为简化问题付出了努力,这可以使你得
到回答的机会增加;第二,简化问题使你得到有用答案的机会增加;第三,在提炼
你的bug报告的过程中,也许你自己就能找出问题所在或作出更正。

------------------
只说症状,不说猜想
------------------

告诉黑客们你认为问题是怎样引起的没什么帮助。(如果你的推断如此有效,还用
向别人求助吗?),因此要确信你原原本本告诉了他们问题的症状,不要加进你自
己的理解和推论。让黑客们来诊断吧。

蠢问题:
我在内核编译中一次又一次遇到SIG11错误,我怀疑某条飞线搭在主板的走线上了
,这种情况应该怎样检查最好?

聪明问题:
我自制的一套K6/233系统,主板是FIC-PA2007 (VIA Apollo VP2芯片组),256MB
Corsair PC133 SDRAM,在内核编译中频频产生SIG11错误,从开机20分钟以后就
有这种情况,开机前20分钟内从没发生过。重启也没有用,但是关机一晚上就又能
工作20分钟。所有内存都换过了,没有效果。相关部分的典型编译记录如下...。


------------------
按时间顺序列出症状
------------------

对找出问题最有帮助的线索,往往就是问题发生前的一系列操作,因此,你的说明
应该包含操作步骤,以及电脑的反应,直到问题产生。在命令行操作的情况下,保
存一个操作记录(例如使用脚本工具),并且引用相关的大约20条命令会大有帮助


如果崩溃的程序有诊断选项(例如用-v转到详尽模式),试着仔细考虑选择选项以
在操作记录中增加有用的调试信息。

如果你的说明很长(超过四个段落),在开头简述问题会有所帮助,接下来按时间
顺序详述。这样黑客们就知道该在你的说明中找什么。

--------------
别要求私下答复
--------------

黑客们认为解决问题应该有公开、透明的流程。只要任何更有见地的人注意到答案
的不完善或者不正确,这个最初的答案就可以和应该得到纠正。同时,通过能力和
知识被大家注意,被大家接受,回答问题者得到了应有的奖励。

如果你要求对方私下回答你,这既破坏了整个流程,也破坏了奖励制度。别提这要
求,这是回答者的权利,由他来选择是否私下答复--如果他选择这样做,通常是因
为他认为这个答案过于显而易见或者有不良的公开影响,别人不会感兴趣。

只有一种有限的例外:如果你预计将收到大量雷同的答复,你可以说:"把答案寄
给我,由我来汇总吧。"将邮件列表或者新闻组从大量重复的帖子中打救出来是很
有君子之风的--但请记住,履行自己关于汇总的承诺。

--------------
明白你想问什么
--------------

漫无边际的提问近乎无休无止的时间黑洞。最能给你有用答案的人也正是最忙的人
(他们忙是因为要亲自完成大部分工作)。这样的人对无节制的时间黑洞不太感冒
,因此也可以说他们对漫无边际的提问不大感冒。

如果你明确表述需要回答者做什么(提供建议,发送一段代码,检查你的补丁或是
别的),就最有可能得到有用的答案。这会定出一个时间和精力的上限,便于回答
者集中精力来帮你,这很凑效。

要理解专家们生活的世界,要把专业技能想象为充裕的资源,而回复的时间则是贫
乏的资源。解决你的问题需要的时间越少,越能从忙碌的专家口中掏出答案。

因此,优化问题的结构,尽量减少专家们解决它所需要的时间,会有很大的帮助
--这通常和简化问题有所区别。因此,问"我想更好的理解X,能给点提示吗?"
通常比问"你能解释一下X吗?"更好。如果你的代码不能工作,问问它有什么地
方不对,比要求别人替你修改要明智得多。

------------------------
别问应该自己解决的问题
------------------------

黑客们总是善于分辨哪些问题应该由你自己解决;因为我们中的大多数都曾自己解
决这类问题。同样,这些问题得由你来搞定,你会从中学到东西。你可以要求给点
提示,但别要求得到完整的解决方案。

----------------
去除无意义的疑问
----------------

别用无意义的话结束提问,例如"有人能帮我吗?"或者"有答案吗?"。首先:
如果你对问题的描述不很合适,这样问更是画蛇添足。其次:由于这样问是画蛇添
足,黑客们会很厌烦你--而且通常会用逻辑上正确的回答来表示他们的蔑视,例如
:"没错,有人能帮你"或者"不,没答案"。

----------------------------
谦逊绝没有害处,而且常帮大忙
----------------------------

彬彬有礼,多用"请"和"先道个谢了"。让大家都知道你对他们花费时间义务提
供帮助心存感激。

实话实说,虽然这不象合乎语法、清楚准确的描述,避免私有格式等等那么重要(
也不能用来替代它们);黑客一般更喜欢直接了当然而技术上敏锐的bug报告,而
不是彬彬有礼的废话(如果这让你迷惑不解,请记住,我们衡量一个问题价值的标
准是:它能让我们学会多少)。

然而,如果你有很多问题无法解决,礼貌将会增加你得到有用答案的机会。

(我们注意到,自从本指南发布后,从资深黑客处得到的唯一严重缺陷反馈,就是
对预先道谢这一条。一些黑客觉得"先谢了"的言外之意是过后就不会再感谢任何
人了。我们的建议是:都道谢。)

------------------------
问题解决后,加个简短说明
------------------------

问题解决后,向所有帮助过你的人发个说明,让他们知道问题是怎样解决的,并再
一次向他们表示感谢。如果问题在新闻组或者邮件列表中引起了广泛关注,应该在
那里贴一个补充说明。

补充说明不必很长或是很深入;简单的一句"你好,原来是网线出了问题!谢谢大
家--Bill"比什么也不说要强。事实上,除非结论真的很有技术含量,否则简短可
爱的小结比长篇学术论文更好。说明问题是怎样解决的,但大可不必将解决问题的
过程复述一遍。

除了表示礼貌和反馈信息以外,这种补充有助于他人在邮件列表/新闻组/论坛中搜
索对你有过帮助的完整解决方案,这可能对他们也很有用。

最后(至少?),这种补充有助于所有提供过帮助的人从中得到满足感。如果你自
己不是老手或者黑客,那就相信我们,这种感觉对于那些你向他们求助的导师或者
专家而言,是非常重要的。问题久拖未决会让人灰心;黑客们渴望看到问题被解决
。好人有好报,满足他们的渴望,你会在下次贴出新问题时尝到甜头。

============
如何理解答案
============

--------------------
RTFM和STFW:别烦我啦
--------------------

有一个古老而神圣的传统:如果你收到"RTFM (Read The Fucking Manual)"的
回复,回答者认为你应该去读TMD手册。当然,基本上他是对的,你应该读一读。


RTFM有一个年轻的亲戚。如果答案是"STFW (Search The Fucking Web)",回
答者认为你应该到TMD的网上去搜索。基本上,他也是对的,你就去找吧。

通常,用这两句之一回答你的人会给你一份包含你需要内容的手册或者一个网址,
而且他们打这些字的时候正在阅读着。这些答复意味着回答者认为(1). 你需要的
信息非常容易获得;(2). 你自己去搜索这些信息比灌给你能让你学到更多。

别为这个而不爽;依照黑客的标准,他没有对你的要求视而不见,已经能大致能表
示对你的关注。你应该对他祖母般的慈祥表示感谢。

----------
还是不懂
----------

如果你不是很理解答案,别立刻要求对方解释。象你以前试着自己解决问题时那样
(利用手册,FAQ,网络,身边的高手),去理解它。如果你真的需要对方解释,
记得表现出你已经学到了点什么。

比方说,如果我回答你:"看来似乎是zEntry被阻塞了;你应该先清除它。",然
后:


一个很糟的后续问题:"zEntry是什么?"

聪明的问法应该是这样:"哦~~~我看过帮助了但是只有-z和-p两个参数中提到了
zEntry而且还都没有清楚的解释:<你是指这两个中的哪一个吗?还是我看漏了什么
?"

--------
面对无礼
--------

黑客圈子里很多貌似粗鲁的言行并非有意冒犯。更恰当的说,这是直率、不说废话
的沟通方式的产物,这种沟通方式源于人们关注问题的解决--多过让人感受温暖亲
情然而却依旧糊里糊涂--的天性。

如果你觉得受到粗鲁的对待,请保持冷静。如果真有人表现粗野,通常会有列表/
新闻组/论坛的长辈找他谈心,如果没有这样,而你又大发脾气,则很可能对方的
言行是黑客社区行为规范许可内,而你被认为是有过错的。这会不利于你得到信息
或者帮助。

另一方面,你偶尔也会无缘无故有粗野的言行和心态。上述现象的另一面是,人们
允许狠狠打击真正的冒犯者,用尖刻的言语剖析他们的不当言行。如果你真决定这
样做,先仔细又仔细的掂量一下你自己的分量。合理的粗鲁与发动一场无意义的论
战之间只隔了一条细细的线,冒冒失失撞上去的黑客不在少数;如果你是新手或者
门外汉,不犯这种错的机会是很渺茫的。如果你想得到信息而不是来胡闹,别冒险
回复,最好把手从键盘上拿开。

(有些人声称多数黑客有孤僻症或者社交障碍综合征的轻度症状,而且确实缺少部
分有助"常人"进行社交行为的脑组织结构。这也许是真的,也许不是。如果你自
己不是黑客,那么,把我们想象成脑部有缺陷的人有助你面对我们的古怪。有话直
说,我们无所谓;我们乐于按自己的想法生活,而且总是对医学概念持相当怀疑的
态度。)

在下一节里,我们将谈论另一个话题;当你行差踏错时可能遇到的"无礼"。

================
决不要象个失败者
================

很有可能,你在黑客社区的论坛会受到很多公开的攻击--用本文提到的各种方式或
类似的方法,而且很可能会有各式各样的旁敲侧击来告诉你你有多讨厌。

如果噩梦成真,你能做的最糟的事就是为此发牢骚,抱怨受到人身攻击,要求对方
道歉,尖叫,屏住呼吸,威胁要控诉对方,向他老板告状,不掀起马桶座圈,等等
等等。然而,你应该这样:

由它去吧,这没什么大不了的。实际上这么做是恰当的和有益的(主要是有利身心
健康:)。

社区的规范不靠社区,而是靠积极推行它们的人们来维护,这种维护是公开的,显
而易见的。别抱怨说一切批评都应该通过私信传送,它本来就不该那样。当别人指
出你的话有错误,或者他有不同观点的时候,坚持认为他在羞辱你是没有用的。这
些都是失败者的态度。

有那么一些黑客论坛,出于对高度自谦的误解,禁止参与者张贴专给人找茬的帖子
,而且被告知"如果不愿帮助用户,那就闭嘴。",他们认为,引开参与者的话题
,只会使得他们陶醉在毫无意义的喋喋不休中,从而失去了技术论坛的意义。

夸张的"友善"(以那种方式)还是有用的帮助:你自己选择吧。

记住:当黑客说你很烦人,(无论用多么粗暴的语言)警告你别再那样做了,他的
本意并非是针对(1)你,以及(2)他的社区。他本来可以轻易的忽略你,把你从他的
视线中抹去。如果你无法接受要向他表示感激,至少应该表现出你的气度,别抱怨
,别期望只因为你是新人,你有戏剧般的敏感脆弱的神经和自封的权利,而受到易
碎玩偶般的特别对待。

==========
三思而后问
==========

以下是几个经典蠢问题,以及黑客在拒绝回答时的心中所想:

问题:我能在哪找到X程序?
问题:我的程序/配置/SQL申明没有用
问题:我的Windows有问题,你能帮我吗?
问题:我在安装Linux(或者X)时有问题,你能帮我吗?
问题:我怎么才能破解root帐号/窃取OP特权/读别人的邮件呢?

提问:我能在哪找到X程序?
回答:就在我找到它的地方啊蠢货--搜索引擎的那一头。天呐!还有人不会用
Google吗?

提问:我的程序(配置、SQL申明)没有用
回答:这不算是问题吧,我对找出你的真正问题没兴趣--如果要我问你二十个问题
才找得出来的话--我有更有意思的事要做呢。在看到这类问题的时候,我的反应通
常不外如下三种:
1. 你还有什么要补充的吗?
2. 真糟糕,希望你能搞定。
3. 这跟我有什么鸟相关?

提问:我的Windows有问题,你能帮我吗?
回答:能啊,扔掉萎软的垃圾,换Linux吧。

提问:我在安装Linux(或者X)时有问题,你能帮我吗?
回答:不能,我只有亲自在你的电脑上动手才能找到毛病。还是去找你当地的
Linux用户组寻求手把手的指导吧(你能在这儿找到用户组的清单)。

提问:我怎么才能破解root帐号/窃取OP特权/读别人的邮件呢?
回答:想要这样做,说明你是个卑鄙小人;想找个黑客帮你,说明你是个白痴!


==============
好问题,坏问题
==============

最后,我举一些例子来说明,怎样聪明的提问;同一个问题的两种问法被放在一起
,一种是愚蠢的,另一种才是明智的。

蠢问题:我可以在哪儿找到关于Foonly Flurbamatic的资料?
这种问法无非想得到"STFW"这样的回答。

聪明问题:我用Google搜索过"Foonly Flurbamatic 2600",但是没找到有用的
结果。谁知道上哪儿去找对这种设备编程的资料?
这个问题已经STFW过了,看起来他真的遇到了麻烦。

蠢问题:我从FOO项目找来的源码没法编译。它怎么这么烂?
他觉得都是别人的错,这个傲慢自大的家伙

聪明问题:FOO项目代码在Nulix 6.2版下无法编译通过。我读过了FAQ,但里面没
有提到跟Nulix有关的问题。这是我编译过程的记录,我有什么做得不对的地方吗

他讲明了环境,也读过了FAQ,还指明了错误,并且他没有把问题的责任推到别人
头上,这个家伙值得留意。

蠢问题:我的主板有问题了,谁来帮我?
普通黑客对这类问题的回答通常是:"好的,还要帮你拍拍背和换尿布吗?" ,
然后按下删除键。

聪明问题:我在S2464主板上试过了X、Y和Z,但没什么作用,我又试了A、B和C。
请注意当我尝试C时的奇怪现象。显然边带传输中出现了收缩,但结果出人意料。
在多处理器主板上引起边带泄漏的通常原因是什么?谁有好主意接下来我该做些什
么测试才能找出问题?
这个家伙,从另一个角度来看,值得去回答他。他表现出了解决问题的能力,而不
是坐等天上掉答案。

在最后一个问题中,注意"告诉我答案"和"给我启示,指出我还应该做什么诊断
工作"之间微妙而又重要的区别。

事实上,后一个问题源自于2001年8月在Linux内核邮件列表上的一个真实的提问。
我(Eric)就是那个提出问题的人。我在Tyan S2464主板上观察到了这种无法解释
的锁定现象,列表成员们提供了解决那一问题的重要信息。

通过我的提问方法,我给了大家值得玩味的东西;我让人们很容易参与并且被吸引
进来。我显示了自己具备和他们同等的能力,邀请他们与我共同探讨。我告诉他们
我所走过的弯路,以避免他们再浪费时间,这是一种对他人时间价值的尊重。

后来,当我向每个人表示感谢,并且赞赏这套程序(指邮件列表中的讨论--译者注
)运作得非常出色的时候,一个Linux内核邮件列表(lkml)成员表示,问题得到
解决并非由于我是这个列表中的"名人",而是因为我用了正确的方式来提问。


我们黑客从某种角度来说是拥有丰富知识但缺乏人情味的家伙;我相信他是对的,
如果我象个乞讨者那样提问,不论我是谁,一定会惹恼某些人或者被他们忽视。他
建议我记下这件事,给编写这个指南的人一些指导。

================
找不到答案怎么办
================

如果仍得不到答案,请不要以为我们觉得无法帮助你。有时只是看到你问题的人不
知道答案罢了。没有回应不代表你被忽视,虽然不可否认这种差别很难区分。

总的说来,简单的重复张贴问题是个很糟的想法。这将被视为无意义的喧闹。

你可以通过其它渠道获得帮助,这些渠道通常更适合初学者的需要。

有许多网上的以及本地的用户组,由狂热的软件爱好者(即使他们可能从没亲自写
过任何软件)组成。通常人们组建这样的团体来互相帮助并帮助新手。

另外,你可以向很多商业公司寻求帮助,不论公司大还是小(Red Hat和
LinuxCare就是两个最常见的例子)。别为要付费才能获得帮助而感到沮丧!毕竟
,假使你的汽车发动机汽缸密封圈爆掉了--完全可能如此--你还得把它送到修车铺
,并且为维修付费。就算软件没花费你一分钱,你也不能强求技术支持总是免费的


对大众化的软件,就象Linux之类而言,每个开发者至少会有上万名用户。根本不
可能由一个人来处理来自上万名用户的求助电话。要知道,即使你要为帮助付费,
同你必须购买同类软件相比,你所付出的也是微不足道的(通常封闭源代码软件的
技术支持费用比开放源代码软件要高得多,而且内容也不那么丰富)。
posted @ 2005-10-24 23:03 北国狼人的BloG 阅读(312) | 评论 (0)编辑 收藏

  据医学报告指出每天使用计算机4-6小时,
三年后得到癌症的机率比正常人多26﹪。
  中午睡觉时要记得关计算机!
  你是否常觉得头重重的或记忆力帅退呢?

  趴着睡觉的时候要记的把计算机关机,不只是把屏幕关掉而已,因为只把屏幕关掉是无法杜绝辐射线的,而且我们都是趴着睡,头直接对着计算机,哪天得了老人痴呆症或脑瘤就来不及了!辐射线真的很可怕的!!小心啊~健康重于一切!

  计算机族的杀手——胸廓出口症

  常坐在计算机桌前的你,是否一坐就是好几个小时而且坐姿不正确,总感到莫名肩颈疼痛,甚至于无心工作?现在请你作个小测验,请你将你的头向左侧方向望去,然后将你的头45度朝下慢慢弯下去,动作做到这里,你的脖子颈肩是否感到不正常的酸痛?对假使你有上述症状,你可要小心了,因为你很可能得到现代计算机文明病“胸廓出口症候群”的受害者。

  杀手原来是“计算机”

  计算机一族的您或许常纳闷为何常常感到腰酸背痛,身体抵抗力越来越弱,精神常常无法集中,您绝无法想象原因出在“计算机”,电脑所散发出的辐射电波往往为人们所忽视,依国际MPRⅡ防辐射安全规定,在50cm距离内必需≦25V/m的辐射曝露量,但您知道计算机的辐射量是多少吗?

  告诉您

  Ⅰ、键盘1000V/m,

  Ⅱ、鼠标450V/m,

  Ⅲ、屏幕218V/m,

  Ⅳ、主机170V/m,

  Ⅴ、Notebook 2500V/m,

  辐射电磁波对人体的八大伤害

  1.细胞癌化促进作用,

  2.荷尔蒙不正常,

  3.钙离子激烈流失,

  4.痴呆症的引发,

  5.异常妊娠异常生产,

  6.高血压心脏病,

  7.电磁波过敏症,

  8.自杀者的增加。

posted @ 2005-10-24 22:59 北国狼人的BloG 阅读(406) | 评论 (2)编辑 收藏
2000多年前,孟子就说过:“鱼我所欲也;熊掌,亦我所欲也;二者不可得兼。”对于今天发达的通信产品,我们似乎也面临这鱼与熊掌的选择之难:便利我所欲也,无辐射亦我所欲也,然二者亦不可得兼。无奈之下,我们选择了便利,并且尽量将辐射的危害降到最低。


使用篇

  “亲密接触”是大忌

许多手机用户在拨叫或者接听电话时,喜欢用耳朵紧贴手机或者天线,以求能更清晰地与对方交流,殊不知手机的电磁辐射强度是与距离成反比的,也就是说手机与人体的距离从1厘米拉近到0.5厘米,其影响力就提高了一倍。因此,在手机接通或者拨出的那一刻,身体应该远离手机,即使在通话的过程中,也要与手机天线保持一定的距离。

  免提耳机作“媒人”

  为了避免辐射,用户在通话时应该远离手机,但如果距离手机太远,又会影响手机的通话质量。为了保证通话质量,并避免辐射,我们可以使用免提耳机来接听电话,这样可以帮助手机用户减少移动电话释放的90%以上的电磁辐射。

  接通瞬间要“注意”

  手机接通瞬间释放的电磁波容易致癌,所以手机响时,一秒后再听手机。通话可不能“永不停息”:研究表明,用户在连续接听手机超过1小时后,DNA裂变的可能性最高,也就是我们抵抗力最差的时段。

  不用的时候就“藏”起来

  许多人常常会产生一个错误的认识,他们认为手机只有在接听或者拨出的一刹那才会有电磁辐射,而处于待机状态时不会产生电磁辐射。其实手机只要接通电源,就会发出电磁辐射,只是手机在通信的时候发出的辐射量要大于待机时的辐射量。因此为了将电磁波对人体的伤害降至最低,我们在暂时不用手机时,应记得将手机电源关闭而不要将其设置在待用状态。医学专家建议我们,手机不用时最好放在包里,或是夹克衫的口袋里,但不要放在胸前的口袋中,也不要直接挂在胸前。

饮食篇

  以“毒”攻毒:辣椒

  据医学证明发现,辣椒是天然的可以杀菌、提高免疫能力的有效武器,人只要多吃辣椒就可以增强自身的身体免疫能力,从而增强了外界电磁辐射对身体的影响。根据最新的研究发现,红辣椒、黑胡椒、咖喱、姜黄素等等香辛料,还可以直接当作抗辐射的保护剂。

  张开的“保护罩”:绿茶

  美国夏威夷大学曾有研究显示,多喝绿茶可能在预防辐射上有重要作用。研究发现,茶叶中含有较多的脂多糖,而脂多糖可以改善机体造血功能。人体注入脂多糖后,在短时间内即可增强机体非特异性免疫力。饮茶能有效地阻止放射性物质侵入身体。 

  “游勇散兵”威力不小

  平时多吃一些水果蔬菜,尤其是富含维生素B的食物,如胡萝卜、海带、油菜、卷心菜及动物肝脏等,有利于调节人体电磁场紊乱状态,增加机体抵抗电磁辐射污染的能力。

  防微波辐射纤维的衣服

  人们研制生产了一种由防微波辐射纤维制成的衣服,这种纤维制成的防电磁波辐射的织物具有防微波辐射性能好、质轻、柔韧性好等优点,是一种比较理想的微波防护面料,微波透射量仅为入射量的十万分之一。这种防护面料主要用做微波防护服和微波屏蔽材料等。

posted @ 2005-10-24 22:58 北国狼人的BloG 阅读(350) | 评论 (0)编辑 收藏