关于作者

笔名:leon
地区: 上海
作者相册

日历 

快速登录

+ 用户名:
+ 密 码:

在线留言

休闲娱乐

求职找工

程序开发

公司链接

我的链接

Noticeable Blog

日本语学习

资源下载

人气论坛

搜索引擎

开源链接

网页开发

Linux相关

源码下载

J2ME开发

英语学习

技术移民

访问统计:5560


温水煮蛤蟆

 

像野猪一样勇往直前,像狮子一样统率一切,像黄牛一样勤勤恳恳,像小猫一样不受他人左右,像狗一样与众不同,像猴子一样机动灵活,有时还要像梅花鹿一样小心谨慎!

日志

弃掉几十万年薪,选择创业, 半年倒闭(转CSDN)  (作者置顶)
创业的灵感就是从那时的工作中被激发。每天频繁的使用电话参加电话会议,一打就是一两个小时,手臂酸软,心情也变得不耐烦,自己抱怨的时候就想为何不戴着耳机参加电话会议呢。那个被压抑了很多的创业念头在召唤我,努力不一定成功,放弃我会终身遗憾!


然而,   半年的创业一下子使我们这个团队都垮了!  
教训有:   只关注IT内动向,不考虑用户需求!(其实这里的创业者都和我们一样)
表现为:   每天写BLOG,参加IT聚会........
现在看起来,   IT大佬是不写BLOG的,   就是写,   也是手下写或代替写.
创业者应该死死把握机会,   赚钱!
有BLOG说大众点评网活着,   但是生不如死,   因为VC的钱基本花光了!
有人喜欢看蚂蚁网麦田的BLOG,但是,   我要说的是,   把钱投给他,VC是瞎子!   CEO一天到晚写BLOG有什么用?   用户在哪里?
以前南京有个老冒,也是个web2.0的ceo(已经关闭),也是整天写,有什么用?

今天起,   我不写了!   我在donews和techweb上的blog不再更新.
我们已经卖掉了http://xxxxxxxx.com/   的程序和域名(本来是要做企业家培训和在线管理咨询的),   8个人拿到了140万.   算了一下,   还是亏本了!   但是没有其它办法,也不会谈判...

下面我列出了一些和VC商谈时必须解决的问题。
如果所有创业者都自觉考虑并解答了这些问题,那事情会变得容易多了。我们奉献给大家!
另外,   http://xxxxxxxx.com/   的主页已经被切换,   新的主页买家可能一周内挂出!
我祝愿他们成功!

下面是那些应该解答的问题:
1)   你的眼光是什么?
     *   你的远见是什么?
     *   你要解决什么问题?对象是谁?
     *   你将来想要成为什么样的人?
2)   你的市场机会是什么?市场有多大?
     *   您目标的市场有多大?发展有多快?
     *   这个市场有多成熟,或多不成熟?
     *   你是否有资本成为这个市场前两三位?

3)   介绍你的产品和服务
     *   你的产品或服务是什么?
     *   解决了用户的什么问题?
     *   你的产品或服务有什么特别之处?

4)   你的用户是谁?
     *   谁是现在的用户?
     *   谁是目标的用户?
     *   理想的用户是什么样的?
     *   谁会付费?
     *   介绍一下某个具体用户的例子

5)   你的价值主张是什么?
     *   你给用户提供了什么价值?
     *   使用/买你的产品,用户的投资回收率是什么?
     *   你解决了什么问题?
     *   你是销售维他命,阿司匹林,还是消炎药?(奢侈品,有益的东西,还是必需品?)

6)   你如何销售?
     *   销售程序是什么?周期有多长?
     *   你的销售和市场方针是什么?
     *   你当前的销售链是什么?

7)   你怎么吸引客户?
     *   争取每个用户要花费多少钱?
     *   在不同时期这个费用是否不同?为什么?
     *   用户的永久价值什么?

8)   你的管理团队有谁?
  *   你的管理团队有谁?
     *   他们有什么经验?
     *   欠缺那些环节?有什么计划去弥补?

9)   你的收入模式是什么?
     *   如何赚钱
     *   你的收入模式
     *   需要怎样才能盈利?

10)   你现在进展到哪一步?
     *   你现在进展到哪一步了?技术/产品?团队?财务/营收?
     *   现在进展情况如何?现状和前景是否更清晰了?
     *   你将来的计划是什么?

11)   你的融资计划是什么?
     *   已经得到了什么投资?
     *   希望得到多少投资?比例如何?
     *   资金用在什么地方?
     *   资金可以支持多久?到那时公司是否可以发展到一个重要里程碑?
     *   你还打算吸引多少资金?什么时候?

12)   你的竞争对手是谁?
     *   谁是你当前和潜在的竞争对手?
     *   谁有可能和你竞争,谁有可能和你合作?
     *   你的优势和弱点?
     *   你有什么特殊之处?

13)   你有什么合作伙伴?
     *   谁是你的销售或技术合作伙伴?当前?未来?
     *   这些合作伙伴有多可靠?

14)   为什么适合有意的投资者?
     *   和投资者的方向,经验吻合?
     *   与投资者现有的投资组合有什么互补,或竞争?

15)   其它
     *   成功的条件里有什么还只是假设?
     *   有什么突然因素有可能一夜之间改变你的生意?新科技,新市场的变化?
     *   你公司的薄弱环节是什么?  

说实话,   上面的15个问题,   99.5%的创业者能答上一半吗?   创业路漫漫!

- 作者: leon 2007年07月6日, 星期五 10:55  回复(0) |  引用(0)

Java 存储和读取 oracle CLOB 类型字段
package oracle.clob;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import oracle.jdbc.driver.OracleDriver;
import oracle.sql.CLOB;

public class ClobTest {
    String url 
= "jdbc:oracle:thin:@192.168.2.157:1521:orcl";
    String user 
= "xj";
    String pwd 
= "xj";
    String text 
= "这是要插入到CLOB里面的数据";

    
/**
     * 
@throws ClassNotFoundException
     * 
@throws SQLException
     *             数据库里已经建好表CLOB_TEST(ID NUMBER,STR CLOB);
     
*/
    
private void clobImport() throws ClassNotFoundException, SQLException {
        
// TODO Auto-generated method stub
        DriverManager.registerDriver(new OracleDriver());
        Connection conn 
= DriverManager.getConnection(url, user, pwd);// 得到连接对象
        String sql = "insert into clob_test(id,str) values ('1',?)";// 要执行的SQL语句

        PreparedStatement stmt 
= conn.prepareStatement(sql);// 加载SQL语句
        
// PreparedStatement支持SQL带有问号?,可以动态替换?的内容。
        Reader clobReader = new StringReader(text); // 将 text转成流形式
        stmt.setCharacterStream(1, clobReader, text.length());// 替换sql语句中的?
        int num = stmt.executeUpdate();// 执行SQL
        if (num > 0) {
            System.out.println(
"ok");
        } 
else {
            System.out.println(
"NO");
        }
        stmt.close();
        conn.close();
    }

    
private void clobExport() throws ClassNotFoundException, SQLException,
            IOException {
        
// TODO Auto-generated method stub
        CLOB clob = null;
        String sql 
= "select * from clob_test where id=1";
        DriverManager.registerDriver(
new OracleDriver());
        Connection conn 
= DriverManager.getConnection(url, user, pwd);// 得到连接对象
        PreparedStatement stmt = conn.prepareStatement(sql);
        ResultSet rs 
= stmt.executeQuery();
        String id 
= "";
        String content 
= "";
        
if (rs.next()) {
            id 
= rs.getString("id");// 获得ID
            clob = (oracle.sql.CLOB) rs.getClob("str"); // 获得CLOB字段str
            
// 注释: 用 rs.getString("str")无法得到 数据 ,返回的 是 NULL;
            content = ClobToString(clob);
        }
        stmt.close();
        conn.close();
        
// 输出结果
        System.out.println(id);
        System.out.println(content);
    }

    
// 将字CLOB转成STRING类型
    public String ClobToString(CLOB clob) throws SQLException, IOException {

        String reString 
= "";
        Reader is 
= clob.getCharacterStream();// 得到流
        BufferedReader br = new BufferedReader(is);
        String s 
= br.readLine();
        StringBuffer sb 
= new StringBuffer();
        
while (s != null) {// 执行循环将字符串全部取出付值给StringBuffer由StringBuffer转成STRING
            sb.append(s);
            s 
= br.readLine();
        }
        reString 
= sb.toString();
        
return reString;
    }

    
/**
     * 
@param args
     * 
@throws IOException
     * 
@throws SQLException
     * 
@throws ClassNotFoundException
     
*/
    
// TODO Auto-generated method stub
    public static void main(String[] args) throws IOException,
            ClassNotFoundException, SQLException {
        
// TODO Auto-generated method stub
        ClobTest clobtest = new ClobTest();
        
// read file
        FileReader _frd = new FileReader(new File("D:\\DOS.txt"));
        BufferedReader _brd 
= new BufferedReader(_frd);
        String _rs 
= _brd.readLine();
        StringBuffer _input 
= new StringBuffer();
        
while (_rs != null) {
            _input.append(_rs);
            _rs 
= _brd.readLine();
        }
        
// System.out.println(_input.toString());
        
// 输入测试
        clobtest.text = _input.toString();
        clobtest.clobImport();
        
// 输出测试
        
// clobtest.clobExport();
    }

}

- 作者: leon 2008年07月1日, 星期二 15:33  回复(0) |  引用(0)

提高IT专业人员薪酬水平的十种方法

IT招聘专家和工作场所专家总结了技术专业人员应该掌握的一些具体技能。这些技能会帮助IT专业人员避免工作的低谷和得到薪酬上涨的好处。下面就是让IT人员提高薪酬的10种方法。

1.熟悉SAAS产品

IT人员配备和随需应变的咨询公司Bluewolf的共同创始人和负责人Michael Kirven说,SAAS(软件服务)知识在用人要求条件中的比例已经从三年前的5%提高到了35%。拥有这方面知识的人可能很快提高自己的薪酬,无论他们是否知道alesforce、Google Apps或者WorkDay。每一个人都需要知道这些产品如何适合当前的IT架构。

2.获得SAP>知识或者经验

位于费城的人才和外包服务公司Yoh Services复杂战略和营销的副总裁Jim Lanzalotto称,他支持拥有SAP技术的人,因为SAP技术顾问的需求量和现有人员之间的缺口有3至4万。

3.获得一个行业的垂直的技术专长

Kirven说,做一个Java程序员或者一个熟练的.Net开发人员就是一件很好的事情。但是,随着系统越来越复杂,企业不仅需要这些人学些这些编程语言,而且还要了解具体的垂直市场知识,如金融、零售或者媒体,并且了解所有这些知识。

4.获得一个虚拟化项目

IT job board Dice网站称,它看到招聘列表中对虚拟化知识人才的需求在过去的六个月里提高了40%,特别是需要了解VMware技术的人。

5.提高你的商务技能

Lanzalotto认为,商务经验对于提高IT专业人员的薪金水平是非常重要的。他说,最好的首席信息官不仅仅是一个技术人员,而且应该是能够在技术和业务两个方面都能够工作的业务人员。

6.获得开源软件产品开发经验

Kirven说,由于时代已经发生了变化,首席信息官采用MySQL和其它开源软件技术不会有失去工作的风险。事实上,业务人员经常会喜欢开源软件,因为它可能为公司省钱。

7.更近一步了解能够让你的公司赚钱的技术

在大型银行或者金融机构工作的人都知道你越接近能够让你的公司赚钱的技术,你的工作岗位对于你的公司就越重要。IT人员也是如此。参与让你的公司增加收入或者节省金钱的项目的IT人员很少会被人忽略。

8.首席信息官需要架构技能

Kirven称,IT架构是一个极好的职场道路,不仅因为这是一个高级的职位,而且还因为这些职位几乎完全是不会外包出去的。

9.付费参加项目管理认证学习的人

许多研究报名,虽然并非所有的证书都比印刷证书的成本值钱,但是,企业继续付出高价的费用聘用拥有关键证书的人才。其中最最主要的两个项目管理证书是PMP(项目管理专业人员)和PMO(项目管理办公室)。

10.跳槽

IT专业人员从一个地方搬迁的另一个地方的比例提高了20%。当你在你的技术专长领域寻求进一步发展时,换一个地理环境也许会有帮助。不同地区对于IT专业人员的技术需求是不同的。

- 作者: leon 2008年05月28日, 星期三 22:54  回复(0) |  引用(0)

Ubuntu8.04全屏播播放视频
修改

/etc/mplayer中的mplayer.conf文件

找到:#zoom=yes

去掉前面的#号,重启mplayer,全屏模式恢复正常。

- 作者: leon 2008年05月7日, 星期三 23:10  回复(0) |  引用(0)

Mplayer播放rmvb
安装mplayer

sudo apt-get update

sudo apt-get install mplayer

安装解码器
安装win32Codecs。点击这里下载DEB包。然后在终端输入:
sudo dpkg -i w32codecs_20071007-0.1_i386.deb

此时安装完毕,如仍不能播放rmvb影片。

打开mplayer,

右键单击preferences=>video => X11

此时设置完毕可正常观看影片,目前没有解决全屏播放的问题。

- 作者: leon 2008年05月7日, 星期三 22:53  回复(0) |  引用(0)

Ubuntu8.04软件安装篇
Ubuntu8.04系列五--软件安装篇
文章欢迎转载,转载请注明出处:嘉骏苑http://luckiss.blogcn.com
原文出处:http://luckiss.blogcn.com/diary,15220086.shtml

首先说明一下ubuntu的软件安装大概有几种方式:
1。deb包的安装方式
deb是debian系Linux的包管理方式,ubuntu是属于debian系的Linux发行版,所以默认支持这种软件安装方式,当下载到一个deb格式的软件后,在终端输入这个命令就能安装:
sudo dpkg -i *.deb

2。编译安装方式
(小贴士:使用编译安装前,需要先建立编译环境,使用以下命令建立基本的编译环境:sudo apt-get install build-essential)
在linux的世界,有很多软件只提供了源代码给你,需要你自己进行编译安装,一般开源的软件都会使用tar.gz压缩档来进行发布,当然也有其他的形式。拿到源代码的压缩文档,把它解压到/tmp目录下,进入/tmp/软件目录,然后执行以下三个命令:
1 ./configure
2 make
3 sudo make install
在第一步./configure时可能会提示说有某某软件找不到,例如提示“libgnome”这个开发包找不到,那就把libgnome这个关键词 copy,然后打开新立得软件管理器,在里面搜索libgnome这个关键词,就会找到libgnome相关的项目,把前面有个ubuntu符号的 libgnome包(注意:同样需要安装dev包,但可以不装doc包)全部安装,通过这个方法把./configure过程中缺失的开发包都全部装上就 OK了,第一步能顺利通过,第二,三步基本问题不大。
以上就是一般初学ubuntu的朋友必须掌握的编译安装的基本方法!

3。apt-get安装方法
ubuntu世界有许多软件源,在系统安装篇已经介绍过如何添加源,apt-get的基本软件安装命令是:
sudo apt-get install 软件名

4。新立得软件包管理
打开:系统--系统管理--新立得软件包管理,这个工具其实跟apt一样,可以搜索,下载,安装ubuntu源里的软件,具体安装方式很简单,看着界面应该会懂,就不详细介绍了

5。二进制包的安装方式
有不少不开源的商业软件都会采用这种方式发布Linux软件,例如google earth,拿到二进制软件后,把它放到/tmp目录,在终端下进入安装目录,在安装目录下执行:
./软件名
然后按照一步步提示,就能安装该软件

6。rpm包的安装方式
rpm包是deb包外最常见的一种包管理方式,但ubuntu同样可以使用rpm的软件资源^_^,首先我们需要安装一个rpm转deb的软件
sudo apt-get install alien
然后就可以对rpm格式的软件转换成deb格式了:
alien -d *.rpm
然后就可以用deb的安装方式进行软件安装
也可以不需转换而直接对rpm包进行安装:
alien -i *.rpm
更多的alien使用方法可以用-h参数查看相应说明文档

7。其它安装方式
其他安装方式一般还有脚本安装方式,这类软件,你会在软件安装目录下发现类似后缀名的文件,如: .sh .py .run等等,有的甚至连后缀名都没有,直接只有一个INSTALL文件,对于这种软件,可尝试以下几种方式安装
最简单的就是直接在软件目录下输入: ./软件名* (注意有一个*号,那是一般可以通配所有后缀名)
或者 : sh 软件名.sh
或者: python 软件名.py

OK,介绍完ubuntu的基本软件安装方法后,我们就可以开始安装一些常用软件了

1。学电脑打字的练习软件^_^
sudo apt-get install tuxtype ktouch

2。安装RAR zip压缩/解压缩程序
安装
sudo apt-get install rar unrar p7zip
建立软链接
sudo ln -fs /usr/bin/rar /usr/bin/unrar
这样,以后只要在命令行输入unrar,就可以解压或者压缩文件了,安装完成后,归档管理器也同时集成了rar组件。

3。安装词霸星际译王(比金山词霸好用^_^)
(1)安装主程序
sudo apt-get install stardict stardict-common
然后到下面链接下载词典文件:
http://stardict.sourceforge.net/Dictionaries_zh_CN.php
然后把词典文件解压到以下路径即可
/usr/share/stardict/dic

4。多媒体
首先安装多媒体编码器
sudo apt-get install gstreamer0.8-plugins gstreamer0.8-lame
然后安装解码器跟播放器
sudo apt-get install gstreamer0.10-*
sudo apt-get install libxine-extracodecs totem-xine mplayer mplayer-fonts mozilla-mplayer

mplayer的解码器到下面链接下载相应版本:
http://www.mplayerhq.hu/MPlayer/releases/codecs/
下载解码器压缩包,解压到/usr/lib/codecs ,默认是没有codecs目录的,需要自己新建目录:
sudo mkdir /usr/lib/codecs

然后打开mplayer的属性项,在vedio里面选择xv X11/xv插件,然后下面的Enable double buffering和Enable frame dropping两项都选上。

5。安装即时通讯工具
eva : Linux下用于上QQ的软件,安装方法:
sudo apt-get install eva
kopete: 可通过此软件上MSN:
sudo apt-get install kopete
skype: 到以下链接下载:
http://www.skype.com/download/skype/linux/choose/
飞信:看此帖:
http://forum.ubuntu.org.cn/viewtopic.php?t=107009

6。多线程下载工具:
multiget:下载链接:http://multiget.sourceforge.net/

axel: sudo apt-get install axel

7。电驴工具:
amule: sudo apt-get install amule amule-common amule-utils

8。bt工具:
奔流:下载链接:http://forum.ubuntu.org.cn/viewtopic.php?t=108816

9。桌面美化工具
emerald: sudo apt-get install emerald
这个工具可以帮你改变边框的风格,例如可以弄成vista那样的毛玻璃效果也可以
avant-window-navigator: sudo apt-get install avant-window-navigator
这个工具可以做出一个类似OSX系统的dock面板效果
在系统启动时开启emerald和awn的方法
打开系统--首选项--会话,选择添加,在名称填入“emerald”,命令中填入“emerald --replace&”,然后再添加,名称填入“awn”,命令输入“avant-window-navigator -replace&”,然后ctrl+alt+backspace重启X,就会发现emerald跟awn能随机启动了。

通过这两个工具美化后的桌面效果可看这个视频:
http://luckiss.blogcn.com/diary,13060944.shtml

10。FTP客户端gFTP
sudo apt-get install gftp

11。pdf,chm阅读器
sudo apt-get install kpdf gnochm
当然也可以到adobe的网站下载adobe reader8.0 for Linux

12。rpm转deb工具
sudo apt-get install alien

13。Google Earth
下载链接:http://earth.google.com/download-earth.html

14。思维导图软件:
sudo apt-get install freemind vym kdissert Semantik

15。数据库软件:
sudo apt-get install mysql-admin mysql-client mysql-gui-tools-common mysql-query-browser mysql-server

16。屏幕录像软件:

sudo apt-get install xvidcap

17。mp3播放器
以下是个人比较推荐的播放器
sudo apt-get install audicious amarok ryhthmbox xmms2 xmms2-plugin-all gxmms2 xmms2-scrobbler

18。防火墙firestarter
sudo apt-get install firestarter
如果运行firestarter发现打开不了,就按以下方法解决:
编辑/etc/firestarter/firestarter.sh
根据本机ifconfig的输出信息来修改以下几行代码:
IP=`/sbin/ifconfig $IF | grep inet | cut -d : -f 2 | cut -d \ -f 1`
MASK=`/sbin/ifconfig $IF | grep Mas | cut -d : -f 4`
BCAST=`/sbin/ifconfig $IF |grep Bcast: | cut -d : -f 3 | cut -d \ -f 1`
将后两行代码中grep搜索的英文字符串改为相应中文字符串即可。
IP=`/sbin/ifconfig $IF | grep inet | cut -d : -f 2 | cut -d \ -f 1`
MASK=`/sbin/ifconfig $IF | grep 掩码: | cut -d : -f 4`
BCAST=`/sbin/ifconfig $IF |grep 广播: | cut -d : -f 3 | cut -d \ -f 1`

19。虚拟软件
wine: sudo apt-get install wine
virtualbox: 下载链接:http://www.virtualbox.org/wiki/Downloads
1)到 virtualBox主页下载二进制的allplatform的安装包,
不要sudo apt-get安装,否则下载的是OSE(open source edition)版本,使用有麻烦。
2)添加使用用户到 vboxusers 用户组,vboxusers 是安装 vbox 时自动建立的组:
sudo adduser 用户名 vboxusers
3)重启ubuntu
4)安装XP,此时鼠标切换有问题,没关系,先装好XP再说。
5)进入XP系统之后,在虚拟机中选择安装附加软件包GuestAdditions,这时,鼠标就可以在主客机之间自由切换了。
6)这时,退出XP系统,在“设置”中设置共享文件夹:
填上共享名称,选择某个要共享的目录即可(请注意,不能共享用户主目录)。
启动客户机,打开我的电脑,选择 “工具” -- “映射网络驱动器”,
完成之后,我们即可像使用本地磁盘一样使用该共享文件夹.
7)其他一些常见问题:
(1)系统内核更新之后,vbox 无法启动,这时我们只需要重新安装下头文件并重新编译 vbox 内核模块即可:
sudo apt-get install linux-headers-`uname -r`
sudo /etc/init.d/vboxdrv setup
(2)运行QQ就跳出客户机。安装完之后,禁止QQ开机启动,并删除QQ安装目录下的npkcrypt.sys文件就可以了。
(3)不能用USB设备。由于系统自身usbfs权限限制,需要root权限运行VirtualBox才能加载USB设备;即:
sudo VirtualBox
让GUEST识别USB设备,最简单的办法如下:
$ sudo gedit /etc/fstab
在末尾加上
# the USB group
# 对所有用户开放USB设备的读写权限
none /proc/bus/usb usbfs devmode=666 0 0
virtualbox+深度精简XP的运行效果见此视频:
http://luckiss.blogcn.com/diary,13060944.shtml

20。网络电视
sudo apt-get install vlc
电视节目列表请看此文章:
http://forum.ubuntu.org.cn/viewtopic.php?t=109855
在ubuntu下看网络高清电视的视频演示,见以下视频的后半部分:
http://luckiss.blogcn.com/diary,13060944.shtml

21。矢量绘图和3D建模软件
sudo apt-get install inkscape blender

22。蓝牙设备
先安装以下软件:
sudo apt-get install bluetooth bluez-audio bluez-cups bluez-gnome bluez-utils libbluetooth2 python-bluez gnome-bluetooth gnome-phone-manager
然后配置/etc/bluetooth/hcid.conf

代码:

#
# HCI daemon configuration file.
#

# HCId options
options {
# Automatically initialize new devices
autoinit yes;

# Security Manager mode
# none - Security manager disabled
# auto - Use local PIN for incoming connections
# user - Always ask user for a PIN
#
#修改成auto模式
security auto;

# Pairing mode
# none - Pairing disabled
# multi - Allow pairing with already paired devices
# once - Pair once and deny successive attempts
pairing multi;

# Default PIN code for incoming connections
# 默认PIN码,与手机匹配时使用
passkey "1234";
}

# Default settings for HCI devices
device {
# Local device name
# %d - device id
# %h - host name
# 设置PC端的蓝牙名称,可随意设置
name "%h-%d";

# Local device class
class 0x3e0100;

# Default packet type
#pkt_type DH1,DM1,HV1;

# Inquiry and Page scan
iscan enable; pscan enable;
discovto 0;

# Default link mode
# none - no specific policy
# accept - always accept incoming connections
# master - become master on incoming connections,
# deny role switch on outgoing connections
lm accept;

# Default link policy
# none - no specific policy
# rswitch - allow role switch
# hold - allow hold mode
# sniff - allow sniff mode
# park - allow park mode
lp rswitch,hold,sniff,park;
}
配置完成后,重启蓝牙服务
sudo /etc/init.d/bluetooth restart
手机连接PC端蓝牙设备,完成匹配,匹配时需要输入hcid.conf中的匹配码

配置/etc/bluetooth/rfcomm.conf

代码:

#
# RFCOMM configuration file.
#

rfcomm0 {
# Automatically bind the device at startup
bind yes;

# Bluetooth address of the device
# 手机端的蓝牙地址可以通过hcitool scan获得
device 00:18:0F:8B:B0:63;

# RFCOMM channel for the connection
channel 1;

# Description of the connection
comment "NOKIA N73 Bluetooth device";
}

最后,开启蓝牙文件共享服务
gnome-obex-server 用来接收手机端发送过来的文件
gnome-obex-send 发送文件到手机端,在gnome里也可以选择文件点右键发送到手机(发送为选择Bluetooth)
gnome-phone-manmager 启用后选择手机设置,可以通过PC端给朋友发短信

23。如何添加程序菜单
要添加程序菜单,新手们都会皱眉,看上面lumaqq、avast的添加菜单的步骤,真是……
不过不怕,这其实是很轻松就可搞掂的事。
1)打开:系统--首选项--主菜单
如果没有这项的话,就需要安装alacarte: sudo apt-get install alacarte
2)选择要添加到的序列;
3)打开:文件-新建条止/新建菜单
4)在“名称”处填上菜单名,再在“命令”后,从“浏览”处找到要行的文件;
5)需要的话,再选择个图标;
6)最后,确定下去啦。。。。。

- 作者: leon 2008年05月7日, 星期三 20:03  回复(0) |  引用(0)

Ubuntu 8.04 HardDisk Install

1.首先下载必要的Ubuntu 8.04 Beta ISO文件(见http://www.linuxidc.com/Linux/2008-03/11437.htm),存放在C盘的根目录下; 
 
2.下载GrubForDos,(http://www.linuxidc.com/Linux/2008-03/11986.htm)将grldr和grub.exe放入C盘根目录; 
 
3.在C盘根目录新建一个 menu.lst文件,写入如下内容: 
title Install Ubuntu
find --set-root /Ubuntu-8.04-beta-desktop-i386.iso
kernel /vmlinuz boot=casper find_iso=/Ubuntu-8.04-beta-desktop-i386.iso noapic
initrd /initrd.gz
 
注意那个noapic,因为AMD CPU的原因,加入noapic,否则会有kernel panic. 
 
3.使用虚拟光驱类软件,复制 Casper和 .disk两个目录到C盘根目录; 
 
4.复制Ubuntu 8.04 Beta ISO里Casper目录中的vmlinuz和initrd.gz文件到C盘根目录; 
 
5.修改C盘根目录下的boot.ini文件,在文件末尾加入下面代码: 
C:\grldr="GRUB"
 
6.重新启动,在启动菜单处,选择Grub,然后再选择Install Ubuntu就可以开始安装了。

- 作者: leon 2008年05月5日, 星期一 23:10  回复(0) |  引用(0)

SQL PLUS命令的使用大全
1. 执行一个SQL脚本文件
SQL>start file_name
SQL>@ file_name
我们可以将多条sql语句保存在一个文本文件中,这样当要执行这个文件中的所有的sql语句时,用上面的任一命令即可,这类似于dos中的批处理。
 
2. 对当前的输入进行编辑
SQL>edit
 
3. 重新运行上一次运行的sql语句
SQL>/
 
4. 将显示的内容输出到指定文件
SQL> SPOOL file_name
   在屏幕上的所有内容都包含在该文件中,包括你输入的sql语句。
 
5. 关闭spool输出
SQL> SPOOL OFF
   只有关闭spool输出,才会在输出文件中看到输出的内容。
6.显示一个表的结构
SQL> desc table_name
 
7. COL命令:
主要格式化列的显示形式。
该命令有许多选项,具体如下:
COL[UMN] [{ column|expr} [ option ...]]
Option选项可以是如下的子句:
ALI[AS] alias
CLE[AR]
FOLD_A[FTER]
FOLD_B[EFORE]
FOR[MAT] format
HEA[DING] text
JUS[TIFY] {L[EFT]|C[ENTER]|C[ENTRE]|R[IGHT]}
LIKE { expr|alias}
NEWL[INE]
NEW_V[ALUE] variable
NOPRI[NT]|PRI[NT]
NUL[L] text
OLD_V[ALUE] variable
ON|OFF
WRA[PPED]|WOR[D_WRAPPED]|TRU[NCATED]
 
1). 改变缺省的列标题
COLUMN column_name HEADING column_heading
For example:
Sql>select * from dept;
     DEPTNO DNAME                        LOC
---------- ---------------------------- ---------
         10 ACCOUNTING                   NEW YORK
sql>col  LOC heading location
sql>select * from dept;
    DEPTNO DNAME                        location
--------- ---------------------------- -----------
        10 ACCOUNTING                   NEW YORK
 
2). 将列名ENAME改为新列名EMPLOYEE NAME并将新列名放在两行上:
Sql>select * from emp
Department  name           Salary
---------- ---------- ----------
         10 aaa                11        
SQL> COLUMN ENAME HEADING ’Employee|Name’
Sql>select * from emp
            Employee
Department  name           Salary
---------- ---------- ---------- 
         10 aaa                11
note: the col heading turn into two lines from one line.
 
3). 改变列的显示长度:
FOR[MAT] format
Sql>select empno,ename,job from emp;
      EMPNO ENAME      JOB       
---------- ----------     ---------
       7369 SMITH      CLERK     
       7499 ALLEN      SALESMAN  
7521 WARD       SALESMAN  
Sql> col ename format a40
      EMPNO ENAME                                    JOB
----------   ----------------------------------------         ---------
       7369 SMITH                                    CLERK
       7499 ALLEN                                    SALESMAN
       7521 WARD                                    SALESMAN
 
4). 设置列标题的对齐方式
JUS[TIFY] {L[EFT]|C[ENTER]|C[ENTRE]|R[IGHT]}
SQL> col ename justify center
SQL> /
      EMPNO           ENAME                   JOB
----------   ----------------------------------------       ---------
       7369 SMITH                                    CLERK
       7499 ALLEN                                    SALESMAN
7521 WARD                                     SALESMAN
对于NUMBER型的列,列标题缺省在右边,其它类型的列标题缺省在左边
 
5). 不让一个列显示在屏幕上
NOPRI[NT]|PRI[NT]
SQL> col job noprint
SQL> /
      EMPNO           ENAME
----------     ----------------------------------------
       7369 SMITH
       7499 ALLEN
7521 WARD
 
6). 格式化NUMBER类型列的显示:
SQL> COLUMN SAL FORMAT $99,990
SQL> /
Employee
Department Name        Salary    Commission
---------- ---------- --------- ----------
30          ALLEN        $1,600    300
 
7). 显示列值时,如果列值为NULL值,用text值代替NULL值
COMM NUL[L] text
SQL>COL COMM NUL[L] text
 
8). 设置一个列的回绕方式
WRA[PPED]|WOR[D_WRAPPED]|TRU[NCATED]
        COL1
--------------------
HOW ARE YOU?
 
SQL>COL COL1 FORMAT A5
SQL>COL COL1 WRAPPED
COL1
-----
HOW A
RE YO
U?
 
SQL> COL COL1 WORD_WRAPPED
COL1
-----
HOW
ARE
YOU?
 
SQL> COL COL1 WORD_WRAPPED
COL1
-----
HOW A
 
9). 显示列的当前的显示属性值
SQL> COLUMN column_name
 
10). 将所有列的显示属性设为缺省值
SQL> CLEAR COLUMNS
 
8. 屏蔽掉一个列中显示的相同的值
BREAK ON break_column
SQL> BREAK ON DEPTNO
SQL> SELECT DEPTNO, ENAME, SAL
FROM EMP
  WHERE SAL < 2500
  ORDER BY DEPTNO;
DEPTNO      ENAME         SAL
---------- ----------- ---------
10           CLARK        2450
MILLER      1300
20            SMITH       800
ADAMS       1100
 
9. 在上面屏蔽掉一个列中显示的相同的值的显示中,每当列值变化时在值变化之前插入n个空行。
BREAK ON break_column SKIP n
 
SQL> BREAK ON DEPTNO SKIP 1
SQL> /
DEPTNO ENAME SAL
---------- ----------- ---------
10 CLARK 2450
MILLER 1300
 
20 SMITH 800
ADAMS 1100
 
10. 显示对BREAK的设置
SQL> BREAK
 
11. 删除6、7的设置
SQL> CLEAR BREAKS
 
12. Set 命令:
该命令包含许多子命令:
SET system_variable value
system_variable value 可以是如下的子句之一:
APPI[NFO]{ON|OFF|text}
ARRAY[SIZE] {15|n}
AUTO[COMMIT]{ON|OFF|IMM[EDIATE]|n}
AUTOP[RINT] {ON|OFF}
AUTORECOVERY [ON|OFF]
AUTOT[RACE] {ON|OFF|TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]
BLO[CKTERMINATOR] {.|c}
CMDS[EP] {;|c|ON|OFF}
COLSEP {_|text}
COM[PATIBILITY]{V7|V8|NATIVE}
CON[CAT] {.|c|ON|OFF}
COPYC[OMMIT] {0|n}
COPYTYPECHECK {ON|OFF}
DEF[INE] {&|c|ON|OFF}
DESCRIBE [DEPTH {1|n|ALL}][LINENUM {ON|OFF}][INDENT {ON|OFF}]
ECHO {ON|OFF}
EDITF[ILE] file_name[.ext]
EMB[EDDED] {ON|OFF}
ESC[APE] {|c|ON|OFF}
FEED[BACK] {6|n|ON|OFF}
FLAGGER {OFF|ENTRY |INTERMED[IATE]|FULL}
FLU[SH] {ON|OFF}
HEA[DING] {ON|OFF}
HEADS[EP] {||c|ON|OFF}
INSTANCE [instance_path|LOCAL]
LIN[ESIZE] {80|n}
LOBOF[FSET] {n|1}
LOGSOURCE [pathname]
LONG {80|n}
LONGC[HUNKSIZE] {80|n}
MARK[UP] HTML [ON|OFF] [HEAD text] [BODY text] [ENTMAP {ON|OFF}] [SPOOL
{ON|OFF}] [PRE[FORMAT] {ON|OFF}]
NEWP[AGE] {1|n|NONE}
NULL text
NUMF[ORMAT] format
NUM[WIDTH] {10|n}
PAGES[IZE] {24|n}
PAU[SE] {ON|OFF|text}
RECSEP {WR[APPED]|EA[CH]|OFF}
RECSEPCHAR {_|c}
SERVEROUT[PUT] {ON|OFF} [SIZE n] [FOR[MAT] {WRA[PPED]|WOR[D_
WRAPPED]|TRU[NCATED]}]
SHIFT[INOUT] {VIS[IBLE]|INV[ISIBLE]}
SHOW[MODE] {ON|OFF}
SQLBL[ANKLINES] {ON|OFF}
SQLC[ASE] {MIX[ED]|LO[WER]|UP[PER]}
SQLCO[NTINUE] {> |text}
SQLN[UMBER] {ON|OFF}
SQLPRE[FIX] {#|c}
SQLP[ROMPT] {SQL>|text}
SQLT[ERMINATOR] {;|c|ON|OFF}
SUF[FIX] {SQL|text}
TAB {ON|OFF}
TERM[OUT] {ON|OFF}
TI[ME] {ON|OFF}
TIMI[NG] {ON|OFF}
TRIM[OUT] {ON|OFF}
TRIMS[POOL] {ON|OFF}
UND[ERLINE] {-|c|ON|OFF}
VER[IFY] {ON|OFF}
WRA[P] {ON|OFF}
 
1). 设置当前session是否对修改的数据进行自动提交
SQL>SET AUTO[COMMIT] {ON|OFF|IMM[EDIATE]| n}
 
2).在用start命令执行一个sql脚本时,是否显示脚本中正在执行的SQL语句
SQL> SET ECHO {ON|OFF}
 
3).是否显示当前sql语句查询或修改的行数
SQL> SET FEED[BACK] {6|n|ON|OFF}
   默认只有结果大于6行时才显示结果的行数。如果set feedback 1 ,则不管查询到多少行都返回。当为off 时,一律不显示查询的行数
 
4).是否显示列标题
SQL> SET HEA[DING] {ON|OFF}
当set heading off 时,在每页的上面不显示列标题,而是以空白行代替
 
5).设置一行可以容纳的字符数
SQL> SET LIN[ESIZE] {80|n}
   如果一行的输出内容大于设置的一行可容纳的字符数,则折行显示。
 
6).设置页与页之间的分隔
SQL> SET NEWP[AGE] {1|n|NONE}
当set newpage 0 时,会在每页的开头有一个小的黑方框。
当set newpage n 时,会在页和页之间隔着n个空行。
当set newpage none 时,会在页和页之间没有任何间隔。
 
7).显示时,用text值代替NULL值
SQL> SET NULL text
 
8).设置一页有多少行数
SQL> SET PAGES[IZE] {24|n}
如果设为0,则所有的输出内容为一页并且不显示列标题
 
9).是否显示用DBMS_OUTPUT.PUT_LINE包进行输出的信息。
SQL> SET SERVEROUT[PUT] {ON|OFF} 
在编写存储过程时,我们有时会用dbms_output.put_line将必要的信息输出,以便对存储过程进行调试,只有将serveroutput变量设为on后,信息才能显示在屏幕上。
 
10).当SQL语句的长度大于LINESIZE时,是否在显示时截取SQL语句。
SQL> SET WRA[P] {ON|OFF}
   当输出的行的长度大于设置的行的长度时(用set linesize n命令设置),当set wrap on时,输出行的多于的字符会另起一行显示,否则,会将输出行的多于字符切除,不予显示。
 
11).是否在屏幕上显示输出的内容,主要用与SPOOL结合使用。
SQL> SET TERM[OUT] {ON|OFF}
   在用spool命令将一个大表中的内容输出到一个文件中时,将内容输出在屏幕上会耗费大量的时间,设置set termspool off后,则输出的内容只会保存在输出文件中,不会显示在屏幕上,极大的提高了spool的速度。
 
12).将SPOOL输出中每行后面多余的空格去掉
SQL> SET TRIMS[OUT] {ON|OFF} 
   
13)显示每个sql语句花费的执行时间
set TIMING  {ON|OFF}
 
14.修改sql buffer中的当前行中,第一个出现的字符串
C[HANGE] /old_value/new_value
SQL> l
   1* select * from dept
SQL> c/dept/emp
   1* select * from emp
 
15.编辑sql buffer中的sql语句
EDI[T]
 
16.显示sql buffer中的sql语句,list n显示sql buffer中的第n行,并使第n行成为当前行
L[IST] [n]
 
17.在sql buffer的当前行下面加一行或多行
I[NPUT]
 
18.将指定的文本加到sql buffer的当前行后面
A[PPEND]
SQL> select deptno,
   2  dname
   3  from dept;
     DEPTNO DNAME
---------- --------------
         10 ACCOUNTING
         20 RESEARCH
         30 SALES
         40 OPERATIONS
 
SQL> L 2
   2* dname
SQL> a ,loc
   2* dname,loc
SQL> L
   1  select deptno,
   2  dname,loc
   3* from dept
SQL> /
 
     DEPTNO DNAME          LOC
---------- -------------- -------------
         10 ACCOUNTING     NEW YORK
         20 RESEARCH       DALLAS
         30 SALES          CHICAGO
         40 OPERATIONS     BOSTON
 
19.将sql buffer中的sql语句保存到一个文件中
SAVE file_name
 
20.将一个文件中的sql语句导入到sql buffer中
GET file_name
 
21.再次执行刚才已经执行的sql语句
RUN
or
/
 
22.执行一个存储过程
EXECUTE procedure_name
 
23.在sql*plus中连接到指定的数据库
CONNECT user_name/passwd@db_alias
 
24.设置每个报表的顶部标题
TTITLE
 
25.设置每个报表的尾部标题
BTITLE
 
26.写一个注释
REMARK [text]
 
27.将指定的信息或一个空行输出到屏幕上
PROMPT [text]
 
28.将执行的过程暂停,等待用户响应后继续执行
PAUSE [text]
 
Sql>PAUSE Adjust paper and press RETURN to continue.
 
29.将一个数据库中的一些数据拷贝到另外一个数据库(如将一个表的数据拷贝到另一个数据库)
COPY {FROM database | TO database | FROM database TO database}
{APPEND|CREATE|INSERT|REPLACE} destination_table
[(column, column, column, ...)] USING query
 
sql>COPY FROM SCOTT/TIGER@HQ TO JOHN/CHROME@WEST 
create emp_temp
USING SELECT * FROM EMP
 
30.不退出sql*plus,在sql*plus中执行一个操作系统命令:
HOST
 
Sql> host hostname
该命令在windows下可能被支持。
 
31.在sql*plus中,切换到操作系统命令提示符下,运行操作系统命令后,可以再次切换回sql*plus:
!
 
sql>!
$hostname
$exit
sql>
 
该命令在windows下不被支持。
 
32.显示sql*plus命令的帮助
HELP
如何安装帮助文件:
Sql>@ ?sqlplusadminhelphlpbld.sql ?sqlplusadminhelphelpus.sql
Sql>help index
 
33.显示sql*plus系统变量的值或sql*plus环境变量的值
Syntax
SHO[W] option
where option represents one of the following terms or clauses:
system_variable
ALL
BTI[TLE]
ERR[ORS] [{FUNCTION|PROCEDURE|PACKAGE|PACKAGE BODY|
TRIGGER|VIEW|TYPE|TYPE BODY} [schema.]name]
LNO
PARAMETERS [parameter_name]
PNO
REL[EASE]
REPF[OOTER]
REPH[EADER]
SGA
SPOO[L]
SQLCODE
TTI[TLE]
USER
 
1) . 显示当前环境变量的值:
Show all
 
2) . 显示当前在创建函数、存储过程、触发器、包等对象的错误信息
Show error
当创建一个函数、存储过程等出错时,变可以用该命令查看在那个地方出错及相应的出错信息,进行修改后再次进行编译。
 
3) . 显示初始化参数的值:
show PARAMETERS [parameter_name]
 
4) . 显示数据库的版本:
show REL[EASE]
 
5) . 显示SGA的大小
show SGA
 
6). 显示当前的用户名
show user

- 作者: leon 2008年04月7日, 星期一 11:00  回复(0) |  引用(0)

最新经典语录
1.再牛B的肖邦,也弹不出老子的悲伤! 
2.帅有个屁用!到头来还不是被卒吃掉!
3.青春献给了房子,中年献给了孩子 
    4.当我看到世贸中心倒塌后的废墟; 
    当我看到别斯兰小学惨死的儿童; 
    当我看到马德里爆炸后的街头; 
    当我看到伦敦瘫痪的地铁站…… 
     我已经出离愤怒了--你们这群冷血残忍、毫无人性的KB分子,难道就不知道去袭击日本么?!! 
    5.两样东西阻碍了中国男足冲出亚洲--他们的左脚和他们的右脚! 
    6.为了做公务员,我生了领导的儿子! 
    7.女人一生喜欢两朵花:一是有钱花,二是尽量花! 
    8.派出所是中国最大的反*party培训基地,中国大学是世界上最大的洗脑基地! 
    9.城市管理者大队长猝死在街头--狗都累死了,可见统治者残忍到什么程度!!! 
    10.一个女人她可以喜欢你,但她不爱你;她可以爱你,但她不嫁你;她可以嫁你,但她不生育;她可以生育,但孩子不是你的 
    11.命苦:月下老人用红线牵引我们,我却看上了红线;我把心掏出来给她看,她却戴上了墨镜…… 
    12.你们也不能太侮辱周正龙的智慧,至少他自己没顶片树叶,然后宣称自己是华南虎! 
    13..矿难在检讨中继续,楼价在控制中上升! 
     14.张纪中版《西游记》里的天兵天将将在全国各地城市管理者中进行海选--城市管理者队员们不论是形象作风,还是战斗力都非常有震慑力,非常适合扮演招之即来、来之即战、战之能胜的威武之师、文明之师!" 
    15.美国自南北战争后就没有奴隶了,黑人奴隶变成自由人和国家公民;而在新中国的山西黑砖窑,却把自由人和国家公民变成了黑人奴隶! 16.据国家统计局统计,2007年中国同比没有增长的有:1.工资;2.空气。 
    17.什么节目充满了欺骗谎言却极受广大人民群众的喜爱?答:新闻联播! 
    18.2007年的中国股民:辛辛苦苦两三年,一夜回到解放前,家宝飚泪把戏演,南海剧组狂搂钱! 
    19.开发商买不起人民群众的房子就让法院强制执行,那么人民群众买不起开发商的房子是否也可以要求法院强制执行?
    20.作弊的方式有两种: 一种是抄在纸上的小抄,可能被发现,结果是退学;另一种是抄在脑袋里的小抄,不可能被发现,结果是拿到的是奖学金。 
    21.XP不发威,你当我是DOS啊! 
    22.世态炎凉鸡最懂,人情冷暖鸭先知。 
    23.民主孕育幽默,独裁引发讽刺! 
     24.有奶不一定是娘,但有钱一定是爷! 
    25.英雄不问出路,流氓不看岁数! 
    26.政治朝鲜化,经济拉美化,物价欧美化,工资非洲化! 
    27.山西--中国矿难事故的形象代言人! 
    28.中国的肯德基是用来上厕所的! 
    29.随着肉价再次上涨,以前开玩笑说猪的"四大理想"中的"全国人民信回教" 就快要实现了! 
    30.CCTV1《晚间新闻》:大陆10月物价上涨6.6%,群众一致示"对生活影响不大";CCTV4《海峡两岸》:台湾物价增长4.5%,民众大叫"活不了了"! 
    31.都是中国人,不用讲素质! 
    32.股票赔的只能扮超人出去打劫了! 
    33.究竟是通货膨胀了,还是go-vern-ment开始抢劫了?为什么我们这么努力工作却过得如此艰难?终于明白大宋京都警备司令部司令员林冲这么优秀的公务员为什么都上梁山了!

- 作者: leon 2008年03月26日, 星期三 16:39  回复(0) |  引用(0)

对OL男性最有害的七个坏习惯
转来的文章,OL是什么我不知道,看来有点跟不上时代了,继续学习中,这篇文章可能会涉及到日常生活中的一些琐事,不过稍微注意的话,也许对你的健康会更有好处.



当白领们遭到身体小病痛的困扰时,总会埋怨自己的“体质”,事实上那些不舒服的小病痛,往往是来自于平常被我们忽视的小坏习惯。也许在你不经意间,你已经埋下了疾病的隐患。

  当白领们遭到身体小病痛的困扰时,总会埋怨自己的“体质”,事实上那些不舒服的小病痛,往往是来自于平常被我们忽视的小坏习惯。也许在你不经意间,你已经埋下了疾病的隐患。

  1.一双鞋天天穿着不换

  由于我们的脚和身体其它部位一样也会出汗,鞋在穿过一天之后都会变得潮湿,而且至少需要24小时才会完全干透。

  每天都穿同一双鞋,只会令自己的脚长期处在一种潮湿的状态下,病菌也更加容易滋生。

  2.习惯紧身的衣服

  长时间穿着过紧的衣服,容易出现压迫到内脏器官的情形,引起腹涨腹痛,加重心脏负荷,而令人产生明显的不适感。

  如果裤子太紧,会使胃酸倒溢,同时,不利于体内气体的排放运作。

  3.早上起床就光脚丫子

  脚每天要承受我们全部的体重,所以每天都会有部分组织受到一定程度的伤害,这些伤害都需要通过夜间的休息来加以恢复。如果早上起来光脚丫子的话,脚后跟会负担过重,夜间恢复的组织也会再次遭到严重伤害。

  4.经常夹着电话筒讲电话

  为了避免听筒的滑落,多数人总很自然地用力去夹住它,由此就会加重背部和颈部肌肉的负担,且颈肩之间的肌肉在保持长时间的紧张状态下,也会出现肌肉痉挛的现象。

  法国一名患者因长期在听电话时将听筒夹在下颚与肩膀之间,导致左眼失明,并且说话也出现困难。

  5.随处倒头就睡

  因为工作繁忙,或是其它一些条件的限制,很多人对睡觉的地方一点也不挑剔,椅子上、汽车里,随处都能倒头就睡。

  睡觉是一个恢复体力、消除疲劳的过程,如果不能让身体充分地自然放松,睡觉就无法发挥应该发挥的作用,而且还会引发肌肉疼痛甚至痉挛。

  6.从不清洗牙刷

  牙刷在清洗我们的口腔时,会沾染上各种各样的物质,包括细菌,再加上它长期处于卫生间这样一个潮湿的环境,细菌更容易滋生。有研究证明,使用15天后的牙刷,如果未经清洗会有细菌产生。

  7.长时间不眨眼睛

  这在天天与计算机打交道的办公室里最普遍,眼镜盯着计算机屏幕,可能会好几分钟也不眨一下。此将可能引发“计算机视觉综合症”,出现流眼泪、视力下降、戴隐形眼镜不适感等症状。


- 作者: leon-sang 2008年03月13日, 星期四 16:31  回复(0) |  引用(0)

推荐几款国外免费杀毒软件
首先推荐 Comodo软件包,完全免费,包括防病毒模块、防垃圾邮件模块、密码管理模块等
http://www.comodogroup.com/products/free_products.html

接着是AVG
http://www.grisoft.com/doc/1
其中的杀毒模块是免费的,但是防火墙和防间谍软件不是免费。
功能上相当完整,可即时对任何存取文件侦测,防止电脑病毒感染;可对电子邮件和附加文件进行扫瞄。
使用免费版之前,请先去
http://free.grisoft.com/填个表,该公司将给您发送两份邮件,稍后的第二份邮件中,你将得到一个免费使用的序列号。

Avast!也相当不错:
http://www.avast.com/
http://www.avast.com/i_kat_207.php?lang=CHS (官方网站Home版本的免费注册简体中文)
AVAST32有全模块化的架构,它的引擎核心可与许多的客户端程序或 Plungin 配合。这软件可以侦测出大量的 Windows 9X/Me 或 Windows NT/XP/2000 环境下的已知病毒,甚至对那些无法直接侦测出的未知或变形病毒也可以。

ClamWin Free Antivirus
http://www.clamwin.com/
ClamWin是一套功能非常优秀的免费防毒软件。它的体积非常娇小,不会占用太多计算机资源,不像其它防毒软件安装之后会拖累整台计算机的速度。而且除了强大的文件与电子邮件防护能力之外,它还拥有排程扫描、在线更新病毒码、及时侦测等功能,和市面上知名防毒软件比起来一点也不逊色!
笔者目前使用的就是这款软件。

AntiVir Personal Edition
http://www.free-av.com/index.htm
AntiVir个人版本,是来自德国的著名病毒防治软件。它可使你免受到电脑病毒的侵害,有效的保护个人电脑以及工作站的使用。它可以检测并清除超过70,000种病毒,支持网络更新。



上面是杀毒软件,下面还有几款免费的防火墙:
ZoneAlarm(基本版免费,完全版收费)
http://www.zonelabs.com/store/content/company/zap_za_grid.jsp
笔者目前使用的软件。

Primedius(简装版免费,专业版收费 )
http://www.primedius.com/PersonalFirewall.htm

Agnitum(免费)
http://www.agnitum.com/products/outpostfree/download.php

下面的两款就没有什么特点了:
Sunbelt/Kerio (30天免费试用)
http://www.sunbelt-software.com/Kerio-Download.cfm

Securepoint Personal Firewall & VPN Client (60天免费试用)
http://www.securepoint.cc/


       
还有免费的防间谍软件:
Spyware Terminator(免费,推荐)
http://www.spywareterminator.com/
很容易上手,能够实时保护你的系统不受木马、浏览器劫持及恶意软件等的入侵。恶意代码特征库,这个库可以在线更新,使你能防范各种新型恶意程序的攻击。

Ad-Aware SE(免费,推荐)
http://www.lavasoftusa.com/
有着漂亮的界面,并且支持在线升级。是防护墙和杀毒软件的最佳补充。
目前在网上找到了绿色版本,如果需要,可以和笔者联系。

Spybot S&D Detection (免费)
http://spybot.safer-networking.de/
目前在网上找到了绿色版本,如果需要,可以和笔者联系。

Arovax AntiSpyware(免费)
http://www.arovaxantispyware.com/
功能强大、快速,极易上手。

Ewido Anti-Spyware(提供试用版)
http://www.ewido.net/en/download/
目前在网上找到了绿色版本,如果需要,可以和笔者联系。

Windows Defender(免费)
是微软公司出品的一个反间谍软件的产品,原来名Windows AntiSpyware。目前只能在  Windows Server 2003 SP1; Windows XP SP2中使用。笔者使用的是win2k3,无缘使用。

另外,还有国产软件Windows 流氓软件清理大师,也有绿色版,欢迎索取。


- 作者: leon-sang 2008年03月11日, 星期二 16:17  回复(0) |  引用(0)

抽象类和接口的区别
abstract class和 interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。 abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义 时对于abstract class和interface的选择显得比较随意。其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域 本质的理解、对于设计意图的理解是否正确、合理。本文将对它们之间的区别进行一番剖析,试图给开发者提供一个在二者之间进行选择的依据。 

理解抽象类 

abstract class 和interface在Java语言中都是用来进行抽象类(本文中的抽象类并非从abstract class翻译而来,它表示的是一个抽象体,而 abstract class为Java语言中用于定义抽象类的一种方法,请读者注意区分)定义的,那么什么是抽象类,使用抽象类能为我们带来什么好处 呢? 

在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果 一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列 看上去不同,但是本质上相同的具体概念的抽象。比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不 同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念,所 以用以表征抽象概念的抽象类是不能够实例化的。 

在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的 抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操 作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。熟悉OCP的读者一 定知道,为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle),抽象类是其中的关键所在。 


从语法定义层面看abstract class和interface 

在语法层面,Java语言对于abstract class和interface给出了不同的定义方式,下面以定义一个名为Demo的抽象类为例来说明这种不同。 

使用abstract class的方式定义Demo抽象类的方式如下: 

abstract class Demo { 
 abstract void method1(); 
 abstract void method2(); 
 … 
} 

使用interface的方式定义Demo抽象类的方式如下: 

interface Demo { 
 void method1(); 
 void method2(); 
 … 


在abstract class 方式中,Demo可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface方式的实现中,Demo只能够有静态的不能被修改 的数据成员(也就是必须是static final的,不过在interface中一般不定义数据成员),所有的成员方法都是abstract的。从某种 意义上说,interface是一种特殊形式的abstract class。 

      从编程的角度来看,abstract class和interface都可以用来实现"design by contract"的思想。但是在具体的使用上面还是有一些区别的。 

首先,abstract class在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。也许,这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。 

其次,在abstract class的定义中,我们可以赋予方法的默认行为。但是在interface的定义中,方法却不能拥有默认行为,为了绕过这个限制,必须使用委托,但是这会 增加一些复杂性,有时会造成很大的麻烦。 

在 抽象类中不能定义默认行为还存在另一个比较严重的问题,那就是可能会造成维护上的麻烦。因为如果后来想修改类的界面(一般通过 abstract class或者interface来表示)以适应新的情况(比如,添加新的方法或者给已用的方法中添加新的参数)时,就会非常的麻烦, 可能要花费很多的时间(对于派生类很多的情况,尤为如此)。但是如果界面是通过abstract class来实现的,那么可能就只需要修改定义在 abstract class中的默认行为就可以了。 

同样,如果不能在抽象类中定义默认行为,就会导致同样的方法实现出现在该抽象 类的每一个派生类中,违反了"one rule,one place"原则,造成代码重复,同样不利于以后的维护。因此,在abstract class 和interface间进行选择时要非常的小心。 


从设计理念层面看abstract class和interface 

上 面主要从语法定义和编程的角度论述了abstract class和interface的区别,这些层面的区别是比较低层次的、非本质的。本小节将从另一 个层面:abstract class和interface所反映出的设计理念,来分析一下二者的区别。作者认为,从这个层面进行分析才能理解二者概念的 本质所在。 

前面已经提到过,abstarct class在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生 类之间必须存在"is a"关系,即父类和派生类在概念本质上应该是相同的(参考文献〔3〕中有关于"is a"关系的大篇幅深入的论述,有兴趣的读者可 以参考)。对于interface 来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,仅仅是实现了 interface定义的契约而已。为了使论述便于理解,下面将通过一个简单的实例进行说明。 

考虑这样一个例子,假设在我们的问题领域中有一个关于Door的抽象概念,该Door具有执行两个动作open和close,此时我们可以通过abstract class或者interface来定义一个表示该抽象概念的类型,定义方式分别如下所示: 

使用abstract class方式定义Door: 

abstract class Door { 
 abstract void open(); 
 abstract void close(); 


  
使用interface方式定义Door: 


interface Door { 
 void open(); 
 void close(); 


  
其他具体的Door类型可以extends使用abstract class方式定义的Door或者implements使用interface方式定义的Door。看起来好像使用abstract class和interface没有大的区别。 

如 果现在要求Door还要具有报警的功能。我们该如何设计针对该例子的类结构呢(在本例中,主要是为了展示abstract class和 interface反映在设计理念上的区别,其他方面无关的问题都做了简化或者忽略)?下面将罗列出可能的解决方案,并从设计理念层面对这些不同的方案进 行分析。 

解决方案一: 

简单的在Door的定义中增加一个alarm方法,如下: 

abstract class Door { 
 abstract void open(); 
 abstract void close(); 
 abstract void alarm(); 


  
或者 

interface Door { 
 void open(); 
 void close(); 
 void alarm(); 


  
那么具有报警功能的AlarmDoor的定义方式如下: 

class AlarmDoor extends Door { 
 void open() { … } 
 void close() { … } 
 void alarm() { … } 


  
或者 

class AlarmDoor implements Door { 
 void open() { … } 
 void close() { … } 
 void alarm() { … } 
} 

这 种方法违反了面向对象设计中的一个核心原则ISP(Interface Segregation Priciple),在Door的定义中把Door概念 本身固有的行为方法和另外一个概念"报警器"的行为方法混在了一起。这样引起的一个问题是那些仅仅依赖于Door这个概念的模块会因为"报警器"这个概念 的改变(比如:修改alarm方法的参数)而改变,反之依然。 

解决方案二: 

既然open、close和 alarm属于两个不同的概念,根据ISP原则应该把它们分别定义在代表这两个概念的抽象类中。定义方式有:这两个概念都使用 abstract class方式定义;两个概念都使用interface方式定义;一个概念使用abstract class方式定义,另一个概念使用 interface方式定义。 

显然,由于Java语言不支持多重继承,所以两个概念都使用abstract class方式定义是不可行的。后面两种方式都是可行的,但是对于它们的选择却反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理。我们一一来分析、说明。 

如 果两个概念都使用interface方式来定义,那么就反映出两个问题:1、我们可能没有理解清楚问题领域,AlarmDoor在概念本质上到底是 Door还是报警器?2、如果我们对于问题领域的理解没有问题,比如:我们通过对于问题领域的分析发现AlarmDoor在概念本质上和Door是一致 的,那么我们在实现时就没有能够正确的揭示我们的设计意图,因为在这两个概念的定义上(均使用interface方式定义)反映不出上述含义。 

如 果我们对于问题领域的理解是:AlarmDoor在概念本质上是Door,同时它有具有报警的功能。我们该如何来设计、实现来明确的反映出我们的意思呢? 前面已经说过,abstract class在Java语言中表示一种继承关系,而继承关系在本质上是"is a"关系。所以对于Door这个概念,我们 应该使用abstarct class方式来定义。另外,AlarmDoor又具有报警功能,说明它又能够完成报警概念中定义的行为,所以报警概念可以通 过interface方式定义。如下所示: 

abstract class Door { 
 abstract void open(); 
 abstract void close(); 

interface Alarm { 
 void alarm(); 

class AlarmDoor extends Door implements Alarm { 
 void open() { … } 
 void close() { … } 
    void alarm() { … } 


  
这 种实现方式基本上能够明确的反映出我们对于问题领域的理解,正确的揭示我们的设计意图。其实abstract class表示的是"is a"关系, interface表示的是"like a"关系,大家在选择时可以作为一个依据,当然这是建立在对问题领域的理解上的,比如:如果我们认为 AlarmDoor在概念本质上是报警器,同时又具有Door的功能,那么上述的定义方式就要反过来了。 

- 作者: leon 2007年11月1日, 星期四 13:35  回复(0) |  引用(0)

typedef struct与struct的区别(转)

1. 基本解释

  typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。

  在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。

  至于typedef有什么微妙之处,请你接着看下面对几个问题的具体阐述。


 


  2. typedef & 结构的问题

  当用下面的代码定义一个结构时,编译器报了一个错误,为什么呢?莫非C语言不允许在结构中包含指向它自己的指针吗?请你先猜想一下,然后看下文说明:

typedef struct tagNode
{
 char *pItem;
 pNode pNext;
} *pNode; 

  答案与分析:

  1、typedef的最简单使用

typedef long byte_4;

  给已知数据类型long起个新名字,叫byte_4。

  2、 typedef与结构结合使用

typedef struct tagMyStruct
{
 int iNum;
 long lLength;
} MyStruct;

  这语句实际上完成两个操作:

  1) 定义一个新的结构类型

struct tagMyStruct
{
 int iNum;
 long lLength;
};

  分析:tagMyStruct称为“tag”,即“标签”,实际上是一个临时名字,struct 关键字和tagMyStruct一起,构成了这个结构类型,不论是否有typedef,这个结构都存在。

  我们可以用struct tagMyStruct varName来定义变量,但要注意,使用tagMyStruct varName来定义变量是不对的,因为struct 和tagMyStruct合在一起才能表示一个结构类型。

  2) typedef为这个新的结构起了一个名字,叫MyStruct。

typedef struct tagMyStruct MyStruct;

  因此,MyStruct实际上相当于struct tagMyStruct,我们可以使用MyStruct varName来定义变量。

  答案与分析

  C语言当然允许在结构中包含指向它自己的指针,我们可以在建立链表等数据结构的实现上看到无数这样的例子,上述代码的根本问题在于typedef的应用。

  根据我们上面的阐述可以知道:新结构建立的过程中遇到了pNext域的声明,类型是pNode,要知道pNode表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字也还不存在,也就是说这个时候编译器根本不认识pNode。

  解决这个问题的方法有多种:

  1)、

typedef struct tagNode
{
 char *pItem;
 struct tagNode *pNext;
} *pNode;

  2)、

typedef struct tagNode *pNode;
struct tagNode
{
 char *pItem;
 pNode pNext;
};

  注意:在这个例子中,你用typedef给一个还未完全声明的类型起新名字。C语言编译器支持这种做法。

  3)、规范做法:

struct tagNode
{
 char *pItem;
 struct tagNode *pNext;
};
typedef struct tagNode *pNode;

- 作者: leon 2007年11月1日, 星期四 11:13  回复(0) |  引用(0)

装好Windows系统后必须做的10件大事

装好Windows后必做的10件大事


Windows
是越用越慢,是不争的事。因此,使用Windows就免不了要重新安装系。当然,重新安装系并不,但是安装完系后你知道我有多少事情必要做?可容不得毫的松懈,一旦虎,将可能会致前功尽弃,甚至有可能会造成数据失、信息泄密!
  第1