当前访问本站: hits

yjhmily

坚持走自己的路……

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  100 Posts :: 8 Stories :: 353 Comments :: 0 Trackbacks

2007年9月28日 #

原文出处:http://space.itpub.net/133735/viewspace-710117 
总结的不错!
-------------------------------------------------------------------------------------------------
生产环境最佳实践
1.linux 系统:
1】关闭文件系统/分区的atime 选项
Vi /etc/fstab
在对应的分区项后面添加noatime ,nodiratime
LABEL=/1 / ext3 defaults 1 1
LABEL=/data1 /data ext4 defaults,noatime,nodiratime 1 2
2】设置文件句柄4k+,目前该配置已经集成到启动脚本中。
Vi /etc/security/limit.conf
* soft nproc 65536
* hard nproc 65536
* soft nofile 65536
* hard nofile 65536
3】不要使用large vm page (不要使用大内存页选项)
Linux 大内存页参考:http://linuxgazette.net/155/krishnakumar.html
4】用dmesg 查看主机的信息。
2.linux 文件系统的选择:
Mongodb 采用预分配的大文件来存储数据,我们推荐
1】ext4
2】xfs
3.内核版本:
网络上对2.6.33-31 以及2.6.32 的表现持怀疑度, 而强力推荐2.6.36
4.线程堆栈的尺寸
默认的线程堆栈尺寸为10m ,调整为1m ,已经集成在启动脚本中。
项目过程中的总结与建议
1.大小写问题
mongodb 是默认区分大小写的,但是这会不会衍生出跟mysql 一样的问题?(mysql 区
分大小写,导致windows 与linux 下的表名,字段名不一致)。
如果无特别用途,建议表名,字段名全部用小写字母。
2.尽可能的缩短字段名的长度
mongodb 的schema free 导致了每笔数据都要存储他的key 以及属性,这导致了这些数
据的大量冗余。开发同事也许考虑到,从易读性出发设计的key 基本比较长,基本都是按
照起字面意思去设计的。这导致key 很长。对应的数据存储占用了很大的空间。
必要的时候,可以考虑建立一个key 与实际意义的map 表,尽量降低key 的长度。
示例定义:
// 基本信息
static final String _ID = "_id";
static final String STATUS_CODE = "sc";
// 缓冲
static final String DATE = "date";
static final String MAX_AGE = "age";
// 内容
static final String CONTENT = "content";
static final String CONTENT_TYPE = "ctype";
static final String CONTENT_LENGTH = "clen";
static final String ZIP = "zip";
3. mongodb 单表最大索引数为64
无索引排序的最大数据量为4M, 超过则报错退出。
建议where 条件尽量落在索引字段上,排序字段需要建立索引,索引的使用原则与oracle
mysql 一致,尽量降低索引数量,索引长度。
mongodb 的查询每次只能用到一个索引,对数据的查询不会“并发”执行
例如: db.tab.find({'id'=1,'name'=2}) 如果‘id’,‘name' 列上分别有索引
对查询效率提升意义不大,如果索引为('id','name') 则大幅提升效率。
4.mongodb 添加字段
如果添加字段且带有default 值,需要全部数据都要修改,这也是设计阶段需要考虑的
事情,这个问题的另外一种解法是应用代码里做一次判断。
5.测试过程的密码问题
对于用作数据库使用的Mongodb,在代码测试阶段都应加上密码验证,目前上线阶段基
本都会在密码验证方面出现问题(做缓存使用的可以不做密码验证)。
6.数据源连接方式
使用连接池模式,尽量减少认证带来的性能额外消耗
建议采用标准的uri 连接方式: mongodb://user:passwd@host:port,host:port/db
7.Mongodb日志量
正常情况下不需要开启-v 日志选项。
Mongodb 的-v 日志适合在开发环境的调试线上部署不建议采用这个参数,目前线上
部署的情况,-v 日志一天也会有几个G 的日志量,去掉这个参数,跟数据查询相关的操作
就不会记日志了,数据库的内部的重要操作还是会写日志的。
8.连接数大小的设置
Mongodb 驱动程序采用的连接池的方式连接到数据库,目前从观察到的情况是应用一
开启便根据变量的设置,建立全部连接,然后提供给程序使用,并且一旦其中某个连接
到数据库的访问失败,则会清空整个连接池到这台数据库的连接,并重新建立连接。
而mongodb 对中断连接的垃圾清理工作则是懒惰的被动清理方式,如果驱动程序端配
置的连接数过大,一旦发生重连,则会导致mongo 端堆积大量的垃圾连接数据,导致
主机资源耗尽。
建议: mongodb 驱动的连接池大小的设置一般应该控制100 以下,一般情况30-50 足
够支撑应用访问。
9.锁的问题
Mongodb 对数据库的访问全部加锁,如果是查询请求则设置共享锁,数据修改请求,
则设置全局排他锁,并且是实例级别的排他锁。并且写锁会阻塞读请求,如果长时间持有
写锁,会阻塞整个实例的读请求。
部署建议:
1】一般情况下,建议不同的应用不要合用一套示例。
2】如果资源不满足,需要合用,应该具有相同属性的应用合用一套实例。
例如合同mongo 的应用都是读多写少,防止一台写多应用阻塞读请求。
10.关于map/reduce问题
mongodb 对map/reduce 的支持是单线程的,我们不建议在前台使用该功能, group by
是通过map/reduce 实现的,开发过程中,要慎用。
11.安全问题
1】Mongodb 运行在mongodb 用户之上,并禁止mongodb 用户登录
2】使用Mongodb 自带的认证方法(adduser、auth)限制用户访问行为
3】将Mongodb 置于内网环境中
4】Mongodb 必须暴露在外网环境中的时候,使用IPTABLES 等网络层技术进行防护
5】网络层面内容为明文传输,可以考虑存储加密文档,应用端,加解密。
12.性能监控
Mongodb 自带有性能数据收集系统
Mongostat 实时采集数据库的多项指标,提供http console 端口号为应用端口号+1000。
关注的主要性能指标:
1】Faults:显示Mongodb 每秒页面故障的数量,这个是mongoDB 映射到虚拟地址空间,
而不是物理内存,这个值如果飙高的话,可能意味着机器没有足够的内存来
存储数据和索引。
2】Flushes:每秒做了多少次fsync,显示多少次数据被刷新进了磁盘
3】locked:写锁
4】idx miss:索引未命中比例
5】qr | qw:读写锁的请求队列长度。
6】conn: 当前已经建立的连接数。
其他命令:
Db.stat()
db.serverStatuse()
Db.collection.stats()
13.碎片问题
Mongodb 数据库如果数据修改很频繁,会出现比较严重的空间碎片问题,表现在磁盘
文件扩张与实际数据量不相符,内存不够用,索引命中率低,查询效率降低。
碎片整理,目前我们采用的版本没有太有效的方法。
可以用db.repaireDatabase() 来整理数据库,这个过程非常的慢
如果是Master-slave 模式则相当于执行一次主从切换,然后从新建立从库。
如果是replSet 架构可以停掉数据库,然后删除数据目录,从新从复制复制组中全同步数据,
这个时候要考虑oplog 的尺寸。
一个大体的步骤:
1.】先调用rs.freeze(1200),将每个不想让它成为primary 的机器让它在1200 秒内无法成为
primary(这步也可以不做)
2. 】将primary stepDown,不出意外新的primary 会起来.
3. 】将原primary kill 掉.
4. 】删掉所有data 数据(调用repair 很慢,真不如干掉重新来)
5. 】再重启动原primary 的进程
6. 】以此循环完成整个复制组的全部重建。
14.系统备份:
Mongodb 目前不支持在线备份,只能离线备份。
我们采用的架构为replSet 和Master-slave .
基于我们目前的架构以及数据一致性要求,我们没有安排相关的备份系统。
15.应用代码中Mongodb连接问题
在有些应用在使用Mongodb 过程中会存在以下两个小问题:
1. 在应用启动过程中,应用存在要求连接池中所有的连接都建立成功才让应用正
常启动,这种做法不可取,因为存在网络问题、Mongodb 拒绝连接或Mongodb 假死情况,如
果没加外部try catch 做防护,则Resin 不断重启也不能正常启动端口。
2.有些应用在使用Mongodb 中连接池配置了safe=true,w=1;这种配置意味着客户端在
插入数据或更新数据的时候,要求mongodb 必须将所更新的数据写入磁盘并返回更新成功
的信息给程序。如果碰上应用程序访问压力大,mongodb 就会反应迟钝,并会发生假死可能,
针对此情况,需要评估数据的一致性需求,做出合适调整。我们一般建议关闭此选项。
16.补充开发方面的一些问题
1】skip+limit翻页,越往后面越慢,有资料说用数组元素的分页可以解决,目前还没
试过,比较靠谱的做法是,先找出上次的id,翻页的时候不用skip:
last_row_id = ObjectId(‘....’);
db.activity_stream->find({_id:{$lt: last_row_id },
user_id:20 } ).sort( {_id:-1} ).limit(10);
2】.只有真正需要的字段才select出来
3】.更新的某条数据的时候,先查出来再更新会减小锁的时间
4】.只有返回很少结果的查询才用索引,否则会加载太多数据,比没有用索引还慢
5】.属性比较多的时候,建立分层的关系能够提高查询效率,否则每个记录都要过一遍
才能找到要的属性
17.关于硬件资源的选择:
虚拟机可以很好的隔离资源,并可动态的扩展。
我们建议mongodb 的部署采用虚拟机的方式,每个虚拟机部署一个实例,使各节点分
散在不同的物理机上,根据应用的前期预测,平衡虚拟机的之间的i/o。
posted @ 2012-09-29 22:17 kangxm 阅读(617) | 评论 (0)编辑 收藏

adb shell

# mount -oremount,rw /dev/block/mtdblock3 /system

# pm list packages -f (列出apk和包名的对应关系)
# cd /system/app (APK文件所在地)
# rm Mms.* (rom自带的短信)
# exit

 

adb uninstall com.android.mms

 

返回Success,就说明卸载成功了

 

注意..
删除之前, 最好用

  1. adb pull /system/app/xxx.apk .

复制代码

给备份一下, 避免出错(系统老是Force Close, 没法用).
出错后, 可以用

  1. adb push xxx.apk /system/app
adb shell

# mount -oremount,rw /dev/block/mtdblock3 /system

# pm list packages -f (列出apk和包名的对应关系)
# cd /system/app (APK文件所在地)
# rm Mms.* (rom自带的短信)
# exit

 

adb uninstall com.android.mms

 

返回Success,就说明卸载成功了

 

注意..
删除之前, 最好用

  1. adb pull /system/app/xxx.apk .

复制代码

给备份一下, 避免出错(系统老是Force Close, 没法用).
出错后, 可以用

  1. adb push xxx.apk /system/app
posted @ 2012-08-10 17:56 kangxm 阅读(514) | 评论 (0)编辑 收藏

最近的机器内存又爆满了,出了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过于随意化,这些不好的习惯或对程序语言的不了解是应该好好打压打压了。
下面是参考网络资源和总结一些在java编程中尽可能做到的一些地方
-
1.尽量在合适的场合使用单例
使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面
第一,控制资源的使用,通过线程同步来控制资源的并发访问
第二,控制实例的产生,以达到节约资源的目的
第三,控制数据共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信
-
2.尽量避免随意使用静态变量
要知道,当某个对象被定义为stataic变量所引用,那么gc通常是不会回收这个对象所占有的内存,如
public class A{
static B b = new B();
}
此时静态变量b的生命周期与A类同步,如果A类不会卸载,那么b对象会常驻内存,直到程序终止。
-
3.尽量避免过多过常的创建java对象
尽量避免在经常调用的方法,循环中new对象,由于系统不仅要花费时间来创建对象,而且还要花时间对这些对象进行垃圾回收和处理,在我们可以控制的范围内,最
大限度的重用对象,最好能用基本的数据类型或数组来替代对象。
-
4.尽量使用final修饰符
带 有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String。为String类指 定final防止了使用者覆盖length()方法。另外,如果一个类是final的,则该类所有方法都是final的。java编译器会寻找机会内联 (inline)所有的final方法(这和具体的编译器实现有关)。此举能够使性能平均提高50%。
-
5.尽量使用局部变量
调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量,实例变量等,都在堆(Heap)中创建,速度较慢。
-
6.尽量处理好包装类型和基本类型两者的使用场所
虽然包装类型和基本类型在使用过程中是可以相互转换,但它们两者所产生的内存区域是完全不同的,基本类型数据产生和处理都在栈中处理,包装类型是对象,是在堆中产生实例。
在集合类对象,有对象方面需要的处理适用包装类型,其他的处理提倡使用基本类型。
-
7.慎用synchronized,尽量减小synchronize的方法
都 知道,实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。synchronize方法被调用时,直接会把当前对象锁 了,在方法执行完之前其他线程无法调用当前对象的其他方法。所以synchronize的方法尽量小,并且应尽量使用方法同步代替代码块同步。
-
8.尽量使用StringBuilder和StringBuffer进行字符串连接
这个就不多讲了
-
9.尽量不要使用finalize方法
实际上,将资源清理放在finalize方法中完成是非常不好的选择,由于GC的工作量很大,尤其是回收Young代内存时,大都会引起应用程序暂停,所以再选择使用finalize方法进行资源清理,会导致GC负担更大,程序运行效率更差。
-
10.尽量使用基本数据类型代替对象
String str = "hello";
上面这种方式会创建一个“hello”字符串,而且JVM的字符缓存池还会缓存这个字符串;
String str = new String("hello");
此时程序除创建字符串外,str所引用的String对象底层还包含一个char[]数组,这个char[]数组依次存放了h,e,l,l,o
-
11.单线程应尽量使用HashMap, ArrayList
HashTable,Vector等使用了同步机制,降低了性能。
-
12.尽量合理的创建HashMap
当你要创建一个比较大的hashMap时,充分利用另一个构造函数
public HashMap(int initialCapacity, float loadFactor)
避 免HashMap多次进行了hash重构,扩容是一件很耗费性能的事,在默认中initialCapacity只有16,而loadFactor是 0.75,需要多大的容量,你最好能准确的估计你所需要的最佳大小,同样的Hashtable,Vectors也是一样的道理。
-
13.尽量减少对变量的重复计算
for(int i=0;i<list.size();i++)
应该改为
for(int i=0,len=list.size();i<len;i++)
并且在循环中应该避免使用复杂的表达式,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快。 
-
14.尽量避免不必要的创建
A a = new A();
if(i==1){list.add(a);}
应该改为
if(i==1){
A a = new A();
list.add(a);}
-
15.尽量在finally块中释放资源
程序中使用到的资源应当被释放,以避免资源泄漏。这最好在finally块中去做。不管程序执行的结果如何,finally块总是会执行的,以确保资源的正确关闭。 
-
16.尽量使用移位来代替'a/b'的操作
"/"是一个代价很高的操作,使用移位的操作将会更快和更有效
int num = a / 4;
int num = a / 8;
应该改为
int num = a >> 2;
int num = a >> 3;
但注意的是使用移位应添加注释,因为移位操作不直观,比较难理解
-
17.尽量使用移位来代替'a*b'的操作
同样的,对于'*'操作,使用移位的操作将会更快和更有效
int num = a * 4;
int num = a * 8;
应该改为
int num = a << 2;
int num = a << 3;
-
18.尽量确定StringBuffer的容量
StringBuffer 的构造器会创建一个默认大小(通常是16)的字符数组。在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来,再 丢弃旧的数组。在大多数情况下,你可以在创建 StringBuffer的时候指定大小,这样就避免了在容量不够的时候自动增长,以提高性能。 
如:StringBuffer buffer = new StringBuffer(1000);  
-
19.尽量早释放无用对象的引用
大部分时,方法局部引用变量所引用的对象 会随着方法结束而变成垃圾,因此,大部分时候程序无需将局部,引用变量显式设为null。
例如:
Public void test(){
Object obj = new Object();
……
Obj=null;
}
上面这个就没必要了,随着方法test()的执行完成,程序中obj引用变量的作用域就结束了。但是如果是改成下面:
Public void test(){
Object obj = new Object();
……
Obj=null;
//执行耗时,耗内存操作;或调用耗时,耗内存的方法
……
}
这时候就有必要将obj赋值为null,可以尽早的释放对Object对象的引用。
-
20.尽量避免使用二维数组
二维数据占用的内存空间比一维数组多得多,大概10倍以上。
-
21.尽量避免使用split
除 非是必须的,否则应该避免使用split,split由于支持正则表达式,所以效率比较低,如果是频繁的几十,几百万的调用将会耗费大量资源,如果确实需 要频繁的调用split,可以考虑使用apache的StringUtils.split(string,char),频繁split的可以缓存结果。
-
22.ArrayList & LinkedList
一 个是线性表,一个是链表,一句话,随机查询尽量使用ArrayList,ArrayList优于LinkedList,LinkedList还要移动指 针,添加删除的操作LinkedList优于ArrayList,ArrayList还要移动数据,不过这是理论性分析,事实未必如此,重要的是理解好2 者得数据结构,对症下药。
-
23.尽量使用System.arraycopy ()代替通过来循环复制数组
System.arraycopy() 要比通过循环来复制数组快的多 
-
24.尽量缓存经常使用的对象
尽可能将经常使用的对象进行缓存,可以使用数组,或HashMap的容器来进行缓存,但这种方式可能导致系统占用过多的缓存,性能下降,推荐可以使用一些第三方的开源工具,如EhCache,Oscache进行缓存,他们基本都实现了FIFO/FLU等缓存算法。
-
25.尽量避免非常大的内存分配
有时候问题不是由当时的堆状态造成的,而是因为分配失败造成的。分配的内存块都必须是连续的,而随着堆越来越满,找到较大的连续块越来越困难。
-
26.慎用异常
当 创建一个异常时,需要收集一个栈跟踪(stack track),这个栈跟踪用于描述异常是在何处创建的。构建这些栈跟踪时需要为运行时栈做一份快照,正是这一部分开销很大。当需要创建一个 Exception 时,JVM 不得不说:先别动,我想就您现在的样子存一份快照,所以暂时停止入栈和出栈操作。栈跟踪不只包含运行时栈中的一两个元素,而是包含这个栈中的每一个元素。
如 果您创建一个 Exception ,就得付出代价。好在捕获异常开销不大,因此可以使用 try-catch 将核心内容包起来。从技术上讲,您甚至可以随意地抛出异常,而不用花费很大的代价。招致性能损失的并不是 throw 操作——尽管在没有预先创建异常的情况下就抛出异常是有点不寻常。真正要花代价的是创建异常。幸运的是,好的编程习惯已教会我们,不应该不管三七二十一就 抛出异常。异常是为异常的情况而设计的,使用时也应该牢记这一原则。

文章主要是为了抛砖引玉,希望有更多牛人的指点

谢谢的 xuanyuan 的建议:
===================================================
7.慎用synchronized,尽量减小synchronize的方法
re:同意,不过文中有个地方说错了,使用synchronized关键字并不一定都是锁定当前对象的,要看具体的锁是什么。如果是在方法上加的synchronized,则是以对象本身为锁的,如果是静态方法则锁的粒度是类。
---------------
9.尽量不要使用finalize方法
re:同意,其实不推荐用finalize方法的根本原因在于,JVM的规范并不保证何时执行该方法,所以用这个方法来释放资源很不合适,有可能造成长时间资源得不到释放。
---------------
16.尽量使用移位来代替'a/b'的操作;17.尽量使用移位来代替'a*b'的操作
re:个人不太同意这两条。这样做确实有更好的性能,但是却牺牲了可读性。这两个操作符对很多程序员来说并不直观。我认为在如今硬件价格不那么昂贵的情况下,略微牺牲一些性能,换来更好的可读性和可维护性是好的选择。
===================================================
19.尽量早释放无用对象的引用
大部分时,方法局部引用变量所引用的对象 会随着方法结束而变成垃圾,因此,大部分时候程序无需将局部,引用变量显式设为null。
例如:
Public void test(){
Object obj = new Object();
……
Obj=null;
}
上面这个就没必要了,随着方法test()的执行完成,程序中obj引用变量的作用域就结束了。但是如果是改成下面:
Public void test(){
Object obj = new Object();
……
Obj=null;
//执行耗时,耗内存操作;或调用耗时,耗内存的方法
……
}
如果Object obj = new Object(); 如果这对象并不是大对象,这有必要吗?Obj=null;只是告诉jvm这个对象已经成为垃圾,至于什么时候回收,还不能确定! 这可读性也不好!
===================================================
posted @ 2011-08-22 15:18 kangxm 阅读(542) | 评论 (0)编辑 收藏

提示/boot目录空间不足,查了一些资料,最后把久的内核给卸载得以解决。

1.首先查看自己使用的内核

lxz@lxz-pc:~$ uname -a

Linux lxz-pc 2.6.35-25-generic #44-Ubuntu SMP Fri Jan 21 17:40:48 UTC 2011 i686 GNU/Linux


2.然后查看自己boot目录,选择需要卸载的版本
lxz@lxz-pc:~$    cd /boot
lxz@lxz-pc:/boot$  ls -l
总计 35125
-rw-r--r-- 1 root root   705861 2011-01-22 06:04 abi-2.6.35-25-generic
-rw-r--r-- 1 root root   709370 2011-03-01 23:56 abi-2.6.35-28-generic-pae
-rw-r--r-- 1 root root   128615 2011-01-22 06:04 config-2.6.35-25-generic
-rw-r--r-- 1 root root   129056 2011-03-01 23:56 config-2.6.35-28-generic-pae
drwxr-xr-x 3 root root     7168 2011-03-23 10:31 grub
-rw-r--r-- 1 root root 10761551 2011-03-04 10:49 initrd.img-2.6.35-25-generic
-rw-r--r-- 1 root root 10741569 2011-03-23 10:18 initrd.img-2.6.35-28-generic-pae
drwx------ 2 root root    12288 2011-01-05 04:52 lost+found
-rw-r--r-- 1 root root   165084 2010-09-25 01:14 memtest86+.bin
-rw-r--r-- 1 root root   167264 2010-09-25 01:14 memtest86+_multiboot.bin
-rw-r--r-- 1 root root  1831296 2011-01-22 06:04 System.map-2.6.35-25-generic
-rw-r--r-- 1 root root  1873873 2011-03-01 23:56 System.map-2.6.35-28-generic-pae
-rw-r--r-- 1 root root     1192 2011-01-22 06:06 vmcoreinfo-2.6.35-25-generic
-rw-r--r-- 1 root root     1196 2011-03-01 23:57 vmcoreinfo-2.6.35-28-generic-pae
-rw-r--r-- 1 root root  4294672 2011-01-22 06:04 vmlinuz-2.6.35-25-generic
-rw-r--r-- 1 root root  4428048 2011-03-01 23:56 vmlinuz-2.6.35-28-generic-pae
上面显示的情况中,是我已经把linux-image-2.6.35-27-generic的结果

3.卸载旧内核应该使用命令:
lxz@lxz-pc:/boot$  sudo apt-get remove linux-image-2.6.35-27-generic

4.查看/boot目录:
lxz@lxz-pc:/boot$ sudo du -m /boot           //以MB为单位显示
1    /boot/grub/locale
2    /boot/grub
1    /boot/lost+found
36    /boot

5.查看文件系统使用情况,和文件系统被挂在的位置:
lxz@lxz-pc:/boot$  df  -lh
文件系统            容量  已用  可用 已用%% 挂载点
/dev/sda7              71G  7.7G   60G  12% /
none                 1001M  244K 1001M   1% /dev
none                 1007M  216K 1006M   1% /dev/shm
none                 1007M  100K 1006M   1% /var/run
none                 1007M     0 1007M   0% /var/lock
/dev/sda8              92M   42M   46M  48% /boot
posted @ 2011-04-06 12:09 kangxm 阅读(3173) | 评论 (0)编辑 收藏

在ubuntu环境下进行android开发,想把目标设备定为真实的手机。

前几天刚买了个defy就试了下,结果打开手机usb调试模式连接到电脑后,在eclipse里面手机名字显示为一堆???号,且无法使用。

需要以下的步骤才能连接到:

1 把手机设备为usb调试模式并和电脑连接

2 打开终端运行

    lsusb


    屏幕上会有一行显示类似

    Bus 002 Device 012: ID 22b8 :xxxx Motorola xxxxxxxxxxxx

    这就是你的android手机了

3 然后在终端运行

   sudo gedit /etc/udev/rules.d/50-android.rules

   并编辑其中加入行: SUBSYSTEM=="usb", SYSFS{"Motorola xxxxxxxxxxxx "}=="22b8 ", MODE="0666"

4 接着运行

    sudo chmod a+rx /etc/udev/rules.d/50-android.rules

    sudo /etc/init.d/udev restart

5 最后进入android sdk的tools目录 platform-tools 运行

    sudo ./adb kill-server

    sudo ./adb devices

试着重新打开eclipse,在运行参数里选则手动选取目标设备,这时在Device Chooser里面应该就可以看到正常显示出名字的手机了。

posted @ 2011-03-23 14:11 kangxm 阅读(2040) | 评论 (2)编辑 收藏

        
        目前手上的项目需要用到memory cache,于是我选择强大的Memcached。至于Memcached的强大先不在这里说了,
后续有时间,我专门来介绍一下Memcached吧。今天只介绍下安装和配置;
         直接进入主题吧;
         1、下载
               Memcached下载地址: http://memcached.org/  我下载的最新版本v1.45
               Libevent下载地址:http://www.monkey.org/~provos/libevent/   我下载的版本是libevent-1.4.13-stable
              
          因为Memcache用到了libevent这个库用于Socket的处理,所以需要安装libevent

        2、先安装libevent
             # tar zxvf libevent-1.4.13-stable.tar.gz
             # cd libevent-1.4.13-stable
             # ./configure –prefix=/usr
             # make
             # make install
      
        3、再安装Memcached,同时需要安装中指定libevent的安装位置:
             # tar zxvf memcached-1.4.5.tar.gz
             # cd memcached-1.4.5
             # ./configure –with-libevent=/usr
             # make
             # make install
             安装完成后会把memcached放到 /usr/local/bin/memcached ,

        4、memcached的基本设置

             启动Memcache的服务器端:
             # /usr/local/bin/memcached -d -m 100 -u root -l 192.168.1.192 -p 12000 -c 256 -P /tmp/memcached.pid

    -d选项是启动一个守护进程,
    -m是分配给Memcache使用的内存数量,单位是MB,我这里是100MB,
    -u是运行Memcache的用户,我这里是root,
    -l是监听的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址192.168.1.192,
    -p是设置Memcache监听的端口,我这里设置了12000,最好是1024以上的端口,
    -c选项是最大运行的并发连接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定,
    -P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid,

           如果要结束Memcache进程,执行:

           # kill  cat /tmp/memcached.pid

          也可以启动多个守护进程,不过端口不能重复。

            
posted @ 2010-04-20 12:19 kangxm 阅读(623) | 评论 (0)编辑 收藏

原处:http://www.javaeye.com/topic/644277

《为什么毕业后5年同学间的差距会拉得如此巨大?》 引起大家不少的共鸣,今天继续发布一篇励志的文章,首先声明:如果你是“愤青”或“类愤青”,对不起,请你离开,我怕我的观点再次伤害你那“纯洁”得几乎不识人间烟火的心灵!

   如果你想从此改变自己,那么,就花上十几分钟的时间,仔仔细细把这篇文章看完。如果你想改变自己的命运,那么,从现在就开始行动。有时候我们之所以失 败,99%的原因是因为说得太多,而行动得太少!那1%的人或许并不聪明,或许只是小学毕业,但是人家成功了,做了你的上司,那是因为人家善于用行动证明 自己,而不是嘴巴。我不敢保证看了我这篇文章就一定会使你平步青云,我没有那个本事。如果你有一天飞黄腾达,也绝对与这篇文章没有直接的关系。因为,你的 命运,只掌握在你自己的手中!

   同样是打工,为什么你一个月只有2、3K,而唐骏的身价却可以高达10亿?

   或许你会反驳我,说人人都成为唐骏的概率有多大?的确,人人都成为唐骏的确不现实,但是经过努力,月薪达到8K、1W的总是大有人在吧?虽然不能达到大富大贵,但也不至于被女朋友看不起,付不起房贷首付款吧?

    很多人都喜欢抱怨,觉得这个世道不好。但现实是,在同样世道不好的情况下,为什么有的人成功,而你却碌碌无为?差距在哪里?怪世道不好吗?还是怪自己没本 事?我说这话可能你不爱听。但是一个无法辩驳的事实是:你要是有本事,为什么月薪只有2、3K或者3、4K?事实胜于雄辩。所以,如果看到这里还想抱怨的 人,那么,也请你趁早离开。抱怨永远解决不了问题。

    职场是一个复杂的综合体。看到别人在职场上呼风唤雨,你认为很惬意,是么?但是他们风光表面的背后,又有几个有看到他们曾经付出的巨大艰辛?这个社会其实 是很公平的。努力不一定有回报,但是如果不努力,就一定没有回报。要怪,就怪自己投错胎,怪自己的老子没本事,当初没有给你留下一大笔可以挥霍的资本!

   说归说,对于那些想改变自己的朋友们来说,还是需要看清楚一些东西,有一些经验也想和大家分享分享。同样是职场人士,我也有我的经验和感受。在打工的3年 里,我得到了7次加薪(同时进入公司的员工,加薪不超过2次的员工大有人在),顺利地从员工做到了总监,是公司所有员工中成长最快的。我敢肯定,在看过这 篇文章的人当中,肯定有人比我更优秀。但是对于那些更渴望得到帮助的朋友们来说,我还是希望把自己的经验写出来,与大家分享。

我自己写了一篇文章,叫《决定前程的8件事,你做到了几件?》在这里整理出来,希望能对大家有所帮助。

一、一定要清楚自己未来的目标是什么
很多人把职场想得太美好,其实不然。如果你没有规划好,你就会难免遇到各种各样的问题:工作不开心;没有前进的动力;工作不是自己想像的那么好;自己的才能无法发挥;看到以前的同学待遇如何如何,便受不了刺激,急切地想跳槽;当初为了生存而找的工作,根本就不适合自己……
这是几乎所有初入职场的朋友都会面临的问题。而这些问题通常会在步入职场的1-3年之内最明显(3年之后之所以不明显,是因为你已经被现实折磨得 太久了,已经被种种不平现象同化了,因此也就习惯了。你曾经的种种抱负被现实碾得粉碎,于是,你也从一个志向远大的年轻人一下子变成了一个碌碌无为、甘于 平庸、成天为了生计而奔走的普通打工者)。

   如果不及早解决这些问题,那么,你就会荒废这3年的时间(有的人可能会更长),而对于一个职场新人来说,这3年至关重要,是锻炼能力、积累资本的黄金3 年!一旦错过,则要花费更多的时间,从头再来,重新弥补!更有甚者,可能一辈子都无法弥补!这绝对不是危言耸听!因此,如果你的职场年龄还没有超过3年, 恭喜你,还有改变命运的机会。而一旦超过了3年,那么,你的每一次改变,都将付出巨大的代价!

   为什么要清楚自己的目标?因为,有了目标,才有行动的指南。知道自己想干什么,喜欢干什么,这才是你前进的最终动力。工作不开心、动力不足、盲目跳槽的最 根本原因是职业目标不清晰。没有目标,便没有了追求,于是,所有的行动只是为了挣一口饭吃。你根本没有考虑过自己的未来应该端什么饭碗。
或许你在30岁之前还有挥霍的资本,因为年轻嘛,做什么都不怕。连广告上都说了,“30岁之前,有什么好怕的?!”而一旦过了30岁,你走的每 一步都必须要慎之又慎,因为:你要结婚、你要养活老婆孩子、你要供房贷、你要供养年迈的父母、孩子大了还要上学、父母年迈了需要照顾……等等等等,所有的 这些责任,都要你来承担。如果没有规划,一旦出现问题,你只能自乱阵脚。

   人生的职业发展如同品牌塑造一样,只不过你的产品就是你自己。你自己的发展目标,也就是你人生的品牌目标。有了目标,就要考虑该怎么走。每走一步,都应该 离目标更近,而不是更远。所以,你每做一个决定的时候,要衡量这个决定对不对,唯一的标准就是:它是不是能够帮助你离目标更近?如果不是,那么,赶紧住 手,因为,你走的路偏离了你的目标!再走下去,只能错得更离谱!

   对于人生目标,涉及到职业生涯规划的问题。这是一个老话题,很多人以为自己很了解了,其实却远不是那么回事。大家可以看一些相关书籍,但在中国,此类书籍 的最大问题就是说教性比较强,实用性非常差!很多人看了书之后依然一头雾水,不知所措,看了之后反而更糊涂。我的意见是,最好还是找一些专门的机构咨询一 下。
注意:是咨询,不是测评。二者的区别在于,咨询的意义在于“为客户提供可应用性的解决方案”,而测评则仅仅局限于“帮助你认识自己”,至于怎么 做,怎样行动才能更接近自己的目标,不知道!因为测评的人都是专家,而国内的专家都是做研究的,没有实战经验,甚至对职场升迁是怎么回事都不太清楚,怎么 可能指导你做实战规划?建议大家去做一下职业生涯规划。如果现在不解决,恐怕未来3年你都会白白浪费,更有可能因此而毁了你的一生!
记住:有了规划,不一定能够成功;但没有规划,一定不会成功!

二、能力固然重要,但并不能代表全部

  这里所说的能力,是指专业技能。步入职场你会发现,能力其实并没有你想像的那么重要,它并不是是步步高升的全部资本。你会发现一个能力不太强的人做了你的 上司,只因为他在这个公司干了10年——这说明“资历”是你高升的本钱(这种现象,在国有企业和政府机构里特别明显,因此,在国企工作的朋友和公务员同志 要注意了);有时候你会发现能力并不怎么强,但是与老板关系非常好的人通常能够得到提拔——这说明“关系”也是本钱。在我原先工作的公司,有两个特别明显 的例子。

    一 个有着丰富工作经验的男士,跳槽来到公司,能力也特别强,但就是与同事处理不好关系,自认为自己非常牛,喜欢主动当别人的“导师”,动不动就对别人的工作 指手画脚,顶头上司非常讨厌他;而同时进入公司的另外一位女士,能力不是特别强,但是非常踏实、勤奋、与其他同事相处得也很好,能够顾全大局。最后试用期 结束时,那位女士得到了公司的认可,而那位男士则收到了公司的辞退通知。

   在职场上,一定要对职场有清醒的认识,不要生活在梦幻当中,不要太理想化,不要标新立异,不要恃才傲物,不要认为有能力就可以走遍天下。专业技能固然重 要,但是职场发展看的是一个人的综合素质。综合素质高的人,才是职场发展的“潜力股”。这些综合素质,包括沟通能力、人际关系能力、团队合作能力、管理能 力、工作态度及敬业精神等各种“软实力”。

    对于有些朋友而言,可能会对这些“软实力”不屑一顾。很多人会说,如果老板喜欢爱拍马屁的人,难道我就要委屈自己,学着去拍马屁?很不幸,我会告诉你,答 案是肯定的,你一定要学会拍马屁,否则吃亏的是自己。但要声明的是,我不是教你诈。中国有句成语,叫外圆内方,用在人际交往上,就是说你与人相处要学会妥 善处理各种关系,但不可因此而失去了内心的准则,否则就变质了。尤其在中国这种注重人情的社会,这种人际交往的能力一定要好好练练。
如果有时间,看一下《厚黑学》,了解一下社会现实,切忌不可因此而迷失了自己。

三、要手足够的“亮剑”资本

    有的大学生经常会跟我说,我毕业之后一定要找到一份月薪多少多少的工作,争取做到什么什么职位。这时候我总是会耐心听完他们的“远大蓝图”,然后问一句:“你凭什么达到你的目标?你的资本是什么?”然后他就会哑口无言。

    我相信读过这篇文章的人也会和这位大学生一样,有着自己的伟大抱负,但是大学四年下来,你有没有想到,要实现这些目标,你的资本是什么?对于很多已经身在职场的朋友而言,你晋升的资本又是什么?

   人生在发展过程中,很多时候都需要毫不犹豫地向别人展示自己的实力,要敢于展示,善于展示,这就是“亮剑”。因为这年头,酒香也怕巷子深,是金子未必会发 光。相反,发光的倒是那些碎玻璃、烂瓶子。中国什么都缺,就是不缺人。茫茫人海,如果你一直都谦虚地默默无闻,那么,你就大错特错了。

   既然具备了“亮剑”的意识,那么,下一步你就要考虑到亮什么剑:我到底拿什么资本给人家看?对于职场上的朋友而言,你“亮剑”的资本又在哪里?你的业绩提 升了吗?你的能力提升了吗?你在一年内看过多少本对自己的职业有益的书籍?你参加过几次培训班来为自己充电?如果没有,你又凭什么让老板为你加工资?靠抱 怨?你肯定会提前被职场淘汰出局!


四、慎重对待第一份工作

这一观点,对于大学生来说,更有意义。
现在整个社会、媒体、专家等等各种单位都一直在鼓吹“先就业,再择业”。这种论调不是今年就有,而是多好多年前就出现了,并且屡屡出现,不绝于耳。相信当年我们大学毕业时候,也会有很多人相信了这一点吧?管它呢,骑驴找马,先找份工作挣钱填饱肚子再说!

但是根据本人自身的经验及职场发展的现实情况来看,本人绝对不赞同这种说法。相信现在在职场上发展不顺的朋友,多半也和第一份工作有关系吧?俗话说,“男怕入错行,女怕嫁错郎。”第一步错了,以后就会经常犯错。正所谓一步错,步步错。

为什么第一分工作这么重要呢?原因有三:

1、先入为主的观念影响。
具体是指,先听进去的话或先获得的印象往往在头脑中占有主导地位,以后再遇到不同的意见时,就不容易接受。举个最简单的例子:在你的头脑印象中, 诺基亚已经是手机的代名词。如果有一天诺基亚生产出了一种“诺基亚牌电脑”,你的心里是什么感觉?非常不对劲对不对?这主是先入为主现象。

我原先有一个同事,曾经在海尔工作过,她用的是海尔的手机,功能也非常不错,但她总是说要换一部手机,我问她原因,她说,兜里装着海尔的手机,总 感觉像装了一个大冰箱,非常不舒服。为什么?先入为主呗!不要小看这一现象,其实对人的潜意识影响非常大。海尔的手机和电脑等IT产品卖得不好,相当一部 分是因为先入为主:大家普遍认为海尔是家电的代名词,而不是IT的代名词。

对于求职的大学生来说,这一观念同样会影响你以后的发展。你的第一份工作会对你以后的工作产生影响,你跳槽时,你的新雇主也会通过你的第一份工作 经验来判断你是否能够胜任这份工作。曾经有一个大学生,毕业之后想做策划,就找了一家广告公司。刚进公司时,因为文笔不错,被安排到了文案的位子上。而与 他同时进去的另外一个人,恰恰因为文笔不好而被安排到了策划的位子上。后来她屡次想转行做策划,但都是因为前一份工作经验的影响,而始终没有得到转行的机 会。

2、职场中不允许从头再来。

如果公司招聘的是有几年工作经验的老员工,一定要求是“相关经验”!这一点至关重要!因为这样的员工一般不需要培训,可以直接上岗,会很快为公司 带来最大的效益。如果是工作几年以后再打算转行的应聘人员,一般不会受到重视,一是不会给公司直接带来效益,二是培训起来也比较困难,思维已经固化。与其 这样,倒不如招一名应届生,白纸一张,可塑性强,发展起来潜力更大。

所以,一旦有了工作经验之后,再想转行从头再来,难度相当大。除非你认识公司的高层领导,可以得到一个机会,否则,很难。

3、时间成本不允许。

步入职场的前三年,是一个人职业成长的最重要、最关键的时期。如果你这时候还把工作的重点放在骑驴找马式的转行上,则会浪费你最宝贵的青春,你的成长也因此比其他人慢一步,而很多晋升的机会将因此而失去。
所以,对待第一份工作,一定要慎重。找工作就像结婚,情愿不结,绝不能乱结。
如果现在你刚刚步入职场还不到3年,劝你趁早做一个职业规划,亡羊补牢,尤未为晚。一旦你结婚了买房子了,你再想弥补都已经晚了!

五、要保持一种“空杯心态”

给大家讲一个故事。古时候有一个佛学造诣很深的人,听说某个寺庙里有位德高望重的老禅师,便去拜访。老禅师的徒弟接待他时,他态度傲慢,心想:我 是佛学造诣很深的人,你算老几?后来老禅师又十分恭敬地接待了他,并为他沏茶。可在倒水时,明明杯子已经满了,老禅师还不停地倒。他不解地问:“大师,为 什么杯子已经满了,还要往里倒?”大师说:“是啊,既然已满了,干嘛还要倒呢?”

禅师的意思是,既然你已经很有学问了,干嘛还要到我这里求教?这就是“空杯心态”的故事哲理。它最直接的含义就是一个装满水的杯子很难接纳新东 西,要将心里的“杯子”倒空,将自己所重视、在乎的很多东西以及曾经辉煌的过去从心态上彻底了结清空,只有将心倒空了,才会有外在的松手,才能拥有更大的 成功。这是每一个想在职场发展的人所必须拥有的最重要的心态。它告诉我们一个道理:做事的前提是先要有好心态。如果想学到更多的学问,先要把自己想象成 “一个空着的杯子”,而不是骄傲自满。

我见过很多的大学毕业生,刚进入公司时常常处处吹牛,说自己在学校如何如何,本来可以找到更好的工作,迫不得已才来到了这里等等之类的话,好像这 家公司委屈了自己。在这里提醒一下那些即将步入职场的大学生:这种心态千万要不得!不要认为自己很牛。还是那句你不爱听的话:中国什么都缺,就是不缺人! 话又说回来,你要是这么牛,为什么不像比尔?盖茨、戴尔、乔布斯那样,大学没毕业就退学去创办一家世界级的大企业?火车不是推的,牛皮不是吹的。
你要是有本事,就用事实证明给人家看,而不是成天抱怨!

对于身在职场的朋友而言,这一心态同样重要。中国有一个词,叫“虚怀若谷”。我们都知道,优秀的人有极高的素养,甚至是虚怀若谷,他们都有一个能 包容一切的胸怀,有了这样的胸怀,你在职场上就会获得别人的尊重,就会获得更多的发展机会。类似的词还有“大智若愚”“大巧若拙”等等,不多说,自己去体 会。

六、要懂一点做人的常识
职场就像一个大熔炉。在职场中,不仅仅是要挣一碗饭吃,更重要的是学会做人的道理。如果连最起码的道理都不懂,你不仅得不到别人的尊重,更会失去更多的发展机会。因为,在中国,人际关系也是生产力。中国有句古话:得道多助,失道寡助。

我见过很多人,虽然已经工作多年,但对于做人,却连一点最基本的常识都不懂。做人的道理万万千,但其中最重要的,莫过于以下三条:

1、严于律己,宽以待人。
职场不同于生活。虽然职场上同事之间的相互关系表面上会比较好,但你总会感觉到缺点儿什么。非常明显的一点,就是大家都在相互利用,人与人之间难免会因为利益关系而闹得不愉快。这时候,你若是锱铢必较,势必引起同事之间的不愉快。
在这种情况下,为避免纠纷,同时也为了赢得他人的尊重,你要学会大度一些,容忍一些。出现问题时,首先想想是不是自己出了问题,而不是一出现问题就去找别人的责任(长此以往,你的心态就会变得非常不平衡,因此也难以容人了)。
严于律己,宽以待人,是十分必要的。长期下去,你会积累很多的人脉,会得到大家的尊重;而你需要帮助时,大家也乐意伸手。
2、学会倾听。
无论什么时候,倾听都显示出一个人的职业素养。与别人交谈时,一定要记住等对方说完话时再发表意见,切不可中途插话或者打断他人。通过这种方式,大家都乐意和你交往,同样也会有助于树立你个人在大家心目中的形象。
3、诚实守信。
职业中固然处处充满了相互利用、利益至上的现象,在这种情况下,诚实守信仍然不失为一种传统美德。诚信同样可以带来效益。只要你诚实守信,长此以 往,大家都会对你形成一种良好的印象,都愿意和你交往。而那种两面三刀、当面一套背后一套的人,固然可以占一点小便宜,但要想成就大事业,诚实守信的基本 原则绝对不能丢。
七、要学会遵守游戏规则
我为什么在文章一开头就提醒“愤青”或者“类愤青”们不要看这篇文章?
因为他们多半是放荡不羁、不会遵守游戏规则的主儿!很多人都会感觉到,在职场上发展,不仅会受到各种约束,而且处处都充满了不公平现象。比如上班 迟到老板会扣你工资,但你加班的时候却从来没有拿过加班工资。这是最常见的一种现象,其他不公平的现象也比比皆是,这里就不多就了,大家都有体会。
在这个世界上,不要奢求公平。那只是一种乌托邦式的理想,从来都不存在于现实社会中。
员工和老板之间的关系,就好像是一场游戏。是游戏就会有游戏规划,否则,游戏就玩不下去。但是,游戏规则是谁制定的呢?当然是老板,各种利益也偏向老板!身在职场的你,一开始看不惯这种现象,是很正常的,因为你初涉职场,本质上还是比较纯洁的。
但你一定要学会慢慢接受这种游戏规则。不要试图改变这种规则,因为在老板面前,你没有太多的话语权。说得再难听些,你只是一个打工的,混口饭吃,给你吃就不错了,还嫌饭凉?如果不想做,可以离开。还是那句话:中国什么都缺,就是不缺人。
记住这句话:“如果你不是游戏规则的制定者,你的选择只有两条:要么屈从,要么离开!”
八、机会只垂青有准备的人
无论你再怎么抱怨,再怎么不开心,饭还是要吃的,觉还是要睡的,工作还是要做的,未来的事情永远只属于自己的。买房子也好,娶老婆也罢,压力只有 自己扛,老板不会为你操任何心。与其有时间去抱怨,但不如踏踏实实静下心来,好好提升自己的基本功,用事实证明自己的本事,让别人对你刮目相看,万不可因 为自己的书生意气而自做一个自毁前程的“愤青”。
当然,你的准备是多方面的,除了专业技能外,其他的辅助技能也是非常必要的,比如沟通能力、人际关系处理能力、管理能力等等。当然,更重要的是 要为自己的未来做一个规划,清楚地知道自己的目标是什么,应该怎么努力才能实现。适当的时候也要充充电,不要舍不得那半个月的工资,这也算是为自己的未来 进行投资,有什么舍不得的呢?如果你现在不学会“舍”,以后将永远也“得”不到。
有时候,你之所以发展得不好,不是因为没有机遇,而是因为你没有准备好,导致机遇与你擦肩而过。这个社会就是这样,再怎么不合理,再怎么不公 平,但是发展机遇是时时都会面临的,只看你有没有准备好。你要是真的练就了一身令人刮目相看的真本事,说不定明天就有人请你做某世界500强的总裁也不一 定呢。
以上只是本人做HR多年的经验积累,希望对大家有所帮助。作为过来人,我真诚地希望在职的朋友们及即将就业的大学生们也能够以一种“空杯心态” 看待这篇文章。有时候,过来人的经验是非常有价值的,那是他们用时间和金钱换来的血汗教训。有的人偏偏不信这一套,认为只有自己亲自体会过,才能知道是什 么滋味,别人的经验只是别人的,和自己无关。如果你这样想,那我也没有办法。我也要有一种宽容的心态,冷静看待那些“不见棺材不掉泪,不撞南墙不回头”的 “人才”,不是吗?参加一下培训,适当充一下电,为未来做更好、更完善的准备,才是积极的人生态度。记住:抱怨永远解决不了问题!)

posted @ 2010-04-16 12:24 kangxm 阅读(496) | 评论 (0)编辑 收藏

       假设我们现在有user和org两张表:
1、user用户表 字段包含:id、name、orgId 其中orgId标示该用户所属的组织
2、org组织表   字段包含:id、name
两表之间的关系很简单,一个组织下会拥有多个用户,一个用户属于某个组织。

         在解析之前先普及一下数据库空值(null)的概念:
有很多时候我们都能碰到某表中某字段值为空的情况,空值不等同于字符串中的空格、空串
也不等同于数字类型的0,所以,一般我们用IS NULL 关键字来检索有空值字段的记录。而不是用!=、<>这些判断符。

        接下来,我们给示例库表中做上一些测试数据,如下图:
                             

        有了这些数据,咱们就可以进入正题啦:
一、左连接、右连接
        A Left join(左连接)优先解出左表中所有的记录,包含右表中没有匹配到得记录。
        A Right join(右连接)优先解出右表中所有的记录,包含左表中没有匹配到得记录。

左右连接是相互对应的,所以在这里一并解释。
罗嗦一句如何区分左表和右表:
        在JOIN的左边出现的表叫左表,在JOIN的右边出现的表叫右表
具体体现在SQL语句上即:(以左连接为例)
        左连接语句:SELECT user.name,org.name FROM user LEFT JOIN org ON  user.orgId = org.id
        右链接语句:SELECT user.name,org.name FROM user RIGHT JOIN org ON  user.orgId = org.id
显而易见,该SQL中,user为左表、org为右表
下面我们来看看这两个语句分别执行后的效果:
                                   
        为了更好的看出左右连接的效果,我们再来看看内连接查询出来的效果
        内连接:SELECT user.name,org.name FROM user JOIN org ON  user.orgId = org.id
内连接语句执行后的效果:
                                                    
        很明显:
内连接与左连接相比,检索结果集中漏掉了user表的user3数据
内连接与右连接相比,检索结果集中漏掉了org表的org4数据

posted @ 2010-03-14 18:25 kangxm 阅读(648) | 评论 (0)编辑 收藏

       
        进入10年了,先回顾一下吧:

        08年注定是变化的一年,该死的金融危机上来就搞倒了我待了3年多的公司,到现在还灰常的怀念以前公司的工作氛围和那些一起奋斗的日子。那时候做项目,真的是把项目当自己的孩子来养,很有感情;怀念ing.

        09年注定是压抑的一年,生活压抑,工作压抑,很多压抑。。。压抑到实在不想纠缠。

        10年注定是拼搏的一年,勾画了美丽的图,也承诺了很多事,必须做了。

        10年的那些事在这里留个记录吧,年终的时候再来看;

        1、ZZ的那个网站,我已经答应下来了,不管多难也要搞出来;
        2、WX的那些活,希望我能做的比去年更好,也希望他那边能再多接一些新活;
        3、公司的那摊事,走一步看一步吧,毕竟09年失望太多,希望能找到合适的契机和方向;
        4、考驾照、买车,今年必须实现了,要不5年计划没法划上句号了;


        
posted @ 2010-02-24 10:15 kangxm 阅读(443) | 评论 (2)编辑 收藏

早上读RSS,看到不错的东西,抄录下来


1、  坚持不懈的向团队传达目标

2、  崇拜质量

3、  每天都和项目成员聊上两句

4、  敢于说不,慎于说不

5、  帮助项目成员解决困难,而不是帮他干活

6、  敏感,不将风险留到最后才面对

7、  懂得欢庆

个人觉得总结的蛮好,简单易懂,回想我工作这几年:
不管作项目组成员,还是作Team Manager;
不管项目成功,还是失败;
以上都比较有感触

posted @ 2009-05-12 11:24 kangxm 阅读(421) | 评论 (0)编辑 收藏

不小心把快速启动里面的“显示桌面”图标搞没了,懒得折腾,所以一直用WIN+D,还是觉得不太习惯。总觉得少了点什么......

后来还是把“显示桌面”找回来了!记录一下

以前用过一个自己编写“显示桌面.scf”文件的办法干过,具体操作如下:

记事本输入:[Shell]Command=2IconFile=explorer.exe,3[Taskbar]Command=ToggleDesktop另存为"显示桌面.scf",文件类型为所有文件。然后将文件拖到快速启动栏即可;


不过有点麻烦,这次 google了一下,找到一个更简单的办法;

“start”-->“Run”-->输入“regsvr32 /n /i:u shell32”

显示桌面.jpg

这个时候你会发现你的快速启动栏里面就有了“显示桌面”
posted @ 2009-04-21 10:29 kangxm 阅读(543) | 评论 (0)编辑 收藏

     摘要: 转:唐骏:我的创业第一步
寻找新的发展空间
  我的人生其实经历了很多次失败。考大学是一次失败,留学日本读研究生又是一次失败。我和板仓老师发生冲突后私逃美国的行为,无论如何都是不妥当的。但从另一个角度讲,从日本到美国的人生环境转变,是我的主动选择,也为我未来的职业生涯创造了新的契机。

  阅读全文
posted @ 2008-12-18 11:33 kangxm 阅读(479) | 评论 (0)编辑 收藏

例子在:\jasperreports-3.1.2-project\jasperreports-3.1.2\demo\samples

用ant工具运行就可以看到效果

1. alterdesign

该例子演示了报表编译后,在报表展现的时候如何动态的控制其中的元素
比如让某一个矩形变色或其他

2. antcompile

演示如何让 ant 来编译
3. chart

演示了如何在报表中添加图像,JasperReport是用Scriptlet的方式
往报表中添加图像,而Scriptlet是调用也是开源的jfreechart的Api来
生成图形,去jfreechart看一下,该工具能的图形生成能力也很强
4. datasource

演示了如何在报表中使用各种数据源,能够使用beanarray
beancollection,也可以用自定义的数据源,只要继承了JRDataSource的
两个接口,这个能给用户提供非常大的灵活性,报表的数据不用局限于一
条Sql语句,也可以使用存储过程,对生成报表中的数据也可以排序,二
次检索,等等
5. fonts

各种字体的演示
6. horizontal

演示了水平分栏的报表,演示报表中分了三栏,其中还用到了
textFieldExpression,就像if语句的效果来选择输出的内容
7. hyperlink

演示了各种样式的链接
8. images

演示了如何在报表中加入图像以及图像的显示方式
9. jasper

演示了分组分栏的报表,演示中用了2次group
10. jcharts

演示了调用另一个开源的API jcharts来往报表中加入分析图形,原理同
上chart,如果jfreechart都还不能满足你分析图形的要求,那到jcharts
里找找看吧,说不定有
11. landscape

演示横向的报表
12. nopagebreak

演示比如在IE中不分页的方式打印出报表的内容,通过这个演示也可以
了解报表输出如何配置参数
13. noreport

演示了如何直接通过java程序生成JasperPrint对象来输出
14. noxmldesign

演示了如何直接通过java程序生成JasperDesign对象来动态的生成报
表,根据这个例子,用户可以作出自定义选列的报表,当然比较麻烦,
而且肯定自己要补充他的API库
(JasperReport真是强大啊,呵呵)
15. pdfencrypt

演示了pdf的输出方式,可以给pdf文件加密码,其实就是pdf输出方式的
参数配置,具体有那些参数可配置,去看看API吧
16. printservice

演示了如何直接打印报表
17. query

演示了如何让查询的sql动态起来,比如你可以通过一个Jsp页面传
报表的sql的where条件,order条件,甚至整个sql语句
18. rotation

演示了文字纵向显示的报表
19. scriptlet

演示了如何继承JRDefaultScriptlet,并加入自己的处理语句,这个功能
可是很强大的哦,看看这些接口
beforeReportInit() afterReportInit() beforePageInit()
afterPageInit() beforeColumnInit() afterColumnInit()
beforeGroupInit(String groupName)
afterGroupInit(String groupName)
看看这些名字就知道你能完成那些功能,比如显示一列数据后,马上跟
上该列数据的分析图形,当然你也可以加上自己的方法并在报表中调用
20. shapes

演示了JasperReport中自带的图形,及能配置的参数
当然你也能继承或者覆写JasperReport中的Api生成你要的图形,
21. stretch

演示了如何处理报表中数据拉伸以及带来周围的线及框的拉伸,
你能了解到虽然黑框式表格不是JasperReport中缺省的展现方式,
但在JasperReport中不难实现
22. subreport

演示了子报表,还告诉你一个报表中可以有n个子报表,子报表中还可以
嵌套子报表
23. tableofcontents

演示了如何生成一个有目录的,复杂的报表
24. unicode

演示了各种 字符编码
25. webapp

演示了如何把报表放到一个JavaWeb项目中,可以用Jsp Servlet
applet,笔者做了一个有参数页面,可以选择html pdf applet
输出方式的报表,有兴趣的 我可以在后面放上代码
posted @ 2008-12-09 16:59 kangxm 阅读(1072) | 评论 (0)编辑 收藏

     摘要: SiteMesh:一个优于Apache Tiles的Web页面布局、装饰框架  阅读全文
posted @ 2007-09-28 15:34 kangxm 阅读(9932) | 评论 (3)编辑 收藏