张慧的博客

张慧的博客

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  45 Posts :: 0 Stories :: 24 Comments :: 0 Trackbacks

2012年8月8日 #

CSS(Cascading Style Sheet) 层叠样式表,一种和Html联系非常大的标记语言,主要用户控制网页的样式,并能把样式和网页内容分离,因此能大大提高网页开发的效率。

       初识CSS,感觉这个名字有点难以理解,“样式表”理解起来比较容易,就是定义网页的样式,也可以叫风格,那层叠怎么理解呢?

       这要从CSS的继承说起,学过面向对象的话,对继承一定不陌生,CSS的继承更简单一些:

   

在Html中各个标签可以看作是一个个容器,例如:

  1. <span style="font-size:18px;"><p>详解CSS的<em>名称</em>含义</p></span>  

       这一句话中,<p>标签是一个大容器,里面有<em>标签 ,我们把<p>标签定义成父标签,那么<em>标签就成了子标签。当我对<p>标签(父标签)用CSS样式时,字标签会完全继承父标签的风格,当然这种关系可能会有更多层(上面的例子为两层):

这张图上,每个子标签都会继承父标签的样式,这种层层嵌套的关系,也就是CSS名称的含义。

posted @ 2012-08-16 22:29 张慧 阅读(1648) | 评论 (0)编辑 收藏

经常用到多个透明图片层叠,但又需要获取不同图片的点击事件,本文实现图片透明区域穿透点击事件。

效果图:

 欢迎转载请说明转自:http://blog.csdn.net/aminfo/article/details/7872748

一、先上图片,这2张图片尺寸是一样的,放到drawable目录下:

图1:transparent.png

 

图2:transparent2.png

 

二、上布局文件,test.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width
="fill_parent"
   android:layout_height
="fill_parent"
   android:orientation
="vertical"
   android:gravity
="center"
   android:id
="@+id/mainLayout">
   
    <ImageView android:id="@+id/ImageView01"
        android:layout_width
="wrap_content"
        android:layout_height
="wrap_content"
        android:src
="@drawable/transparent"/>
    
    <ImageView android:id="@+id/ImageView02"
        android:layout_width
="wrap_content"
        android:layout_height
="wrap_content"
        android:src
="@drawable/transparent2"/>    
          
</FrameLayout>

package org.shuxiang.test;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.ImageView;

public class MainActivity extends Activity
{
    private ImageView iv1;
    private ImageView iv2;
    private Bitmap bitmap1, bitmap2;
    private boolean iv1Transparent = false;
    private boolean iv2Transparent = false;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.test);

        iv1 = (ImageView) findViewById(R.id.ImageView01);
        iv2 = (ImageView) findViewById(R.id.ImageView02);
        bitmap1 = ((BitmapDrawable) (iv1.getDrawable())).getBitmap();
        bitmap2 = ((BitmapDrawable) (iv2.getDrawable())).getBitmap();
        
        iv1.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                if(iv1Transparent)
                {
                    Log.i("test", "图1透明区域");
                }
                else
                {
                    Log.i("test", "图1点击");                    
                }
            }
            
        });
        
        iv1.setOnTouchListener(new OnTouchListener()
        {
            @Override
            public boolean onTouch(View arg0, MotionEvent arg1) 
            {
                // TODO Auto-generated method stub
                if(bitmap1.getPixel((int)(arg1.getX()),((int)arg1.getY()))==0)
                {
                    Log.i("test", "图1透明区域");
                    iv1Transparent = true;    //透明区域设置true                    
                }
                else
                {
                    Log.i("test", "图1实体区域");
                    iv1Transparent = false;
                }
                return false;
            }            
        });
        
        iv2.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                if(iv2Transparent)
                {
                    Log.i("test", "图2透明区域");
                }
                else
                {
                    Log.i("test", "图2点击");                    
                }
            }
            
        });
        
        iv2.setOnTouchListener(new OnTouchListener()
        {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                if(bitmap2.getPixel((int)(event.getX()),((int)event.getY()))==0)
                {
                    Log.i("test", "图2透明区域");
                    iv2Transparent = true;    //透明区域设置true
                    iv1.dispatchTouchEvent(event);
                }
                else
                {
                    Log.i("test", "图2实体区域");
                    iv2Transparent = false;
                }
                return false;
            }
        });
    }
}


posted @ 2012-08-16 22:28 张慧 阅读(3364) | 评论 (0)编辑 收藏


需求大致分为三种:
1.震动
2.系统音效(无需提供音频文件)
3.自定义音效(需提供音频文件)
我的工具类的封装:

  1. //  
  2. //  WQPlaySound.h  
  3. //  WQSound  
  4. //  
  5. //  Created by 念茜 on 12-7-20.  
  6. //  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.  
  7. //  
  8.   
  9. #import <UIKit/UIKit.h>  
  10. #import <AudioToolbox/AudioToolbox.h>  
  11.   
  12. @interface WQPlaySound : NSObject  
  13. {  
  14.     SystemSoundID soundID;  
  15. }  
  16.   
  17. /** 
  18.  *  @brief  为播放震动效果初始化 
  19.  * 
  20.  *  @return self 
  21.  */  
  22. -(id)initForPlayingVibrate;  
  23.   
  24. /** 
  25.  *  @brief  为播放系统音效初始化(无需提供音频文件) 
  26.  * 
  27.  *  @param resourceName 系统音效名称 
  28.  *  @param type 系统音效类型 
  29.  * 
  30.  *  @return self 
  31.  */  
  32. -(id)initForPlayingSystemSoundEffectWith:(NSString *)resourceName ofType:(NSString *)type;  
  33.   
  34. /** 
  35.  *  @brief  为播放特定的音频文件初始化(需提供音频文件) 
  36.  * 
  37.  *  @param filename 音频文件名(加在工程中) 
  38.  * 
  39.  *  @return self 
  40.  */  
  41. -(id)initForPlayingSoundEffectWith:(NSString *)filename;  
  42.   
  43. /** 
  44.  *  @brief  播放音效 
  45.  */  
  46. -(void)play;  
  47.   
  48. @end  


  1. //  
  2. //  WQPlaySound.m  
  3. //  WQSound  
  4. //  
  5. //  Created by 念茜 on 12-7-20.  
  6. //  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.  
  7. //  
  8.   
  9. #import "WQPlaySound.h"  
  10.   
  11. @implementation WQPlaySound  
  12.   
  13. -(id)initForPlayingVibrate  
  14. {  
  15.     self = [super init];  
  16.     if (self) {  
  17.         soundID = kSystemSoundID_Vibrate;  
  18.     }  
  19.     return self;      
  20. }  
  21.   
  22. -(id)initForPlayingSystemSoundEffectWith:(NSString *)resourceName ofType:(NSString *)type  
  23. {  
  24.     self = [super init];  
  25.     if (self) {  
  26.         NSString *path = [[NSBundle bundleWithIdentifier:@"com.apple.UIKit"] pathForResource:resourceName ofType:type];  
  27.         if (path) {  
  28.             SystemSoundID theSoundID;  
  29.             OSStatus error =  AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath:path], &theSoundID);  
  30.             if (error == kAudioServicesNoError) {  
  31.                 soundID = theSoundID;  
  32.             }else {  
  33.                 NSLog(@"Failed to create sound ");  
  34.             }  
  35.         }  
  36.           
  37.     }  
  38.     return self;  
  39. }  
  40.   
  41. -(id)initForPlayingSoundEffectWith:(NSString *)filename  
  42. {  
  43.     self = [super init];  
  44.     if (self) {  
  45.         NSURL *fileURL = [[NSBundle mainBundle] URLForResource:filename withExtension:nil];  
  46.         if (fileURL != nil)  
  47.         {  
  48.             SystemSoundID theSoundID;  
  49.             OSStatus error = AudioServicesCreateSystemSoundID((__bridge CFURLRef)fileURL, &theSoundID);  
  50.             if (error == kAudioServicesNoError){  
  51.                 soundID = theSoundID;  
  52.             }else {  
  53.                 NSLog(@"Failed to create sound ");  
  54.             }  
  55.         }  
  56.     }  
  57.     return self;  
  58. }  
  59.   
  60. -(void)play  
  61. {  
  62.     AudioServicesPlaySystemSound(soundID);  
  63. }  
  64.   
  65. -(void)dealloc  
  66. {   
  67.     AudioServicesDisposeSystemSoundID(soundID);  
  68. }  
  69. @end  


调用方法步骤:
1.加入AudioToolbox.framework到工程中
2.调用WQPlaySound工具类

2.1震动

  1. WQPlaySound *sound = [[WQPlaySound alloc]initForPlayingVibrate];  
  2. [sound play];  

2.2系统音效,以Tock为例

  1. WQPlaySound *sound = [[WQPlaySound alloc]initForPlayingSystemSoundEffectWith:@"Tock" ofType:@"aiff"];  
  2. [sound play];  

2.3自定义音效,将tap.aif音频文件加入到工程

  1. WQPlaySound *sound = [[WQPlaySound alloc]initForPlayingSoundEffectWith:@"tap.aif"];  
  2. [sound play];  

tap.aif音频文件样例下载点击

posted @ 2012-08-16 22:26 张慧 阅读(7759) | 评论 (0)编辑 收藏

 状态图主要描述一个对象在其生命周期内的状态变化,对象由事件驱动并满足一定的条件从一个状态转换到另一个状态。状态图显示了一个状态机。


下面是一个表示借书的状态图(描述书的状态转换)



状态图都由哪些元素组成呢?

一、初始状态


      初始状态是状态机的起始位置,它不需要事件的触发。一个状态图只能有一个初始状态。状态图总是以初始状态开始,以终止状态结束

二、状态


状态是对象执行某项活动或等待某个事件时的条件。状态可以由以下几部分组成:

1、Name:状态名称
2、Entry/Exit Action:进入和退出动作
3、Internal Transition:内部转移(对事件作出响应,执行一定的动作,但不会发生状态的转换)
4、Do:状态保持不变时执行的动作
5、SubStage:子状态(当状态是复合状态时)
6、Deferred Event:延迟事件(未在本状态中处理,但不被丢弃,而是延迟到其它状态中处理的事件)


下面是一个灯的点燃状态的例子


       如果一个状态比较复杂,那么它还可以拥有子状态,拿上面借书的例子,书的被借状态又可包含两个子状态:被正常借、被续借


三、转移

      上面已经讲过了一种特殊的转移:内部转移,但是这种转移只是响应一定的事件,执行一定的动作,并不会放生状态的转移
下面介绍一下一般转移的格式:


状态的转移一般由三部分组成

1、event(事件):触发状态转移的原因
2、Guard Condition(保卫条件):是一个布尔表达式,当事件被触发时要判断保卫条件的值,值为True才会发生状态的转换
3、Action(活动):状态转换时执行的活动

下面是一个电水壶烧水的状态转换


       当事件turn on放生时,只有水壶内有水(have water)才能由off状态转换到on状态,并发生烧水的动作(Boiling Water)。其实动作也可以放在on状态中。

四、结束状态



结束状态表示状态机执行结束或对象生命的终结,一个状态图可以有多个结束状态


      在实际的应用中,不必为每个对象都创建状态图,而是只为那些比较复杂的,状态比较多的对象创建状态图。状态图是一种很有用的图,它可以帮助我们分析复杂对象的状态转换和对象在什么时候执行什么样的动作。网上购物过程中,我们会经常查看订单的状态,描述订单的状态机就是一个比较经典的状态图,网上有很多关于订单状态图的例子,大家可以查一下,我在这里就不再赘述了。
posted @ 2012-08-08 23:38 张慧 阅读(6897) | 评论 (0)编辑 收藏

1. 为什么要时间管理    曾经有过这样一个报道:有一名记者随机采访了几个人,问了这样一个问题:
    你认为你的时间是由自己来掌控的吗?得到的回答却是这样的:
    如今各种竞争如此激烈,能拉到一个客户不容易,只要客户一个电话,我就马上要出现,我的时间完全由客户掌控。
    我只不过是一名普通的小职员,主管给我安排什么我就做什么。自己掌控时间?!等我当了经理再说吧。
    我总是有忙不完的工作,哪还来得及自己安排时间?别开玩笑了。
    在这样一个信息爆炸的社会里,我不抓紧时间充电就会落后了,现在是时间在控制我啊!
    相信你对这个问题会有自己的见解,但是仔细想想你的答案是否跟他们的很类似呢?像他们一样,也有这样的困惑或是感受呢?之所以有这样的困惑,有一个最主要的因素在影响着我们,这个因素是什么呢?
    职位?竞争?时间?
    每个人的时间总是不够用,人们渴望找到一种灵丹妙药,彻底改变自己时间不够用的局面。你是否也是这里的一员呢?

2. 概述    时间是一种资源,我们无法对它进行买卖,不可能与别人分享或是从别人那里获得,也不可能得到更多或是拥有更少。
    每天,我们每一个人都拥有相同数量的时间——24小时,差别在于我们用它来做什么。之所以每个人会有种种的困惑,究其原因,是因为大多数人在时间的管理上存在着很多误区,只有消除这些误区,才有可能让我们把时间管理得更好、更有效。
    我们现在就一起去看看这些误区都是什么样的吧!

3. 误区展示    当你的工作中出现问题时,你认为是什么原因造成的?
    无论,你的实际情况是怎么样的,往往我们都忽略了一个最关键的问题,那就是“时间”。
    因为时间的不充足而没来得及做这个或是做那个,导致最后的结果总是不尽如人意。所以,每个人在时间管理上都或多或少存在一定的问题,这也是接下来我们要解决的问题。请点击下一页吧。

4. 反思    这个世界上根本不存在“没时间”这回事。
    如果你跟很多人一样,也是因为“太忙”而没时间完成自己的工作的话,那请你一定记住,在这个世界上还有很多人,他们比你更忙,结果却完成了更多的工作。这些人并没有比你拥有更多的时间,他们只是学会了如何更好地利用自己的时间而已!有效的利用时间是一种人人都可以掌握的技巧——就像开车一样。
    因此,希望大家能通过这门课程的学习,在今后的生活中有效的珍惜时间,而一旦把握好时间,你就掌握了自己的生命,并能够将其价值发挥到极限。

5. 时间管理课程概述    在本课程中,将通过四个方面的内容帮助你更好的掌握自己的时间,而不是成为时间的奴隶,从而让你实现自己的人生目标。
    首先,我们要谈谈人生目标,也就是我们花了时间都做了些什么,比如你想成为什么样的人,你将来要达到一种什么样的成就等。
    第二、当你有了明确的人生目标,那该用什么方法来实现呢,也就是接下来要讲的时间管理的核心思想“时间管理矩阵”等。
    第三、了解了如何管理时间,那么接下来要介绍的是怎么来自我管理。如何利用好每一天的时间来帮助我们实现人生的大目标。
    最后,就是学会利用工具来管理时间。
    总而言之,对于你来说,这个世界上没有任何东西比时间更加重要了。每个人的时间都是相同的,我们每个人每个星期都只有168个小时,不可能有更多的时间。
    这门课程可以帮助你更有效的利用这些时间。
    让我们开始吧!

6. 概述    时间我们无法随意的让它变大或是缩小,我们也不能像存钱一样把时间储备起来,以备不时之需;更不能用其它的东西来代替,甚至我们更不能把已经失去的时间像倒带子一样,有选择性的倒回来或是快放。
    因此,当人们无所事事,或者忙得晕头转向却不见成效时,应该暂时停下来审视一下自己的时间利用效率,审视一下自己在时间中所处的角色,寻找一条更为合适的途径,实现自己的目标,追求自己的人生价值。
    在经理人的所有管理技能中,时间管理最容易被忽略。初级经理人从员工的岗位过渡到管理者的岗位,比较容易忽略管理的角色和时间管理的技能,而中、高级管理者的工作时间更忙碌,工作任务更多,时间效率的管理也就显得更加重要。

7. 案例    假设一个人的生命中有三枚硬币,第一枚代表财富,第二枚代表健康,第三枚代表时间,请问哪一个更重要?
    无论你选择了什么,我们来逐一分析一下吧。

8. 分析一    这三枚硬币哪个更重要呢?
    第一种情况:
    通常人们都趋向于追求财富,如果在这三枚硬币中,把代表财富的硬币拿掉,则表示这个人有足够多的健康,也有足够多的时间,他有可能重新去创业,赢得财富,把代表财富的硬币重新放进自己的生命中。
    你赞成这个说法吗?
    赞成    不赞成
    无论你选择了什么,我们来看一个实例:
    房地产大亨李嘉诚,相信你一定听说过吧!
    17岁独自外出闯荡,经商60多年,建立起亚洲最大的商业王国。 
    李嘉诚现在年过八旬仍然精神矍铄,思维敏捷。他说:“健康就好似堤坝一样,如果快要崩堤了再做补救,花费多少人力物力可能救不回来。”
    问到成功秘诀时,李嘉诚认为惜时如金,是他的一个成功秘诀,李嘉诚每天清晨不到6点就起床了,中午不睡午觉,晚上睡觉前还要看书。
    李嘉诚认为:在商业竞争中,你输了,那么你输在时间;反之,你赢了,也赢在时间。

9. 分析二    第二种情况:
    如果在这三枚硬币中,把代表健康的硬币拿掉,这表示这个人有足够多的财富,也有足够多的时间,则他可以花费无以计数的金钱来治疗自己的疾病,至少可以拖延一定的时间,或借助高科技手段来延长生命,他可能把代表健康的硬币重新放进自己的生命中。
    你赞成这个说法吗?
    赞成    不赞成
    我想梅艳芳大家都听说过吧?
    梅艳芳患癌后,每周必须接受5天的治疗,光是每个月的医药费就高达港币80万,一年下来要花近千万港币。她可以用财富延长自己的生命,并用这些有限的生命完成自己最后的心愿,但是健康依然离她很遥远。

10. 分析三    第三种情况:
    如果把代表时间的硬币拿走,让一个人没有自己的时间了,这时候,即使他有无数的财富,有很强壮的身体,可是生命留给他的只有一刹那,他无法用1亿美元去换10分钟,这就好比无数的0前面没有了1,是没有任何意义的,他不仅不能将代表时间的硬币重新放进自己的人生,而且财富和健康对他也变得毫无意义了。
    你赞成这个说法吗?
    赞成    不赞成
    无论你选择的是什么,时间对我们确实很重要。
    大家都知道,秦始皇是第一位统一六国并实现了文化及货币统一的皇帝。
    他为了让自己永远稳坐江山,就派人去寻找长生不老药。他非常清楚时间就是生命,如果自己能永生就等于掌握了时间并永远稳坐江山。
    最终,还是以失败告终。即便他有再多的财富与健康的体魄,他依然无法实现永生的愿望。因为时间不会根据任何人的愿望而改变。

11. 总结    总之,对于所有的人,尤其是经理人、企业家,他们有大量的金钱,可是他们感到最缺的还是时间,所以对时间的要求就更高,这就需要良好的时间管理。时间管理就是有效地应用时间这种资源以便我们有效地取得个人的重要目标。
    接下来,就让我们一起来学习有关个人目标的内容吧。

12. 自我时间状态判断    学习了时间管理的重要性和概念,现在我们一起应用这些知识来分析一下你自己吧!

13. 拖延商数测试    在回答这些问题时,一方面是为了让你重新认识一下自己,另一方面这些可能也是你浪费时间的原因。
    现在请做一个测试,看看你做事的拖延情况究竟如何吧。
    你的拖延情况严重吗?
    做事拖延,会严重浪费你的时间,一起来看看浪费时间的因素具体是哪些吧。时间盗贼:(找东西、懒惰,时断时续,一个人包打天下,偶发延误,惋惜不已/做白日梦,拖拖拉拉,对问题缺乏理解就匆忙行动,消极情绪,分不清轻重缓急)

14. 小结    至此,我们已经了解了时间管理的误区有哪些,以及时间管理的定义、必要性,同时通过测试对自己有了新的认识。
    如果你确认对上述内容已经完全掌握,就请开始下一章的学习吧!

15. 概述  你有人生目标吗?请你试着回答下面的问题:
  你现在是把时间真正用在你想做的事情上了吗?
  你是在“原地踏步”吗?
  你正在左右为难——是前进还是放慢脚步,或者正在犹豫不决?
  如果你不能把时间用来去实现你认为最重要的目标的话,那么你就要对其进行调整。现在请点击下一页让我来帮助你一起回答以上这些问题吧。

16. 为什么需要目标    为什么要设定人生目标呢?
    许多人拼命埋头苦干,却不知所为何来,到头来却发现追求的梯子搭错了墙,懊悔不已,只可惜为时已晚,之所以有的人总是很忙碌,而做的事情却没有太大意义,就是因为他们没有一个明确的目标。
    你现在处于最理想的状态吗?
    最理想的状态是指,你所做的每件事对你都是有价值的——其价值在于它积极推动你实现职业上的或是个人生活上的目标——这些事情都是你希望可以完成的。没有其他人可以替你做决定,你必须得明确什么事情对于你来说才是最重要的。
    需要注意的是,实现目标,需要一个过程。而在过程中的每一个阶段,都会有一个阶段性目标,越往后发展,阶段性目标就越接近最终目标。正是通过每一个阶段性目标的成功实现,才能实现最终目标。因此,目标永远指明了前进的方向。
    现在你明白为什么需要目标了吗?
    请继续学习后面的内容吧。

17. 人生目标序言    大人们总喜欢问自己的孩子:你长大了想做什么啊?
    小孩子会毫不犹豫的说:
    “我要像爸爸一样,当一名建筑工程师……”
    “我要当一名科学家或是一名作家……”
    “我要像妈妈一样,当一名医生……”
    “我要当一名警察或者天文学家……”
    “我要当一名宇航员,飞上太空……”
     …… …… ……
    各种各样的回答,都代表了孩子的一个人生目标。
    你认为这些目标可以更改吗?
    无论你的目标是否发生变化,时间都会一分一秒的过去,这是一个不变的规律。

18. 要明确人生目标    为了加深你对目标的理解,一起来看看这样一组调查数据。
    表中列出了某一年哈佛大学400名学生及他们毕业后25年的调查数据。那些没有目标的人,结果是生活在社会的底层,而那些目标明确的人,都生活在社会的中上层。令人深思的是,这些人的起点几乎是一样的,然而,正是因为目标这一因素导致了巨大的结果差异。可见,目标对人生的影响是多么的巨大。
    到这里,我想问你一个问题,你有长期或者短期的目标吗?
    有没有不重要,希望从这一刻开始,你要为自己设定明确且合理的长期与短期目标。
    现在,请写出你的人生目标:
    请拿出几张纸,一支铅笔或钢笔,一只带有秒针的手表或时钟,为自己设定15分钟时间。在纸的最上端写下问题。

19. 你的人生目标到底是什么?    第一个问题:
    你的人生目标到底是什么?
    用第一人称、现在时、肯定语气来写,这样,这些目标就能立即进入你的潜意识中。
    不要害怕写出那些看起来距离自己很遥远的目标。这些目标可以是有形的或是无形的。
    比如说登上珠穆朗玛峰、去参加马拉松长跑、休假一年、退休后在意大利建一座房子、买艘游艇、购买一辆宝马轿车;拥有一个美满幸福的三口之家,自己能拥有一个健康的身体……这些都可以列出来,同时请列出优先顺序。

20. 如何度过今后三年    第二个问题:
    如何度过今后三年?
    三年的时间,看似很长,那么在这么长的时间里你能做些什么呢?
    你可以写下一些比较空泛的目标,比如说“获得幸福”、“取得成功”、“赢得爱情”、“为社会做贡献”、“读完30本书”、“游遍30个国家”等等。

21. 只能活六个月你该怎样渡过    第三个问题:
    只能活六个月怎样度过?
    如果你知道自己会在六个月后因为病魔的侵入而失去生命,你会怎样度过这六个月的时间?你可以从不同的角度去想。
    请注意:这意味着你的人生只剩下六个月的时间,你必须充分利用这段时间做一些你觉得最重要或者自己一直都想做而没做的事情。

22. 三个问题之间的思考    你可以花上至少两分钟的时间,仔细斟酌并修改你对以上三个问题的回答。如果愿意,你也可以花上更多的时间。
    同时,请你认真思考一下这三个问题之间的关系是怎样的?
    现在我们来分析一下这三个问题:第一个可以看作是长期目标、第二个是短期目标、第三个是被分解后的目标。
    你可能会发现第二个问题的答案其实是第一个问题答案的延伸,还有一些人发现自己在第三个问题上的答案跟前两个问题的答案截然不同——那是因为他们突然意识到自己的时间不多了,必须在有限的时间内完成最重要、最紧急的事情。

23. 如何设定人生目标    了解为什么设定人生目标后,现在我们就来学习一下如何设定人生目标吧。
    事实上,设定一个适当的目标就等于达到了目标的一部分。
    人生的大目标也是人生大志,可能需要十年、二十年甚至终生为之奋斗。一个人不可能一口吃成一个胖子,所以我们在追求人生目标的过程中,要时刻清楚自己现在做的每一件事都要有助于实现自己最终的目标。
    接下来,我们就详细讲解一下如何有效地设定人生目标。

posted @ 2012-08-08 23:38 张慧 阅读(1654) | 评论 (1)编辑 收藏

本文主要简述的内容有单例设计模式、dom4j解析xml文件(这里解析的数据库的配置文件)、通过解析出来的配置信息完成数据库的连接。


1、首先要看的是单例设计模式

       单例设计模式的实现有两种:饿汉式(预先加载)、懒汉式(延迟加载),下面分别来看这两种实现方式。

(1)、饿汉式(预先加载)

public class Singleton{
    private static Singleton instance = new Singleton();
    
    private Singleton(){}

    public static synchronized Singleton getInstance(){
        return instance;
    } 
}
(2)懒汉式(延迟加载) 

public class Singleton{
    private static Singleton instance = null;
    
    private Singleton(){}

    public static synchronized Singleton getInstance(){
        if(instance==null){
             instance = new Singleton();
        }
        return instance;
    } 
}

观察上面的这两种模式,看起来区别并不大,前一种方式是类一旦加载就得将对象实例化了,而后一种则是在使用的时候才进行判断是否要实例化对象,并且在后一种的getInstance方法中加入了同步,这样显得更加的合理,个人更加偏好于使用第二种方式。


2、使用dom4j来完成数据库配置文件的解析

给出下面这个数据库的配置文件sys-config.xml


<?xml version="1.0" encoding="UTF-8"?>
<config>
    <db-info>
        <driver>oracle.jdbc.driver.OracleDriver</driver>
        <url>jdbc:oracle:thin:@127.0.0.1:1521:ORCL</url>
        <user>username</user>
        <password>password</password>
    </db-info>
</config>

完成解析的java类:

(1)、保存数据库jdbc配置信息的模型类JdbcConfig.java


package org.ml.drp.util;

/**
 * 用于保存数据库连接时的jdbc参数
 * 
 * 
@author MuLing
 * 
 
*/
public class JdbcConfig {
    private String DbDriver;
    private String DbUrl;
    private String DbUser;
    private String DbPass;

    public String getDbDriver() {
        return DbDriver;
    }

    public void setDbDriver(String dbDriver) {
        DbDriver = dbDriver;
    }

    public String getDbUrl() {
        return DbUrl;
    }

    public void setDbUrl(String dbUrl) {
        DbUrl = dbUrl;
    }

    public String getDbUser() {
        return DbUser;
    }

    public void setDbUser(String dbUser) {
        DbUser = dbUser;
    }

    public String getDbPass() {
        return DbPass;
    }

    public void setDbPass(String dbPass) {
        DbPass = dbPass;
    }

    @Override
    public String toString() {
        return "JdbcConfig [DbDriver=" + DbDriver + ", DbUrl=" + DbUrl
                + ", DbUser=" + DbUser + ", DbPass=" + DbPass + "]";
    }
}

(2)、解析数据库配置文件的工具类XmlConfigReader.java,这里使用单例模式完成,采用的是懒汉式。 

package org.ml.drp.util;

import java.io.InputStream;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
 * 用于解析xml文件 
 * 
@author MuLing
 *
 
*/
public class XmlConfigReader {  
    
    private JdbcConfig jdbcConfig = null;
    private static XmlConfigReader instance = null
    
    private XmlConfigReader(){
        SAXReader reader = new SAXReader();//取得SAXReader的对象
        InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream("sys-config.xml");//得到输入流对象
        jdbcConfig = new JdbcConfig();
        Document doc = null;
        try {
            doc = reader.read(input); //进行读取
        } catch (DocumentException e) { 
            e.printStackTrace(); 
        }
                //取得对应的节点对象
               &nbsp;Element driverEle = (Element)doc.selectObject("/config/db-info/driver");
        Element urlEle = (Element)doc.selectObject("/config/db-info/url");
        Element userEle = (Element)doc.selectObject("/config/db-info/user");
        Element passwordEle = (Element)doc.selectObject("/config/db-info/password"); 

        jdbcConfig.setDbDriver(driverEle.getStringValue());
        jdbcConfig.setDbUrl(urlEle.getStringValue());
        jdbcConfig.setDbUser(userEle.getStringValue());
        jdbcConfig.setDbPass(passwordEle.getStringValue()); 
    }
    
    public static synchronized XmlConfigReader getInstance(){
        if(instance==null){
            instance = new XmlConfigReader();
        }
        return instance;
    }
    
    public JdbcConfig getJdbcConfig(){
        return this.jdbcConfig;
    }
}

3、根据解析出了的配置信息完成数据库的连接

下面是一个完成数据库连接操作的测试工具类DbUtil.java


package org.ml.drp.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * 封装数据库常用操作类
 * 
@author MuLing
 *
 
*/
public class DbUtil {
  
    /**
     * 取得数据库的连接
     * 
@return
     
*/
    public static Connection getConnection(){
        Connection conn = null;        
        //取得数据库连接字符串
        JdbcConfig jdbcConfig = XmlConfigReader.getInstance().getJdbcConfig();
        String DBDRIVER = jdbcConfig.getDbDriver();
        String DBURL = jdbcConfig.getDbUrl();
        String DBUSER = jdbcConfig.getDbUser();
        String DBPASS = jdbcConfig.getDbPass();
        //1:注册驱动
        try {
            Class.forName(DBDRIVER);
        } catch (ClassNotFoundException e) { 
            e.printStackTrace();
        }
        //2:获取连接
        try {
            conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
        } catch (SQLException e) { 
            e.printStackTrace();
        }
        //3:返回数据库连接
        return conn;
    }
    
    //测试数据库的连接是否成功
    public static void main(String args[]){ 
        System.out.println(DbUtil.getConnection());
    }
}

上完成了单例模式下使用dom4j来读取数据库配置文件,并实现数据库的连接操作。 




posted @ 2012-08-08 23:37 张慧 阅读(1333) | 评论 (0)编辑 收藏

常有同学想在自己课外学习的安排中,“系统地”学习点什么。这样的事情常发生在喜欢做A专业的事,却上了B专业,且A不等于B,甚至相似度(A, B)趋于无穷。对有些同学,一不留神发现自己的学习落后了不少,比如学计算机的,到大三了,却发现连简单程序也编不出来,再如学完高数了,才知道高数原来如此重要,于是想要系统地重学一遍。
  何为系统学习?系统学习就是要按照已有的一套规定,先学什么,再学什么,按步就班地走完一个流程。为什么要系统学习?将做事能专业些。规定从何而来?业界专家。系统学习有什么好处?基础扎实。系统学习的路线?先理论,再理论指导实践。
  这就怪了。当今大学饱受批评之一在于重理论,轻实践。而到了课外自己的安排,还也要走入这条巷子。深层的原因在于,我们要想学点东西,无意识地延续了一种并不是很合理的思维,学习的模式被单一化了。一边在批评着本专业系统化教学中的弊端,一方面在本来不受约束的自由安排中又要去追求这种系统化,谬矣。
  系统地学,意味着将开始一个比较庞大和长期的计划。雄心勃勃地起步,灰溜溜的,或者不知不觉地停止。这种情况我经历了不止一次。还有一种情况是,祥林嫂式地叨叨一生:“一直想系统学习一下……,却没有机会。”
  要想满足自己的兴趣,其实很简单,用合适的方式行动起来即可。喜欢电子的,先买个套件,备把烙铁,焊个收音机出来;喜欢计算机的,就先自学编个程序出来;喜欢经济的,读些经济学著作……。系统学习的条件往往有些苛刻,所以不要寄望于系统学习。
  实际上,系统学习这个东东,确实用不着为之如此着迷。系统学习本身并没有什么太多的道理,那是对某方面知识的套装,是为了适应大规模人才培养而用的。一旦形成系统,也就意味着僵化,意味着单一标准,在这一套东西广为传播的同时,也为相应的学科进一步发展套上了枷锁,这是一个躲不开的悖论。单按这个系统培养出来的人才,没有特色,缺乏创新,这是现在教育的一个非常大的弊端。
  我们不能直接全盘否认系统学习,这种方法是有效的,也将继续持续。需要我们每个人做的,是不单一地依赖系统化,要突破这个所谓的系统,找出适合自己的办法,进而为这个系统做出贡献。这就是创新。要创新,就一定要有人突破系统的制约。
  一个最简单的问题,各行业都有个祖师爷,哪个祖师爷是科班出身,系统学习过的?在现实中,我们发现很多有所成就的人物往往是多面手,不能说他的每一面都是系统学来的。在职场中,复合型人才受欢迎,复合型人才不可以单一理解为上过几个专业,拿过几个学位。野路子出身,被智叟们看不上的,常常能做出大的成绩。
  在我理想的大学中,同学们的学习将是这样的:他们接受着一项专业教育,一方面由教授系统地传授着专业知识,接受着一种“正规”的训练,另一方面,学生能够根据自己的兴趣、感觉自由地拓展,拓展的内容有的是和系统相关的,有的完全是“节外生枝”。这是课内与课外有效的结合。
  破除“系统学习”的情结,根据自己当前的环境、条件,首先行动起来。在起步时,着重直接的体验,而专门的理论。在整个过程中,看重自己的感受,而不是专家的观点。坚持下来,你将有能力自由出入这个系统,面对的是更为广阔的空间。没有经过系统学习,实在不能不说是一件值得庆幸的事。
  有条件系统学习,或许可以乐一乐;而没有条件系统学习的,一定不要纠结。

  有条件进入了系统学习轨道的,也要常想着“捣乱”,往系统外冲一冲。没有条件以系统学习开始的,不妨在野路子起步,甚至成为高手后,往系统这边看一看,这会让你上到一个新的境界。


总结一下:能进入系统学习轨道的人是幸运的,但也要提防着“系统”给你造成的限制;既然没有条件系统学习的,就不要去干等,先动起来再说。

posted @ 2012-08-08 23:33 张慧 阅读(1476) | 评论 (5)编辑 收藏