2005年11月17日
摘要: 最近在funplus做游戏,进而研究了一个新型架构。之前做游戏都是自己使用java搭建架构,经过几年的积累确实也达到了最初的设想,多进程,进程内多线程,无锁,0延迟纯jdbc写库。对于单服架构来说,已经趋近于极致。今年小游戏盛行,如海盗来了,疯狂游戏那家公司,全部使用的都是go+mongodb实现的,因为go的语言级别支援高并发,这点是java无法比拟的。不过java开源项目多,有很多的高手铺垫了...
阅读全文
posted @
2018-11-13 14:29 北国狼人的BloG 阅读(1553) |
评论 (0) |
编辑 收藏
好久不写blog了,我都已经从完美-》创业-》创业失败-》开心网-》创业-》创业失败-》蓝港-》funplus走了很多的历程了。
posted @
2018-11-13 11:31 北国狼人的BloG 阅读(155) |
评论 (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 阅读(1168) |
评论 (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 阅读(1102) |
评论 (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 阅读(268) |
评论 (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 阅读(1141) |
评论 (0) |
编辑 收藏
这个软件又好用,又实用,能缩放,比Captivate 好用多了。
posted @
2010-06-29 16:58 北国狼人的BloG 阅读(1196) |
评论 (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<X 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<E 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 阅读(853) |
评论 (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 阅读(175) |
评论 (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 阅读(838) |
评论 (1) |
编辑 收藏
安装MySQL之前,先检查是否已经有没用的旧有MySQL
不卸载,有乱七八糟的问题会出现
rpm -qa|grep mysql -i
发现老版本的,就卸载
rpm -e --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 -p -S /data/mysql/database/mysql.sock
有时候,会mysql等不了或者关闭不了,必须找到驱动才能关闭或者登陆
mysqladmin -uroot -p -S /data/mysql/database/mysql.sock shutdown
备份数据dump操作
mysqldump -uroot -p -S /data/mysql/database/mysql.sock -F -B tianwen tianwen_log -Q > /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 阅读(266) |
评论 (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 阅读(8171) |
评论 (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 阅读(142) |
评论 (0) |
编辑 收藏
http://gamelook.com.cn/
posted @
2010-04-05 16:26 北国狼人的BloG 阅读(145) |
评论 (0) |
编辑 收藏
taskdef flexTask.jar
内存不够用,就是用ANT_OPTS -Xms256m -Xmx512m
posted @
2010-04-05 15:02 北国狼人的BloG 阅读(143) |
评论 (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 阅读(136) |
评论 (0) |
编辑 收藏
Class-Path: ./lib/ant-1.6.5.jar
./lib/ant-junit-1.6.5.jar
注意:换行后前面加两个空格
posted @
2010-03-23 20:30 北国狼人的BloG 阅读(463) |
评论 (0) |
编辑 收藏
http://code.google.com/p/golfzon-flash-library/
posted @
2010-03-23 13:26 北国狼人的BloG 阅读(179) |
评论 (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:
-
//cc() is called upon creationComplete
-
private function cc():void
-
{
-
var obj:Object = createInstance("flash.display.Sprite");
-
}
-
-
public function createInstance(className:String):Object
-
{
-
var myClass:Class = getDefinitionByName(className) as Class;
-
var instance:Object = new myClass();
-
return instance;
-
}
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:
-
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:
-
//cc() is called upon creationComplete
-
private var forCompiler:Person; //REQUIRED! (but otherwise not used)
-
-
private function cc():void
-
{
-
var obj:Object = createInstance("Person");
-
}
-
-
public function createInstance(className:String):Object
-
{
-
var myClass:Class = getDefinitionByName(className) as Class;
-
var instance:Object = new myClass();
-
return instance;
-
}
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:
-
private var forCompiler:Person;
-
-
private function cc():void
-
{
-
var obj:Object = createInstance("Person", ["bob", 30]);
-
}
-
-
public function createInstance(className:String, args:Array):Object
-
{
-
var myClass:Class = getDefinitionByName(className) as Class;
-
var instance:Object = new myClass();
-
instance.initArgs.apply(null, args);
-
return instance;
-
}
-
-
/*********************************************************************
-
//In person.initArgs()....
-
-
//Note: the constructor also accepts name & age, assigning them default values
-
//if not specified.
-
-
public function initArgs(name:String, age:uint):void
-
{
-
this.name = name;
-
this.age = age;
-
}
-
*********************************************************************/
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 阅读(517) |
评论 (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 阅读(296) |
评论 (0) |
编辑 收藏
update monster set exp=exp*2
posted @
2010-01-20 10:06 北国狼人的BloG 阅读(199) |
评论 (0) |
编辑 收藏
、
posted @
2010-01-07 11:18 北国狼人的BloG 阅读(208) |
评论 (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所服务:)
附加:
关于dataProvider、itemRenderer、data的具体用法有些抽象,因此我特此列举一个例子来说明一下。
这是一个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 }"
以上就是一个非常简单,但是又非常典型的一个dataProvider、itemRenderer、data的用法,希望大家可以理解:)
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 阅读(453) |
评论 (0) |
编辑 收藏
as3 + java
action script 3 真不错了
posted @
2009-12-23 16:33 北国狼人的BloG 阅读(186) |
评论 (0) |
编辑 收藏
表现:
使用ModuleManager去加载一个Module的时候, 所有的事件都激发不了.
代码:
- var testModule:IModuleInfo = ModuleManager.getModule('modules/pub/User.swf');
- testModule.addEventListener(ModuleEvent.READY,onModuleReady);
- testModule.addEventListener(ModuleEvent.SETUP, onModuleSetup);
- testModule.addEventListener(ModuleEvent.PROGRESS,onModuleLoading);
- 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
"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. "
posted @
2009-12-23 16:31 北国狼人的BloG 阅读(236) |
评论 (0) |
编辑 收藏
as 是请求口气,比较温柔。
XML()是命令口气,比较霸道。
这个东西不听话你就不要给他好语气
as 是前面的对象如果是后面的数据类型才返回这个对象,否则返回null
这里的weather_loader.data是String类型
posted @
2009-12-17 15:29 北国狼人的BloG 阅读(135) |
评论 (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 阅读(541) |
评论 (0) |
编辑 收藏
8点前 的11月19日凌晨,我和我今生最爱的人一起看过流星雨。想到这些,我就会流泪。
posted @
2009-11-18 22:19 北国狼人的BloG 阅读(125) |
评论 (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 阅读(169) |
评论 (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 阅读(150) |
评论 (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 阅读(237) |
评论 (0) |
编辑 收藏
如果你是一个想从大公司去一个小公司Startup的技术人员,你自己一定要多加考虑清楚未来的真的可能成功,一定要有十足把握再做决定。
人的时间有限,能奋斗的时间也有限,请选准老大,否则浪费时间,还废身体。
posted @
2008-08-27 14:05 北国狼人的BloG 阅读(497) |
评论 (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 阅读(4775) |
评论 (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 阅读(453) |
评论 (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 阅读(300) |
评论 (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 阅读(14331) |
评论 (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 阅读(232) |
评论 (0) |
编辑 收藏
你们是现在走在我前面,又上德国,又上美国,你们牛鼻。你们在前面,我才有目标阿。真好,会一个个被我赶超。
狂笑,当我笑声停止的时候,就是我不笑的时候。等着吧。
我会一个个算账。
posted @
2007-10-12 10:39 北国狼人的BloG 阅读(278) |
评论 (0) |
编辑 收藏
离成功还差一步。就在这时,竟然出现黑马,中了16个一等。我操,天为什么这样玩我。
不过,我早已练就了,最好的心理素质。
跟我斗,都得死!
posted @
2007-10-12 10:31 北国狼人的BloG 阅读(226) |
评论 (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 阅读(1516) |
评论 (8) |
编辑 收藏
最近使用Mambo开发了一个中医药网站,后台做了一个媒体管理组件,有想要的。
留下email.
posted @
2006-08-28 18:57 北国狼人的BloG 阅读(655) |
评论 (6) |
编辑 收藏
摘要: 想起来就郁闷,这周重写了一个垃圾人的代码,也就是我这么高的高手能完成这样的艰巨的任务,在应用层代码和服务端代码都不是我自己的情况下,现分析再重写,再优化,再在周五保证无恙上线。谁也来不了!!我实在是不能不说,以下文字带有不净词语,实属我无奈,因为星期三的那天我已经接近崩溃,我不得不说,请所有学Java的人注意。开始展现: */ public Vector getDimenionDocs(... 阅读全文
posted @
2006-08-13 09:24 北国狼人的BloG 阅读(1160) |
评论 (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 这位大爷他不说人话。
然后你在试试,就好了。
posted @
2006-08-03 09:36 北国狼人的BloG 阅读(6932) |
评论 (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 © 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 阅读(419) |
评论 (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 阅读(6483) |
评论 (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 阅读(604) |
评论 (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
解决办法:
到控制面板,找到字体,找到文鼎字体,删之!
最后出现:
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、持续性
也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。
事务的属性
一个事务的属性控制了事务的使用范围。EJB、Spring以及.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的有所不同。
登录
创建JMS servers
设置完JMS服务器以后,要设置JMS的Modules,以便JMS客户端和接受端能查找相应的JMSFactory和JMSdestination。
C:\bea\user_projects\domains\base_domain\config\jms
会出现配置相关的配置文件
建立两个资源
一个是ConnectionFactory,配置一个JNDI。
另外一个是Queue-0,配置一个JNDI。
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 阅读(411) |
评论 (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
===============================
开始分析EJB工作原理
看下面一张图,就清楚了,实际就是两次RMI 调用。
要细致来说。
基本是这样的。
定义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 阅读(964) |
评论 (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
=================
===============
另外一些小问题
由于rmiregistry 工具的不断强大,jdk1.4已经可以不再使用skeleton,到1.5,根本就不生成skeleton了。
rmiregistry可以充当skeleton角色完成功能。
记住EJB中,还不行,因为没有rmiregistry工具了。呵呵,明白了?
=========================
所以什么呢,RMI就是一种代理模式的应用Stub,就是实际实现类的客户代理。
但需要统一的接口,才能对于用户、调用者透明啊!
------------------------
我说的比较通俗。还有很多深刻的东西。
posted @
2006-03-19 22:42 北国狼人的BloG 阅读(1329) |
评论 (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 阅读(286) |
评论 (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 阅读(549) |
评论 (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>
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**的指针代表的。
所以遍历时,既要判断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;
在程序中添加和修改的环境变量只对本进程起作用。
代码栈,存储着函数调用的入口地址,通过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;
for( int 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 阅读(398) |
评论 (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 阅读(572) |
评论 (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 阅读(314) |
评论 (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。
接口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 阅读(831) |
评论 (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%i == 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) |
编辑 收藏