qiyadeng

专注于Java示例及教程
posts - 84, comments - 152, trackbacks - 0, articles - 34

Three Rules for Effective Exception Handling

Best Practices for Exception Handling

Exceptions in Java

Designing with exceptions

Exceptional practices, Part 1

When catching exceptions, don't cast your net too wide

Use nested exceptions in a multitiered environment

Beware the dangers of generic Exceptions

posted @ 2008-07-29 11:08 qiyadeng 阅读(374) | 评论 (0)编辑 收藏

使用InputVerifier设计Swing校验包

尽管有许多针对Swing的校验框架,并且Swing中也有API InputVerifier用于数据校验,InputVerifier易于使用并且容易定制。本文将在InputVerifier的基础上构建一个可用的校验包,可以在其它的Swing应用之中。

InputVerifier类在javax.swing包中。它有一个抽象方法,我们需要实现一个叫verify()的方法,这个方法接受一个JComponent作为参数,返回值为true或false。一旦我们实现了verify()方法,我们可以在JTextField中使用如下:

JTextField text = new JTextField();

Text.setInputVerifier(new MyVerifier());

然而,InputVerifier本身并没有什么意思。它的作用是防止用户输入错误的信息在组件中,阻止用户把输入光标移动到其他组件上。这种方式令人感到厌烦并且用户不知道错误所在。InputVerifier并没有提供一些更好的功能,所以我们需要构建一个如下校验包:

1. 如果数据不正确时,可以改变输入组件的背景颜色。

2. 如果数据不正确时,可以弹出消息提示用户错误出在什么地方,应该怎么处理。

3. 我们需要通知Form窗体每个组件的校验结果,这样的话Form窗体可以执行相应的动作。(例如启动”OK”按钮)

4. 如果用户改正了组件的错误数据,则错误提示信息应消失。

我们的包中包含一个抽象类,这个抽象类处理了大部分的工作,我们只需要实现一个方法,决定使用什么规则来进行数据校验;同时也提供一个接口,如果需要校验的Form窗体需要校验结果通知Form窗体,则可以实现该接口。好了,我们现在可以设计这个接口。

WantsValidationStatus接口

下面的接口可以提供一种方式用于出发Form窗体的制定事件。

package ica.swing.validation;

public interface WantsValidationStatus {

void validateFailed(); // Called when a component has failed validation.

void validatePassed(); // Called when a component has passed validation.

}

实现这个接口可以通知Form窗体校验状态,但是实现该接口不是必须的。我们也可以不是实现这个接口,如果校验失败不做任何事情。但是,我认为这样的设计是比较优美的。接下来看看我们的抽象类。

AbstractValidator类

AbstarctValidator处理了显示出错提示,改变出错背景,通知Form窗体等许多工作。只留下一个抽象的方法待实现,protected abstract Boolean validateCriteria(JComponent c),这个方法我们需要提供自己的校验规则用于校验组件。以下是抽象类:

protected abstract boolean validationCriteria(JComponent c);

public boolean verify(JComponent c) {

if (!validationCriteria(c)) {

c.setBackground(Color.PINK);

//messageLabel.setSize(0,0);

//messageLabel.setBackground(color);

point = c.getLocation();

double x =point.getX();

double y = point.getY();

Point p = new Point();

p.setLocation(x,y+c.getHeight());

tooltip= new HalfOpaqueToolTip(

message, new Color( 250 , 250 , 200 ), Color.RED, Color.BLACK, 1,dialog,p );

c.addMouseListener(tooltip);

return false;

}

Verify()方法

当需要校验是调用方法boolean verify(JComponent c),下面用一例子示之。

public class ToolTipsEmptyValidator extends ToolTipsAbstractValidator {

public ToolTipsEmptyValidator(JDialog dialog, JTextField c, String message) {

super(dialog, c, message);

}

public ToolTipsEmptyValidator(JFrame dialog, JTextField c, String message) {

super(dialog, c, message);

}

public ToolTipsEmptyValidator(JDialog dialog, JTextArea c, String message) {

super(dialog, c, message);

}

public ToolTipsEmptyValidator(JFrame dialog, JTextArea c, String message) {

super(dialog, c, message);

}

@Override

protected boolean validationCriteria(JComponent c) {

if (c instanceof JTextField){

if (((JTextField) c).getText().equals(""))

return false;

}

else if (c instanceof JTextArea){

if (((JTextArea) c).getText().equals(""))

return false;

}

return true;

}

}

调用方法如下:

ToolTipsEmptyValidator validator1 = new ToolTipsEmptyValidator(jDialog,localdbPanel.getIpAddressField(),"Error,IP Address can't be empty");

boolean flag1 = validator1.verify(localdbPanel.getIpAddressField());

下图是使用该校验包的示例。

image

posted @ 2008-07-27 10:43 qiyadeng 阅读(2056) | 评论 (1)编辑 收藏

向导在今天的桌面应用中非常常用。向导应该是个什么样子呢?相信你应该很清楚,因为你使用过很多的向导。也许你使用过一些安装程序向导或是一些程序的配置向导。这篇文章,我们会创建一个简单的向导框架。

一个向导包括很多Panel,每个Panel里面包含用户的配置组件或是文本域或是选择框等。用户点击”Next”或是”Back”按钮,在各个Panel之间切换,输入需要的信息。注意的是,当最后一个Panel是”Next”按钮要变成”Finish”按钮,并且再次按下的时候向导关闭。在向导关闭的时,发起向导的类要得到向导Panel中所有的数据。在任何情况下,用户可以点击”Cancel”按钮关闭向导并丢弃前面所填的所有数据。

看上去很简单是吗?对的,但是有些设计细节我们需要考虑。

第一,向导中的每个Panel不是都需要访问的,换句话说,如果向导包含1到5个Panel,点击”Next”按钮可以从第一个Panel依次到第五个Panel,但是有时候可能由于用户的选项直接从第一个Panel跳到第五个Panel. 而且还有的情况是,假设向导中需要连接到远程服务器或是远程数据库,如果连接不上的,那么就不能到达下一个Panel。这样向导中的Panel就像是树形,你从树的根开始,通过不同的分支到达叶子节点,这时”Next”按钮变成”Finish”按钮。

第二,有些时候Next按钮和Back按钮需要禁用。比如,第一个Panel出现的时候,back按钮应该禁用,因为没有上一个Panel。另外,当有些值必须输入的时候,没有输入的情况下Panel中的Next按钮应该为禁用。

第三,输入的数据需要一直保持到用户完成向导或是取消。因为当用户点击Back按钮会到上一个Panel时,上一个Panel填写的数据应该能够保持,并且再次使用Next按钮时,本Panel中的数据也应该保持。

有了这些设计细节,我们可以考虑设计自己的向导了。我们先规划下我们将要完成的一些类。

Wizard-这个类包含模型(model)和控制器(controller),其主要是一个对话框(JDialog),并且包含有Next,Back和Cancel按钮。还有一个使用CardLayout布局管理的大组件,可以把各个Panel显示在上面。想下图的样子:

clip_image002

Java.awt.Componet的子类,这个类一般是继承了java.awt.Componet,通常是一个javax.swing.JPanel.这个类是用于显示在wizard类中的大组件位置。下图是其中一个Panel。

clip_image004

WizardPanelDescriptor-这第三个类用于关联wizard和panel。这个需要类用户继承,并用于标识Panel.这个类指定了访问下一个和前一个Panel的规则,并且在Panel的显示前,现实中,和显示后执行相应的动作。

Wizard

首先我们需要创建一个用于显示向导对话框本身,它包含有三个按钮Back,Next,Cancel.一般这些按钮是按照从左到右的顺序分布的,另外Cancel按钮要离其他的两个按钮远一点,这样防止用户不小心点击到Cancel按钮。接下来,就用需要一个布局,可以在同一个区域显示各个Panel,在AWT中有CardLayout布局。

在这个设计中,我们使用一个简单的方法来检测我们的数据。下面我们看看Wizard类:

Public Class Wizard{

private WizardModel wizardModel;

private WizardController wizardController;

private JDialog wizardDialog;

private JPanel cardPanel;

private CardLayout cardLayout;

private JButton backButton;

private JButton nextButton;

private JButton cancelButton;

private MainFrame mainFrame;

private int returnCode;

public Wizard(MainFrame owner) {

this.mainFrame = owner;

wizardModel = new WizardModel();

wizardDialog = new JDialog(owner);

Point np = owner.getLocation();

wizardDialog.setLocation(np);

initComponents();

}

}

注意到initComponents()方法,这个方法是用于布置界面中的组件和按钮的,并且把按钮事件关联到控制器中。

private void initComponents() {

JPanel buttonPanel = new JPanel();

Box buttonBox = new Box(BoxLayout.X_AXIS);

cardPanel = new JPanel();

cardPanel.setBorder(new EmptyBorder(new Insets(5, 10, 5, 10)));

cardLayout = new CardLayout();

cardPanel.setLayout(cardLayout);

backButton = new JButton();

nextButton = new JButton();

cancelButton = new JButton();

backButton.setActionCommand(BACK_BUTTON_ACTION_COMMAND);

nextButton.setActionCommand(NEXT_BUTTON_ACTION_COMMAND);

cancelButton.setActionCommand(CANCEL_BUTTON_ACTION_COMMAND);

buttonPanel.setLayout(new BorderLayout());

buttonPanel.add(separator, BorderLayout.NORTH);

buttonBox.setBorder(new EmptyBorder(new Insets(5, 10, 5, 10)));

buttonBox.add(backButton);

buttonBox.add(Box.createHorizontalStrut(10));

buttonBox.add(nextButton);

buttonBox.add(Box.createHorizontalStrut(30));

buttonBox.add(cancelButton);

buttonPanel.add(buttonBox, java.awt.BorderLayout.EAST);

wizardDialog.getContentPane().add(buttonPanel, java.awt.BorderLayout.SOUTH);

wizardDialog.getContentPane().add(cardPanel, java.awt.BorderLayout.CENTER);

}

接下来,我们要把Componet Panel注册到Wizard中。Wzard中使用registerWizardPanel()方法。我们知道CardLayout布局中包含有next(),previous()这样的方法来回翻动Panel,然而我们需要的是树形结构,而不是线性的结构,因此我们需要使用标识符来标识各个Panel对象。

public void registerWizardPanel(Object id, WizardPanelDescriptor panel) {

cardPanel.add(panel.getPanelComponent(), id);

wizardMdel.registerPanel(id, panel);

}

最后wizard中是用setCurrentPanel(Object id)来设置,Wizard初始化时显示的第一个Panel。剩下的就是一些事件处理,比较简单。Wizard中大量的使用Wizard来保存数据,并使用WizardController来处理对话框本身的事件。

WizardPanelDescriptor

注册到Wizard的每个方法都需要继承WizardPanelDescriptor类,这个类包含一些方法可以把组件集成到Wizard向导中。以下的四个方法:是访问组件和组件对象标识符的方法。

public final void setPanelComponent(Component panel) {

targetPanel = panel;

}

public final Component getPanelComponent() {

return targetPanel;

}

public final Object getPanelDescriptorIdentifier() {

return panelIdentifier;

}

public final void setPanelDescriptorIdentifier(Object id) {

panelIdentifier = id;

}

下面是比较重要的一部分,就是每个继承类都需要改写的一些方法。包括控制Next,Back之后显示的Panel。在每次Panel初始化的时候都会执行Next这个方法,当Next和Back方法中返回的是null之的时候Next和Back按钮被禁用。因此,Next方法不能用于数据的校验,需要有另外的方法,在这里使用了一个Validator方法,当然如果数据需要校验,也需要在WizardPanelDescriptor子类中进行覆盖。具体如下:

public Object getNextPanelDescriptor() {

return null;

}

public Object getBackPanelDescriptor() {

return null;

}

public boolean validator(){

return true;

}

另外提供三个方法,用于控制Panel显示前,显示中和显示后的事件。

public void aboutToDisplayPanel() {

}

public void displayingPanel() {

}

public void aboutToHidePanel() {

}

WizardPanelDescriptor

clip_image007

最后,用上图来表示Wizard类和其他几个类之间的关系图,并展示了两个实例。

posted @ 2008-07-26 16:46 qiyadeng 阅读(1888) | 评论 (2)编辑 收藏

ci-bayes实现了两种贝叶斯分类方法:a Navie implementation 和 a Fisher implementation,是Toby segaran's 的书"Programming Collective Intelligence"的一部分的Java实现版本。

简单的一个例子如下:

FisherClassifier fc=new FisherClassifierImpl();
fc.train("The quick brown fox jumps over the lazy dog's tail","good");
fc.train("Make money fast!", "bad"); 
String classification=fc.getClassification("money"); // should be "bad"

posted @ 2008-06-25 10:16 qiyadeng 阅读(3359) | 评论 (2)编辑 收藏

水星(Mercury)
金星(Venus)
地球(Earth)
火星(Mars)
木星(Jupiter)
土星(Saturn)
天王星(Uranus)
海王星(Neptune)
冥王星(Pluto)

planets_518

Twelve Years of Animals( 12生肖)
1.Year of the Rat 鼠年
2.Year of the Ox 牛年
3.Year of the Tiger 虎年
4.Year of the Rabbit 兔年
5.Year of the Dragon 龙年
6.Year of the Snake 蛇年
7.Year of the Horse 马年
8.Year of the Goat 羊年
9.Year of the Monkey 猴年
10.Year of the Rooster 鸡年
11.Year of the Dog 狗年
12.Year of the Boar 猪年

Twelve Constellations (12星座):
1.Aquarius(the Water Carrier)水瓶座
2.Pisces(the Fishes)双鱼座
3.Aries(the Ram)白羊座
4.Taurus(the Bull)金牛座
5.Gemini(the Twins)双子座
6.Cancer(the Crab)巨蟹座
7.Leo(the Lion)狮子座
8.Virgo(the Virgin)处女座
9.Libra(the Scales)天秤座
10.Scorpio(the Scorpion)天蝎座
11.Sagittarius(the Archer)射手座
12.Capricorn(the Goat)山羊座

posted @ 2008-05-31 12:12 qiyadeng 阅读(1149) | 评论 (0)编辑 收藏

一下是一些收集的关于动物的习语。有些没有翻译的分两种情况,一是从字面意思很容易看出来,而写出来不一定准确的;另外一类是我还不确定其真正的含义。

bear  Bear 熊

  • bear market 熊市-空头市场
  • You can't have your cake and eat it too.鱼和熊掌不可兼得

 

 

 Bird 鸟

  • A bird in the hand is worth two in the bush. bird
  • A little bird told me.
  • a bird's-eys view鸟瞰
  • Birds of a feather flock together.物以类聚
  • eat like a bird吃的很少,食量小
  • Fine feathers make fine birds.人要衣装,佛要金装。
  • give a person the bird喝倒彩
  • Kill two birds with one stone.一石二鸟
  • the birds and the bees有关性的基本常识
  • The early birds catches the worm.早起的鸟儿有虫吃
  • newbie菜鸟

bull

Bull,calf,cattle,cow,ox牛

  • bull market 牛市-多头市场
  • bull session 闲谈,男性之间的谈话
  • like a bull in china shop笨手笨脚
  • to milk the bull缘木求鱼
  • You can't sell the cow and drink the milk.与和熊掌不可兼得
  • why buy the cow when the milk is free.
  • Take the bull by the horns.勇敢的客服困难,挺身而出
  • as dumb as an ox像公牛一般沉默
  • as strong as an ox像牛般强壮
  • dirnk lisk a fish牛饮
  • as stubborn as mule牛脾气
  • talk horse吹牛
  • to eat like a horse食量大如牛
  • to lead a dog's life 牛马不如的生活
  • to cast the pearls before swine对牛弹琴

cat

Cat, Kitten猫

  • A cat has nine lives.
  • cat-and-mouse玩弄,折磨
  • cat burglar蜘蛛盗
  • cat house妓院
  • cat nap/sleep小睡
  • Cat got you tongue?舌头打结
  • bell the cat做危险的事
  • cats and dogs形同水火
  • Curiousity killed the cat.勿多管闲事
  • Let the cat out of the bag.泄漏机密
  • live a cat-and-dog life争吵度日
  • It rains cats and dogs.倾盆大雨
  • There is not even enough room for swing a cat.无转身之处
  • She is a scary cat.很容易受到惊吓
  • While the cat is away, the mice will play.猫去鼠嬉

chicken

Chicken ,cock,hen,rooster鸡

  • a hen party女性聚会
  • chicken pox水痘
  • chicken out临阵脱逃
  • cock-eyed斜眼的
  • henpeck对丈夫作威作福
  • Which comes first,the chicken or the eggs?
  • better to be the head of duck than the ass of a horse宁为鸡头不为凤尾

dalmatians

Dog, doggie, puppy狗

  • a dog in the manager 鸠占鹊巢
  • an old dog can't learn new tricks
  • Barking dogs seldom bite.会叫的狗不咬人
  • doggy bag剩菜袋
  • dog's life生活艰难
  • dog-eat-dog world
  • dog tired
  • a dog chance极有限的一点希望
  • dog's day很热的日子
  • dog-eared书页的折角
  • dog eat dog无情而野蛮的竞争
  • dog sleep小寐
  • Every dog has its day.狗也有出头的日子
  • Let sleeping dog lie.少惹麻烦
  • Love me ,love my dog.爱屋及乌
  • put on the dog装腔作势
  • red dog beer私家酿酒
  • top dog人上人
  • paparazzi狗仔队
  • bite the hands the feed one
  • You can't make a silk purse out of sow's ear.够最终吐不出象牙

fish

Fish鱼

  • cold fish冷淡的人
  • drink like a fish酗酒
  • There are other fish in the sea天涯何处无芳草

Goat,lamb,sheep,kid羊

 

  • as gentle as a lamb像绵羊一样温和 goat
  • a black sheep害群之马
  • follow like sheep盲目顺从
  • separate the sheep from and goats辨别好人与坏人
  • Lock the stable door after the horse is stolen.亡羊补牢

 

Goose鹅

  • as silly as goose像鹅般蠢 goose
  • Fair for the goose is fair for gander
  • goose bump鸡皮疙瘩
  • goose egg考零分
  • gooseflesh鸡皮疙瘩
  • Kill the goose that lays the golden eggs.杀鸡取卵

 

Hog,pig,swine,sow猪

  • road hog挡道的自私驾驶 hog
  • bleed like a stuck pig大量出血
  • eat like a pig吃的多而且吃相不好
  • make a pig of oneself狼吞虎咽
  • Pig may fly.Or to milk the bull.

Horse,pony马

  • Don't put the cart before the horse.不要本末倒置
  • Don't ride the high horse.不要妄自尊大
  • Every horse thinks its own pack heaviest.
  • It is useless to flog a dead horse.鞭策死马,徒劳无功
  • Lock the stable after the horse has gone.亡羊补牢 horse
  • Don't look a gift horse in the mouth.受赠之马,勿探其齿
  • Zeal without knowledge is runaway horse.
  • Don't change horses in mid-stream.
  • a horse of a different color
  • a dark horse黑马
  • from the horse's mouth第一手消息
  • horses sense常识
  • I can eat a horse.
  • one-horse town小镇
  • You can lead a horse to water,but you can't make him drink.师傅领进门,修行在个人
  • Cruise chicks泡马子
  • All lay loads on a willing horse马善被人骑
  • leapfrog
  • piggyback fight骑马打仗

Lion狮子 lion

  • as brave as a lion像狮子般勇敢
  • That software designer still the lion's share of the market.那位软件设计师人人握有大部分的市场
  • Put one's head into the lion's mouth自愿冒险

Monkey猴子

  • monkey/horse/idle/fool around鬼混
  • monkey business恶作剧 monkey
  • monkey on the back某事已成了负担
  • Monkey see,monkey de.有样学样
  • monkey uncle吃惊

 

Mouse,rat鼠

  • as poor as church mouse
  • rat fink告密者 mouse
  • a rug rat指不会走路的小婴儿
  • I can smell the rat.我觉得事有蹊跷。
  • Rats!胡说八道,该死,可恶

Snake蛇

  • a snake in the grass口蜜腹剑的人
  • Once bitten twice shy.一朝被蛇咬,十年怕井绳。
  • to cherish a snake in one's bosom养护为患
  • crawl蛇行 snake
  • overdo it画蛇添足

Tiger,cub虎

  • ride the tiger骑虎难下
  • the ass in the lions skin狐假虎威
  • How can one get the tiger cubs if one does not enter tiger den?不入虎穴,焉得虎子

 tiger

Other Animal其他

  • as big as a whale
  • as blind as a bat
  • as busy as a bee
  • as pround as peacock
  • as slow as a turtle
  • as slow as a snail
  • as sly as a fox
  • as stupid as a donkey
  • as stubborn as a mule
  • as wise as an owl
  • butterfly effect连锁反应 others
  • to have or get butterfly in one's stomach非常紧张
  • The last straw breaks camel's back.忍无可忍
  • crocodile tears不真诚的同情
  • eat crow不得已认错
  • A deer caught in the headlight.手足无措
  • eagle-eyed眼力好
  • mad as a March hare
  • A leopard can't change his spots.江山易改本性难移。
  • pet peeve不能忍受的事
  • stag party男人的聚会
  • stool pigeon奸细
  • One swallow does not make a summer
  • swan song最后作品
  • white elephant 昂贵而无用的东西。

posted @ 2008-05-15 14:05 qiyadeng 阅读(14991) | 评论 (0)编辑 收藏

  在刚刚结束的的WWW2008的会议中,有篇超短的paper 《Size Matters: Word Count as a Measure of Quality on Wikipedia》,这篇文章针对Wikipedia的质量的评估,提出了一种方法来评估一个Wikipedia文章的质量,这种方法很简单,就是数文章字数(Word Count)。

作者认为这种方法的好处有如下几点:

1.文章的长度很容易测量;

2.许多其他的方法需要一些其他的信息,而这些信息不是很容易得到;

3.许多其他的方式对用户来说不容易理解;

4.文章的长度评估的方法比其他的复杂的方法更有意义。

(说的好像是一点简单^_^)这确实是一种简单的方法,但是效率怎么样?根据作者的实验,这个方法在二个分类(featured and random)的情况下能得到96.3%的准确率。

当然,作者也比较实事求是,也不会夸大这种方法的作用,作者将寻找新的方法来评估Wikipedia文章质量。

除了这篇文章,其实还有其他几种方法,可以参看下面这些论文:

1.Information Quality Discussion in Wikipedia

2.Assessing Information Quality of a Community-Base Encyclopedia

3.Measuring Wikipedia

4.Wikipedia Article Quality Assessment and Ranking Tips for Users and Search Engine Engineers

  这些文章虽然都是关于wiki质量讨论的,但是研究的意义很重大。特别是针对目前网络的信息泛滥的情况下,需要用一种方式来评估信息的有用性,这样可以让我们更轻松找到我们需要的有用信息,同样搜索引擎如果能判断提供给我们的文章的质量好坏,这也就免去了我们很多时间去挑选了。

对于推荐系统(如新闻、文章推荐系统),用户很少评分的情况下,可以采用这种方法自动给项目评分。

posted @ 2008-05-08 13:07 qiyadeng 阅读(1153) | 评论 (0)编辑 收藏

UltraEdit 是每天必用的工具之一.但想想看,实际使用到的功能只是这个工具强大功能的极小的一部分.灵活使用这个工具有的时候能起到事半功倍的效果.记录并收集一些小技巧对自己对别人都有帮助.因为我在使用"列编辑"这样的编辑方式还令我的一个同事看到之后很惊讶,之前他从来不知道有这个用法.这也是写这个备忘文档的目的。

Tip 1: 如何去掉所编辑文本中包含特定字符串的行? 
这则技巧是在UltraEdit的帮助文件里提到.CTRL+R 调出来替换(Replace)窗口,选中"使用正则表达式";然后用查找 %*你的字符串*^p 替换成空内容即可.如,我当前有个文本文件,需要去掉所有包含 http://www.dbanotes.net/ 这个字符串的行,查找%*http://www.dbanotes.net/*^p 替换成空即可.注意,^p 是 DOS 文件类型的换行符.如果是 Unix 类型文件,则用 ^n.

Tip 2: 如何在行末添加特定字符,比如逗号?
有了上面的经验(其实我第一次是从同事那里学到的),CTRL+R 调出来替换(Replace)窗口,选中"使用正则表达式".然后可以查找 ^p(或者^n,如果是Unix 文件),用 ,^p(或者,^n)进行"全部替换"即可.补充一点,如果是 MAC(Apple) 类型文件,则换行符号为 ^r .

Tip 3: 如何删除空行?
参考上面两个例子,查找 ^p$ 然后替换为空即可.

Tip 4: 编辑文件如何加入时间戳 ?
F7 快捷键即可.你试试看?

Tip 5: 为何 拷贝(Copy)/粘贴(Paste)功能不能用了?
不怕大家笑话,我有几次使用 UltraEdit 的过程中发现拷贝与粘贴的内容是不匹配的.不知所以然,干脆重新启动了笔记本.今天翻看手册才恍然大悟:UltraEdit有10个剪切板 (clipboard),分别用Ctrl+0 - Ctrl+9 切换. Ctrl+0 是 Windows 的,其他则为用户自定义的.我在使用的过程中错调用了 CTRL+n, 结果内容就有问题了.你遇到过没?

Tip 6: 即使是打开小文件也有迟延?
这是我遇到过的问题.每次打开文件的时候总有几秒钟的耽搁.我的机器性能可不算差.怎么回事? 网络打印机搞得鬼!
打开"高级"->"设置"->"编辑器"->"高级",看看是不是选中了"载入/恢复打印机设置"?如果是的话,去掉(不同的版本/汉化与否可能该位置所在有差别).

Tip 7:打开*.ec,*.hea文件时代码自动高亮度显示。

    菜单路径:Advanced-Configuration-Syntax Highlighting页下部,选择“Open”按钮打开文件C:\Program Files\UltraEdit\wordfile.txt,修改该文件第一行,在后边的”File Extensions = C CPP CC CXX H HPP AWK”后加上”EC HEA”保存即可。

Tip 8: 把常用的菜单功能做成快捷按钮放在面板上。

    菜单路径:Advanced-Configuration-Toolbar,选中左边喜欢的功能菜单,选中右边的位置,点击Insert即可。比如”Dos to Unix”用于把dos下的回车键去掉,“Compare files”用来比对文件,”Display Ruler”,”Display Line Numbers”,最让人惊喜的居然还有一个”ASCII table”的功能,不用每次查ASCII码的时候都去翻箱倒柜了,呵呵。不过可显示字符的ASCII值可以通过直接查看16进制模式看到,不用这么麻烦。

Tip 9: 列模式(快捷键:Alt+C)
当你需要批量修改数据或者造数据的时候,这个功能显示了强大威力。试试打开一个文件,按下Alt+C,Ctrl+A,开始写字,你会发现文件中所有的行都在执行相同的动作,一排相同的数据就出现了。动动脑筋你会发现各种奇妙的用法。

Tip 10: 做行标记

    移到需要标记的行按下Ctrl+F2,标记好了;走到文件的任意其他行,按F2,回到标记处。可以做多个标记,这时F2在各个标记中循环走动。F2:Next Bookmark,Alt+F2:Previous Bookmark。

Tip 11: 列标志
写后台程序的时候不希望一行写的太长,一般要小于80个字节,但即使显示了标尺也看不大清楚屏幕中下部的行是否已经到了80字节,除非看下部状态条的列号。这时这个东西就起作用了。菜单路径:View-Set Column Markers,可以设置两个列标志,我们先设第一个,在第一个编辑框中填入80,再选择View-Show Column Marker 1,看到了?第80字节的地方出现了一条竖线。

Tip 12: 注释

有时调试程序时需要把连续的多行用“//”注释,然后还要放开注释,一行一行写太土了吧,有现成的东西用。选定要注释的行,Edit-Comment
Add增加注释,Edit-Comment Remove。

Tip 13:编辑

    选定整个单词当然可以用鼠标双击,用键盘Ctrl+J。删除整行Ctrl+E,删除到行首Ctrl+F11,删除到行尾Ctrl+F12。

Tip 14:别让它老问你是否把unix文件转换尾dos文件

到了9.0版本打开unix文件的时候它总是会问是否转换为dos文件,实在很烦。不过可以屏蔽,Advanced-Configuration-General,把右中部的Auto Convert Unix Files点上就好了。

Tip 15:

打开文件内容中的文件 如果文件的内容里面有 "c:\test.txt" 或者"http://www.test.com/js/test.js"
这样的内容你可以把鼠标定位到上面,点右键。弹出的菜单最上边会多个选项 "c:\test.txt" 或者"http://www.test.com/.../test.js"
点击它,打开相应文件。

ctrl+b 写程序的时候,括号一般要一一对应的,但是如果嵌套太多,看花眼了,怎么办?你把光标放在括号开始的地方,按ctrl+b,UE 会帮你找到相对应的括号结尾的地方。你还可以试试连着多按几次ctrl+b。 [Stick Out Tongue]

F3
默认情况下,当你按F3的时候UE可以查找现在选中的内容,F3是下一个符合的内容,ctrl+f3是上一个符合的内容.(请查 看advanced/configuration/Find标签)

ctrl+f2
程序会有很多行你当然可以记得你要到的行数,然后用ctrl+g,然后输入行号,到所在的行。但是用ctrl+f2我觉得更方便。比如说你要频繁在多个function中切换。可以在function开始的地方,按一下ctrl+f2,给这一行加一个书签。然后再另外的function开始的地方,也来一下ctrl+f2,有书签的地方,字的背景色会不同。当你想换到下一个书签的时候,就按f2,但是想到上一个标签怎么办?ctrl+f2?不对,嘿嘿,
再按就是加书签或者取消当前行的书签了。应该是alt +f2.

简单的用正则表达式的查找替换
有时候会有一些简单文本处理的工作。比如你手头有一个文本,需要给所有行后边添加一个";"。用查找替换来完成ctrl +r,查找 '^p' 替换为'^p;',(记得选中regular Expressions,这样才能用正则表达式的功能。)然后你可以选replace all(alt+a),或者点开始,一个一个的查找,替换,这样的好处是知道都替换了那些,有些时候你可能不想全部替换

把类似'{$abc}'替换为'var abc=abc;',abc有可能是其他字符ctrl+r,查找 '{^$^(*^)}' 替换为'var ^1=^1;'(记得选中regular Expressions,这样才能用正则表达式的功能。)然后你可以选replace all(alt+a),或者点开始,一个一个的查找,替换。

自定义快捷键
UE很多功能都有快捷键,但不是所有的都有。11.00有一个Text2html的功能。我工作中遇到了要对大量代码进行这种操 作的情况。我就想自己定一个快捷键。
advanced/configuration/key mapping
在commands 里面找到你要用的command.我这里是HTMLConvertSpecialChars,然后点Pres s new key下面的输入框,设置一个自己觉得爽,不冲突的快捷键。比如ctrl+alt+s.然后点ok.这样用常用的功能,可以成倍 提高效率。

计算选中区域数字的和
比如如下文本
2
23a1
4 1.1
5
6
先选中,然后Column/(sum column/Selection),UE会以空格,字母分割数字,告诉你一个总数

UE的列编辑功能
首先要alt+c,进入列编辑模式。进入后,你可以用鼠标选择一个方形的区域。删除,复制全看你喜欢了。
如果你想在每一行第二个字符开始加入一个'test',在列编辑模式下,定位光标到第一行,第二列。
Column/(Insert/Fill column)
,你还可以用这个功能插入行数。在列编辑状态下的复制粘贴都很有意思,某些情况下可以取得意想不到的效果。

UE的比较
UE内置一个比较功能,可以帮你比较2个文件的不同
file/compare files...
如果你打开了2个要比较的文件,UE会把这2个文件自动填入2个要比较的文件位置,不然,你要用browse功能去找到那2个文件,设置一下text还是bin,是否要ignore一些你不关心的东西。然后点击compare就到比较界面。你可以设置只显示不同或者相同或者都显示。日常的应用是可以了。(有点像BC,不知道谁抄谁的 )

加入当前时间
有时候写代码要注释,比如那天改的,按一下F7试试。

打开的文件中切换
如果打开多个文件,要在多个文件中切换,用鼠标点,麻烦,试一下ctrl+tab。好多多窗口的软件都支持这个功能。

恢复到上次存盘状态
一个文件改动多了,想undo到最初状态,file/revert to saved.

文件备份,重命名
一个文件要备份,你如果选save as了,那当前打开的就是你save as之后的文件了。
用fle/(make copy/backup),你还可以直接重命名当前编辑的文件 file/Rename file

UE的project功能

11.00以后有了一个自动打开上次关闭时打开着的文件这个功能了,以前好像没有。这就可以用到Project功能。其实就是定 义一组相关的文件。project/(new project/workspace)               UE会要求你存一个*.prj的文件。下次你可以打开UE的时候,project/(o pen project/workspace),继续上次的那个project的session工作。也可以file/(recent project/workspace)

UE的function列表功能
打开一个程序文件,比如*.js,确保view/view as(*)/Javascript。选择view/(view/lists)/function list.也可以用F8

大块代码缩进的调整
选中要调整的代码块 按tab,进行缩进,你再按一下shift+tab。效果咋样?

UE的右键功能
1)去处行末的空格
选中要去空格的区域。点右键/format/menu../trim trailing spaces
2)删除整行
定位光标要删除的行。点右键/delete/delete line,(也可以用ctrl+e)
3)给代码加注释
首先要确定选中了正确的语法加亮显示 view/view as(*)/Javascript   然后选中要注释的部分
点右键/delete/comment add 或者comment remove
4)格式化代码
首先要确定选中了正确的语法加亮显示 view/view as(*)/Javascript
然后选中要格式化的部分,就是让代码的缩进好看点,点右键/format menu/reIndent selection
不过,如果你的代码是一行,没有按照句子分号。好像没啥效果。

5)复制当前编辑文件的路径如果你要把当前文件作其他处理,需要这个文件的路径,这个
功能可以不用再去敲路径点右键 copy file path/name
6)复制当前编辑文件的路径::点右键copy file path/name
7)打开文件内容中的文件: 如果文件的内容里面有"c:test.txt" 或者"http://www.test.com/js/test.js"
这样的内容。你可以把鼠标定位到上面,点右键。弹出的菜单最上边会多个选项
"c:test.txt" 或者"http://www.test.com/.../test.js",点击它,打开相应文件。

调整,添加语法高亮显示
advanced/configuration/syntax Highlighting 点击下边的full path name for word list后边的open
打开的文件如:d:Program FilesUltraEditWORDFILE.TXT,就是UE语法高亮显示的配置文件
/L1"C/C++" 就是第一种语言,/L2就是第二种。目前这些word files 可以从下面连接下载到
http://www.ultraedit.com/index.php?...id=40#wordfiles
用的时候,下载相应的word file,复制出来,粘贴到d:Program Files\UltraEdit\WORDFILE.TXT,注意修改刚开始的/L1和你现有系统匹配。好像对xml.xsl的显示不是很好,不够准确

运行dos命令,直接得到结果
F9,会跳出来一个窗口,让你输入命令和工作目录。比如 dir c: 会列出来c盘的目录。如果你要给朋友发目录列表,除了从dos窗口复制过来,还可以用这个简单的方法。加上一下简单的列编辑。结 果就更好看了。

内置的ascii table
view/ascii table
有时候需要知道某个字母的ascii值,从这里就能查出来
!是33
A是65
。。。

内置的多个剪贴板 你点右键可以看到
clipboards,里面内置了10个剪贴板。按说windows的copy只能复制一个内容。如果你要复制多个内容,跟据不 同的情况进行粘贴,这10个剪贴板,应该够你用了。ctrl+0-9的数字键,是在剪贴板之间切换。比如 ctrl+1,然后copy了内容"a";ctrl+2,然后copy了内容"b" 你如果想paste a,就要先按1下ctrl+1再ctrl+v,要paste
b,就按一下ctrl+2再 ctrl+v。我有时候不小心更换了剪贴板,就奇怪从别的地方复制的东西粘贴不过来。这种情况要注意。

posted @ 2008-05-05 19:08 qiyadeng 阅读(3293) | 评论 (0)编辑 收藏

数据挖掘中的任务大致包括以下几个方面:

1、分类:通过一个带有类标记的训练数据集,建立一个分类模型,通过对一系列属性的考察,可以对对象的类型进行预测,这是有监督的学习;
2、估计,例如:分析消费模型,估计个人收入和孩子数目;
3、预言,例如:根据个人教育、当前工作、行业趋势、预言2009年的工资;
4、密切性发掘,例如:关联规则发掘和相关性分析
5、聚集:主要针对没有类标记的数据,建立一个归类模型,让同一类的对象有尽量大的相似性,不同类的对象有尽量大的差异,这是无监督的学习;
6、偏差分析
7、异常检测:发现不同于正常模式的数据,多用于风险规避、入侵检测。
(关于监督学习和非监督学习,请查看Machine Learning, Part I: Supervised and Unsupervised Learning或是译文)

数据挖掘中的步骤为:

1、数据规范化(消除错误和不一致的数据)和集成(从不同数据源提取数据);
2、数据选择和变换(提取任务相关数据,根据需要转换成统一的、适合挖掘的形式);
3、数据挖掘(使用合适的算法,在有效的时间内完成);
4、模式评估(根据某种兴趣度量,识别表示知识的真正有趣的模式);
5、数据挖掘结论的表示(使用可视化和知识表示技术,向用户提供挖掘的知识)

posted @ 2008-03-25 15:46 qiyadeng 阅读(1105) | 评论 (0)编辑 收藏

<?xml version="1.0" encoding="ISO-8859-1" ?>
<gui-definition>
  <colors>
    <background>#808080</background>
    <text>#000000</text>
    <header>#008000</header>
    <link normal="#000080" visited="#800080"/>
    <default>${colors.header}</default>
  </colors>
  <rowsPerPage>15</rowsPerPage>
  <buttons>
    <name>OK,Cancel,Help</name>
  </buttons>
  <numberFormat pattern="###\,###.##"/>
</gui-definition>
以上是个很简单的XML,首先肯定是把这个文件载入(就把上面这个文件命名为table.xml吧)
try
{
    XMLConfiguration config = new XMLConfiguration("tables.xml");
    // do something with config
}
catch(ConfigurationException cex)
{
    // something went wrong, e.g. the file was not found
}
如果导入的时候没有异常的话,config对象就可以使用了,读取的方法如下:
String backColor = config.getString("colors.background");
String textColor = config.getString("colors.text");
String linkNormal = config.getString("colors.link[@normal]");
String defColor = config.getString("colors.default");
int rowsPerPage = config.getInt("rowsPerPage");
List buttons = config.getList("buttons.name");
下面说明下需要注意的几个地方:
1.首先根元素是被忽略的,在上面的例子中不是写gui-definition.colors.text,而是写成colors.text。
2.使用“.”符号访问子元素。在上面的例子中访问<colors>元素中的<text>,对应的key是colors.text。
3.访问元素属性的方法类似XPath的方法。
4.返回的是list的元素,可以用getList()方法。就像上面例子中的buttons.name的内容是"OK,Cancel,Help",用getList()
方法返回的是3个元素组成的List。这里的分隔符是“,”,可以通过setDefaultDelimiter()方法进行指定。
5.可以操作propertiesConfiguration,就像是例子中的<default>元素。
上面是个最简单的XML格式,但是还有些相对复杂的XML,如下:
<?xml version="1.0" encoding="ISO-8859-1" ?>

<database>
  <tables>
    <table tableType="system">
      <name>users</name>
      <fields>
        <field>
          <name>uid</name>
          <type>long</type>
        </field>
        <field>
          <name>uname</name>
          <type>java.lang.String</type>
        </field>
        <field>
          <name>firstName</name>
          <type>java.lang.String</type>
        </field>
        <field>
          <name>lastName</name>
          <type>java.lang.String</type>
        </field>
        <field>
          <name>email</name>
          <type>java.lang.String</type>
        </field>
      </fields>
    </table>
    <table tableType="application">
      <name>documents</name>
      <fields>
        <field>
          <name>docid</name>
          <type>long</type>
        </field>
        <field>
          <name>name</name>
          <type>java.lang.String</type>
        </field>
        <field>
          <name>creationDate</name>
          <type>java.util.Date</type>
        </field>
        <field>
          <name>authorID</name>
          <type>long</type>
        </field>
        <field>
          <name>version</name>
          <type>int</type>
        </field>
      </fields>
    </table>
  </tables>
</database>
像上面例子中用tables.table.name key去取得表格的名字,返回的是什么类型呢?因为tables.table.name中的table和name
有两个地方都出现了。其实返回的是个Collection,
Object prop = config.getProperty("tables.table.name");
if(prop instanceof Collection)
{
	System.out.println("Number of tables: " + ((Collection) prop).size());
}
其实也可以用getList()方法来操作,这里如果你只想得到第一个tables.table.name,需要使用getString()方法就可以了。
还有另外一个问题我们可以用getList()方法取到tables.table.fields.field.name,但是其实这些filed.name并不是属于同
一个table,这样的话,就需要使用如下的方法:
List fields = config.configurationsAt("tables.table(0).fields.field");
for(Iterator it = fields.iterator(); it.hasNext();)
{
    HierarchicalConfiguration sub = (HierarchicalConfiguration) it.next();
    // sub contains now all data about a single field
    String fieldName = sub.getString("name");
    String fieldType = sub.getString("type");
    ...

第一行中是使用configurationsAt的方法是为了,省略在下面子元素前全路径。在实际应用中可能不一定会直接指定table(0),这可以结合上面的Object prop = config.getProperty("tables.table.name")进行迭代。

posted @ 2008-03-20 12:06 qiyadeng 阅读(3613) | 评论 (1)编辑 收藏

仅列出标题
共9页: 上一页 1 2 3 4 5 6 7 8 9 下一页