5.27.2008

来自 梁晓声 的博客----地质局长和一顶帐篷

来自 梁晓声 的博客----地质局长和一顶帐篷
地质局长和一顶帐篷

二十五六年前,我曾改写过一部上下两集的电视剧本《荒原》,内容反映的是两名年轻的地质工作者艰苦的野外工作--它由中央电视台影视部直接组稿,形成初稿以后,请我再给“影视化”一下。导演叫黄群学,我的一位后来在广告拍摄业很有成就的朋友。而女主角,则是当年因主演电视连续剧《外来妹》而深受电视观众喜爱的陈小艺。

《荒原》是在甘肃省境内拍摄的。

剧名既然叫《荒原》,所选当然是很荒凉的外景地。它的拍摄,受到了从地质部到甘肃省地质局的热情支持。

地质局长专程从某驻扎野外的地质队赶回兰州接见了摄制组的主创人员,亲切地对他们说--你们就把地质局当成自己的家吧!遇到什么困难,只管开口。地质局能直接帮助你们解决的,我们义不容辞。不能直接帮助你们解决的,我们一定替你们尽力协调,争取顺利和方便。  

这位地质局的局长,亦或副局长,给摄制组的主创人员们留下了很深的印象。  

导演黄群学在长途电话里向我大谈他们的好印象,而我忍不住问:“简短点儿,概括一下,那局长究竟是一个怎样的人?”   

导演说:“真诚。一个真诚的人!还是一个特别注意细节的人。”   

我在电话这一端笑了,说你的话像剧本台词啊!一个人真诚不真诚,不能仅凭初步印象得出结论;一个人是否特别注意细节,那也要由具体的例子来证明。  

导演在电话那一端说:他们将需要向地质局租借的东西列了一份清单。那位局长当着他们的面让秘书立刻找出来,亲自过目。清单上所列的东西中,包括一台发报机、一套野外炊具、几身地质工作服、一盏马灯、地质劳动工具和一顶帐篷等。  

局长边看边说:“这些东西,都是我们地质局有的,完全可以无偿提供给同志们。省下点儿钱用在保证艺术质量方面,不是更好吗?为什么只列了一盏马灯呢?玻璃罩子的东西,一不小心就容易碰坏。一旦坏了,那不就得派人驱车赶回兰州来再取一盏吗?耽误时间、分散精力、浪费汽油,还会影响你们的拍摄情绪,是不是呢,同志们?有备无患,我们为你们提供两盏马灯吧。再为你们无偿提供柴油。你们只不过是拍电影,不是真正的野外驻扎,无须多少柴油燃料,对吧?至于发报机,就不必借用一台真正能用的了吧?我们为你们提供一台报废的行不行?反正你们也不是真的用来发报,是吧同志们?能用的万一搞得不能用了,不是就造成不必要的损失了吗?现在已经是十一月份了,西部地区的野外很寒冷了。你们还要在野外的夜间拍摄,一顶单帐篷不行。帐篷也可以无偿借给你们,但应该改为一顶棉帐篷。你们在野外拍摄时冷了,可以在棉帐篷里暖和暖和嘛……”   

于是那位地质局的局长,亲自动笔,将他认为应该无偿提供的东西,都一概批为无偿提供了。  

一位在场的处长低声对局长说:后勤仓库里只剩一顶帐篷了,而且是崭新的,还没用过的--那样子,分明是有点儿舍不得。  

局长沉吟片刻,以决定的口吻说:“崭新的帐篷那也要有人来开始用它。就让摄制组的同志们成为开始用它的人吧!”   ……   

听了导演在电话那一端告诉的情况,我对甘肃省地质局的局长,也顿时心生出一片感激了。  

之后,在整个野外拍摄过程中,那一顶由地质局长特批的崭新的棉帐篷,在西部地区的野外,确确实实起到了为摄制组遮挡寒冷保障温暖的不可替代的作用。  

但也正是因为那一顶崭新的棉帐篷,导演黄群学受到了甘肃省地质局长的批评。而我,是间接受教育的人--剧中有一段很重要的情节,就是帐篷失火了,在夜里被烧成了一堆灰烬。制片人员的拍摄计划表考虑得很合理,安排那一场戏在最后一天夜里拍摄。拍毕,全组当夜返回兰州。  

拍摄顺利,导演兴奋,全组愉快。  

导演忍不住给局长拨通电话,预报讯息。  

不料局长一听就急了,在电话里断然地说:“那一顶帐篷绝对不允许烧掉!我想一定还有另外的办法可以避免一顶只不过才用了半个多月的帐篷被一把火烧掉。”   

导演说那是根本没有别的办法可想的事。因为帐篷失火那一场戏,如果不拍,全剧在情节上就没法成立了。  

导演还说:“我们已经预留了一笔资金,足够补偿地质局一顶棉帐篷的损失。”   

局长却说:“不是钱不钱的问题,是另外的办法究竟想过没想过的问题。”   

最后,局长紧急约见导演。   

导演赶回兰州前,又与在北京的我通了一次电话,发愁地说:“如果就是不允许烧帐篷,那可怎么办?那可怎么办?”   

我说:“我也没办法啊!那么现在你对这个人有何感想了呀?”

  导演说:“难以理解。说不定我此一去,就会因一顶帐篷和他闹僵了。反正帐篷是必须烧的,这一点我是没法不坚持到底的。”   

然而,导演并没有和局长闹僵,他反而又一次被局长感动了。  

局长对导演的态度依然真诚又亲切。  

在局长简陋的办公室里,局长说出了如下一番话:“我相信你们已经预留了一笔资金,足够补偿地质局的一顶新帐篷被一把火烧掉的损失。此前我没看过剧本,替剧组预先考虑得不周到,使你们的拍摄遇到难题了,我向你们道歉。但是和你通话以后,我将剧本读了一遍。烧帐篷的情节不是发生在夜晚吗?既然是在夜晚,那么烧掉的究竟是一顶什么样的帐篷,其实从电视里是看不出来的。为什么不可以用一顶旧帐篷代替一顶新帐篷呢?”   

导演嘟哝:“看不出来是看不出来,用一顶旧帐篷代替一顶新帐篷当然可以。但,临时上哪儿去找到一顶烧了也不至于令您心疼的旧帐篷呢?找到它需要多少天呢?我们剧组不能在野外干等着啊!……”   

局长说:“放下你们的剧本,我就开始亲自打电话联系。现在,一顶一把火烧了也不至于让人心疼的旧帐篷已经找到了,就在离你们的外景地不远的一支地质队的仓库里。我嘱咐他们:将破了的地方尽快修补好,及时给你们摄制组送过去,保证不会耽误你们拍摄今天夜里的戏……”   

这是导演没有料到的,他怔怔地望着地质局长,一时不知说什么好。  

局长又说出一番话是--我们地质工作者的职业性质决定了我们不是物质产品的直接生产者。我们在野外工作时,所用一切东西,无一不是别人生产出来的。他们保障了我们从事野外工作的必备条件,直接改善了我们所经常面临的艰苦环境,这就使我们对于一切物质产品养成了特别珍惜的习惯。你们也可以想象,在野外,有时一根火柴,一节电池,一双鞋垫都是宝贵的。何况,我们是身在西部的地质工作者,西部的老百姓,太穷,太苦了啊!你们若烧掉一顶好端端的帐篷,跟直接烧钱有什么两样呢?那笔钱,等于是一户贫穷的西部人家一年的生活费还绰绰有余。这笔钱由你们节省下来了,不是可以在别的一方面的社会经济中,起到更有意义和价值的作用吗?我们中国目前还是一个经济欠发达的国家。我们中国人应该长期树立这样的一种意识--物质之物一旦成为了生产品,那就一定要物尽其用。不要轻易一把火把它烧掉了。而我们中国人做事情,尤其是做文化之事的时候,能省一笔钱那就一定要省一笔钱。中国的文化之事,理应启示我们中国人--对于中国,物质的浪费现象是罪过的……  

当导演后来在电话里将地质局长的话复述给我听时,远在北京的我,握着话筒,心生出种种感慨。  

感慨之一那就是--中国委实需要一大批像那位地质局长一样的人民公仆。  

而那一位当年的地质局长,便是我们中国现在的国家总理,温家宝。

5.25.2008

Linux下的Voip电话

Linphone使用了很久了,可以支持voipdiscount什么的,效果也不错。
在新版的Ubuntu Hardy里面的的Linphone会crash,我下载了新版的linphone,
编译时注意:
You must install libsdl and libgtk >2.0.0 and libavcodec
With ubuntu it's easy:
sudo apt-get install libgtk2.0-dev libsdl1.2-dev libavcodec-dev

5.21.2008

Swing感官切换

在默认的情况下,Swing 程序使用Metal观感,可以采用两种方法改变观感。

第一种方式是在Java的安装的子目录下jre / lib有一个文件swing.properties。在这个文件中,将属性Swing.defaultlaf设置为所希望的观感类名。例如:

swing.defaultlaf = com.sun.java.swing.plaf.motif.MotifLookAndFeel

ps:第一中方式我怎么也没找到那个swing.properties,不知大家的如何?

注意,Metal观感位于Javax.swing包中。其他的观感包位于com.sun.java包中,并且不是在每个Java实现中都提供。现在,鉴于版权的原因,Windows 和Mac 的观感包只与Windows和Mac版本的java运行环境一起发布。

提示:下面给出一个测试很有帮助的的建议。由于属性文件中的以#字符开始的行被忽略,所以,可以在swing.properties文件中提供几种观感,并同过增删#字符来切换选择:

#swing.defaultlaf = javax.swing.plaf.metal.MetalLookAndFeel

swing.defaultlaf = com.sun.java.swing.plaf.motif.MotifLookAndFeel

#swing.defaultlaf = com.sun.java.swing.plaf.windows.WindowsLookAndFeel

采用这种方式开启观感时必须重新启动程序。Swing程序只在启动时读取一次swing.properties文件。

第二种方式是动态地改变观感。这需要调用静态的UIManager.setLookAndFeel方法,并提供所想要的观感类名,然后再调用静态方法 SwingUtilities.updateComponentTreeUI来刷新全部的组件集。这里需要向这个方法提供一个组件,并由此找到其他的所有组件。当UIManager.setLookAndFeel方法没有找到所希望的观感或在加载过程中出现错误时,将会抛出异常。

下面是一个例子,他显示了如何在程序中切换观感的方式。在这个程序中,这有点需要注意的地方。在内部动作监听器类的actionPerformed方法中,需要将一个外部的PalfPanel类的this引用传递给updateComponentTreeUI方法。
java 代码

1. import java.awt.*;
2. import java.awt.event.*;
3. import javax.swing.*;
4.
5.
6. public class PlafTest {
7.
8. public static void main(String[] args) {
9. // TODO Auto-generated method stub
10. PlafFrame frame = new PlafFrame();
11. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
12. frame.setVisible(true);
13.
14. }
15. }
16.
17. //A Frae with a button panel for chaing look and fell
18. class PlafFrame extends JFrame {
19.
20. public static final int DEFAULT_WIDTH = 300;
21. public static final int DEFAULT_HEITHT =200;
22.
23. public PlafFrame(){
24.
25. setTitle("PlaF Test");
26. setBounds(350,250,DEFAULT_WIDTH,DEFAULT_HEITHT);
27. PlafPanel panel = new PlafPanel();
28. add(panel);
29. }
30.
31. }
32.
33. //A panel with buttons to change the pluggable look and fell
34.
35. class PlafPanel extends JPanel {
36. public PlafPanel(){
37. UIManager.LookAndFeelInfo[] infos = UIManager.getInstalledLookAndFeels();
38. for(UIManager.LookAndFeelInfo info : infos)
39. makeButton(info.getName(),info.getClassName());
40.
41.
42. }
43.
44. void makeButton(String name,final String plafName){
45.
46. //add button to panel
47.
48. JButton button = new JButton(name);
49. add(button);
50.
51. //set button action
52.
53. button.addActionListener(new
54. ActionListener(){
55. public void actionPerformed(ActionEvent event){
56.
57. //button action :switch to the new look and feel
58. try{
59. UIManager.setLookAndFeel(plafName);
60. SwingUtilities.updateComponentTreeUI(PlafPanel.this);
61.
62. }
63. catch(Exception e){e.printStackTrace();}
64.
65. }
66.
67. });
68. }
69.
70.
71. }

柳宗元 《《蝜蝂传》》

蝜蝂者蝜蝂:读音fù、bàn,一种黑色小虫,善负小虫也,善负小虫也。行遇物,辄持取。卬其首负之卬áng。昂。背愈重,虽困剧不止也。其背甚涩,物积因不散,卒踬仆不能起踬:读音zhì,被东西拌倒。人或怜之,为去其负。苟能行,又持取如故。又好上高,极其力不止,至坠地死。
今世之嗜取者,遇货不避,以厚其室,不知为己累也,唯恐其不积。及其怠而踬也,黜弃之,迁徙之,亦已病矣。苟能起,又不艾,日思高其位、大其禄,而贪取滋甚,以近于危坠,观前之死亡不知戒。虽其形魁然大者也,其名,人也,而智则小虫也。亦足哀夫!
翻译:蝜蝂,是喜欢背东西的小虫。行走中遇到东西,就拿起来。昂着头背起它。背上越来越重,虽然累的厉害还不停止。它的背部很粗糙,东西因此积累不散落,终于跌倒起不来。有的人怜悯它,帮它拿掉东西。一旦能够走动,又像原来一样拿来背上。还喜欢爬高,不到力气用到极限不停止,直到坠地而死。
当今的嗜好掠取的人,遇到财物不会回避,拿来增加自己家产,不知道成为自己的负担了,惟恐钱财没有积累。等到疲倦摔跟头时,被贬斥抛弃了,被贬而迁居了,也已经一蹶不振的了。一旦能够翻身,又不停,天天想着升官、得到更多的俸禄,从而贪念和掠取更加滋生更加疯狂,到接近于危机和崩溃,看到前面因此而死去的而放逐的却不知道有所警戒。虽然他们的形体魁梧高大,他们的名称,是人,但是智力却是小虫的智力啊。也是值得悲哀的啊!

5.20.2008

Hibernate学习转载

其实Hibernate本身是个独立的框架,它不需要任何web server或application server的支持。然而,大多数的Hibernate入门介绍都加入了很多非Hibernate的东西,比如: Tomcat, Eclipse, Log4J,Struts, XDoclet, 甚至JBoss。这容易让人产生Hibernate复杂难懂的误解,特别是打击了初学者的积极性。

在这篇文章将不涉及Eclipse, log4j, Struts, Tomcat, XDoclet,和JBoss。本文的目的是演示一下Hibernate的安装过程以及最基本的功能,从而给初学者一个低得不能再低的入门门槛。


下载文件

你需要Java SDK、 Hibernate包、Ant包、和JDBC Driver。

1、Hibernate包下载地址:
http://prdownloads.sourceforge.net/hibernate/?sort_by=date&sort=desc

2、Ant包下载地址:
http://apache.130th.net/ant/binaries/apache-ant-1.6.1-bin.zip

3、JDBC Driver要根据你用的database来定,一般database官方网站上都会有。Hibernate支持常用的database,比如 MySQL, Oracle, PostgreSQL, 和MS-SQL Server。这些数据库都有JDBC Driver:

Oracle JDBC Driver下载地址(下载前必须同意Oracle协议书)
http://otn.oracle.com/software/htdocs/distlic.html?/software/tech/java/sqlj_jdbc/htdocs/jdbc9201.html

MySQL JDBC Driver下载地址
http://dev.mysql.com/downloads/connector/j/3.0.html

PostgreSQL JDBC Driver下载地址
http://jdbc.postgresql.org/download.html

MS-SQL Server JDBC Driver下载地址
http://www.microsoft.com/downloads/details.aspx?FamilyID=9f1874b6-f8e1-4bd6-947c-0fc5bf05bf71&displaylang=en

4、将Hibernate包和Ant包分别解压至c:\dev\下(此目录不重要,你可以换其它任何目录)。


配置环境

1、你需要添加一个新的环境变量: ANT_HOME,让它指向c:\dev\<你的ANT包所在目录>。并在PATH环境变量里添加%ANT_HOME%\bin。

2、你需要添加一个新的环境变量: JAVA_HOME,让它指向你的j2sdk根目录。并在PATH环境变量里添加%JAVA_HOME%\bin。

3、创建一个项目目录,比如c:\workspace\My1stHibernate。

在项目目录下,另外创建三个目录: src, classes, lib。

在lib目录下,创建两个目录: hibernate和db。

这样你有了如下的文件结构:

c:\workspace\My1stHibernate\
c:\workspace\My1stHibernate\src
c:\workspace\My1stHibernate\classes
c:\workspace\My1stHibernate\lib
c:\workspace\My1stHibernate\lib\hibernate
c:\workspace\My1stHibernate\lib\db

4、将c:\dev\<你的Hibernate包所在目录>\hibernate2.jar文件copy到c:\workspace\My1stHibernate\lib\hibernate下。

将c:\dev\<你的Hibernate包所在目录>\lib\下的所有文件同样copy到c:\workspace\My1stHibernate\lib\hibernate下。

将你的JDBC Driver文件(一般是一个jar文件)copy到c:\workspace\My1stHibernate\lib\db下。


创建数据库

1、用你最喜爱的database软件,创建一个hibernate_test的数据库。

2、在此数据库下,新建一个table名为CUSTOMER

CREATE TABLE CUSTOMER
(
CID INTEGER NOT NULL PRIMARY KEY,
USERNAME VARCHAR(12) NOT NULL,
PASSWORD VARCHAR(12)
);


编写Java文件

public class Customer {

private int id;
private String username;
private String password;


public int getId() {
return id;
}

public String getPassword() {
return password;
}

public String getUsername() {
return username;
}

public void setId(int id) {
this.id = id;
}

public void setPassword(String password) {
this.password = password;
}

public void setUsername(String username) {
this.username = username;
}

}

将此类存为c:\workspace\My1stHibernate\src\Customer.java文件。

编写Test类

import net.sf.hibernate.*;
import net.sf.hibernate.cfg.*;

public class Test {

public static void main(String[] args) {

try {
SessionFactory sf =
new Configuration().configure().buildSessionFactory();
Session session = sf.openSession();
Transaction tx = session.beginTransaction();

for (int i = 0; i < 200; i++) {
Customer customer = new Customer();
customer.setUsername("customer" + i);
customer.setPassword("customer");
session.save(customer);
}

tx.commit();
session.close();

} catch (HibernateException e) {
e.printStackTrace();
}
}
}

将此类存为c:\workspace\My1stHibernate\src\Test.java文件。


创建Hibernate映射文件

因为这里只有一个Class --- Customer 和一个Table --- CUSTOMER,你只需要建立一个映射文件--- Customer.hbm.xml,来对应Customer类和CUSTOMER表之间的关系。


"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">











把此文件存为c:\workspace\My1stHibernate\src\Customer.hbm.xml,和Customer.java放在同一目录下。


编写Ant build.xml文件

你不一定要知道这个build.xml的细节,其实Ant也不是Hibernate所必须的。这里用Ant是为了简化一些任务,比如: 编译、copy、运行,等。











































配置Hibernate描述文件

Hibernate描述文件可以是一个properties或xml 文件,其中最重要的是定义数据库的连接。我这里列出的是一个XML格式的hibernate.cfg.xml描述文件。


PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">





true

oracle.jdbc.driver.OracleDriver


jdbc:oracle:oci8:@hibernate_test


你的数据库用户名


你的数据库密码


net.sf.hibernate.dialect.Oracle9Dialect








如果你用的不是Oracle 9i,可到C:\dev\<你的Hibernate包所在目录>\src\hibernate.properties文件里找到你的数据库,然后替换以上相对应的值。


开始运行

到c:\workspace\My1stHibernate下,运行ant run。如果你严格依照以上步骤,应该看到

run:
[java] log4j:WARN No appenders could be found for logger (net.sf.hibernate.cfg.Environment).
[java] log4j:WARN Please initialize the log4j system properly.
[java] Hibernate: insert into CUSTOMER (USERNAME, PASSWORD, CID) values (?, ?, ?)
BUILD SUCCESSFUL

到你的hibernate_test数据库看一下,在CUSTMOR表里新添了200条记录,但你没有写任何JDBC code。
以后如果你要更换数据库,只需要改变hibernate.cfg.xml描述文件里相应的值即可。


结论

此文是一篇门槛极低的入门介绍。我给一个完全不懂Hibernate的朋友看,他用了不到30分钟就运行了他的第一个Hibernate程序,从此引起了他对Hibernate的兴趣。但读者必须认识到这只是一个开始,此文实乃窥Hibernate冰山一角上的一颗小冰晶。千里之行始于足下,你可以把此文当作迈向Hibernate大道的一个起点。

“不抛弃!不放弃!”

看完地震的报道,总是忍不住流泪,可是还是忍不住查找新的消息。
远在异乡,不知能尽什么心意。
希望我们的祖国更强大,祝福所有国人,都能共度难关。

5.19.2008

版面管理器

版面管理器

++ Swing读书笔记

1-3:版面管理器(Layout Menager)
|BorderLayout
|FlowLayout
|GridLayout
AWT----|CardLayout
|GridBagLayout

Swing--|BoxLayout
1-3-1:BorderLayout的使用:
BorderLayout的类层次结构图:
java.lang.Object
--java.awt.BorderLayout
构造函数:BorderLayout()建立一个没有间距的border layout
BorderLayout(int hgap,int vgap)建立一个组件间有间距的border layout
BorderLayout将版面划分为东、西、南、北、中
例子:BorderLayoutDemo.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class BorderLayoutDemo{
public BorderLayoutDemo(){
JFrame f=new JFrame();
Container contentPane=f.getContentPane();
contentPane.setLayout(new BorderLayout());
contentPane.add(new JButton("EAST"),BorderLayout.EAST);
contentPane.add(new JButton("WEST"),BorderLayout.WEST);
contentPane.add(new JButton("SOUTH"),BorderLayout.SOUTH);
contentPane.add(new JButton("NORTH"),BorderLayout.NORTH);
contentPane.add(new JLabel("CENTER",JLabel.CENTER),BorderLayout.CENTER);
f.setTitle("BorderLayout");
f.pack();
f.setVisible(true);
/***read**/
/*处理关闭窗口的操作,若你没写这一段,就算你已经关闭窗口了,但程序并不会终止。
*/
f.addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
);
/***read**/
}
public static void main(String[] args){
BorderLayoutDemo b=new BorderLayoutDemo();
}
}
设置组件的间距,你可以使用有间距参数的BorderLayout构造函数,也可以利用BorderLayout的setHgap(int hgap)与
setVgap(int vgap)两个方法来达成。
1-3-2:FlowLayout的使用:
FlowLayout的类层次结构图:
java.lang.Object
--java.awt.FlowLayout
构造函数:FlowLayout()建立一个新的Flow Layout,此FlowLayout默认值是居中对齐,组件彼此有5单位的水平与垂直间距。
FlowLayout(int align)建立一个新的Flow Layout,此FlowLayout可设置排列方式,组件彼此有5单位的水平与垂直
间距。
FlowLayout(int align,int hgap,int vgap)建立一个新的Flow Layout,此FlowLayout可设置排列方式与组件间距。
FlowLayoutDemo.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class FlowLayoutDemo{
public FlowLayoutDemo(){
JFrame f=new JFrame();
Container contentPane=f.getContentPane();
/*你可以使用有间距的FlowLayout构造函数,使FlowLayout的排列具有间距,并
*并可利用排列方向参数来指定靠什么方向排列,FlowLayout共有五种排列方式,
*依次是CENTER(默认值),LEFT,RIGHT,LEADING,TRAILING,若我们将下面程序第13
*行改成contentPane.setLayout(new FlowLayout(FlowLayout.LEFT));
*/
contentPane.setLayout(new FlowLayout());
contentPane.add(new JButton("first"));
contentPane.add(new JButton("second"));
contentPane.add(new JButton("third"));
contentPane.add(new JButton("fourth"));
contentPane.add(new JButton("fifth"));
contentPane.add(new JButton("Last"));

f.setTitle("FlowLayout");
//f.pack();//必须将f.pach()去掉,否则setSize功能将没有作用
f.setSize(400,220);
f.setVisible(true);
f.addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
);
}
public static void main(String[] args){
FlowLayoutDemo b=new FlowLayoutDemo();
}
}
1-3-3:GridLayout的使用:
GridLayout的类层次结构图:
java.lang.Object
--java.awt.GridLayout
GridLayout比FlowLayout多了行和列的设置,也就是说你要先设置GridLayout共有几行几列,就如同二维平面一般,然后你加
进去的组件会先填第一行的格子,然后再从第二行开始填,依此类扒,就像是一个个的格子一般。而且GridLayout会将所填进去组
件的大小设为一样。
构造函数:GridLayout()建立一个新的GridLayout,默认值是1行1列。
GridLayout(int rows,int cols)建立一个几行几列的GridLayout.
GridLayout(int rows,int cols, int hgap,int vgap)建立一个几行几列的GridLayout,并设置组件的间距。
例子:GridLayoutDemo.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class CardLayoutDemo implements ActionListener{
JPanel p1,p2,p3,p4;
int i=1;
JFrame f;
public CardLayoutDemo(){
f=new JFrame();//当做top-level组件
Container contentPane=f.getContentPane();
contentPane.setLayout(new GridLayout(2,1));

p1=new JPanel();
Button b=new Button("Change Card");
b.addActionListener(this);//当按下"Change Card"时,进行事件监听,将会有系统操作产生。
p1.add(b); //处理操作在52-64行.
contentPane.add(p1);

p2=new JPanel();
p2.setLayout(new FlowLayout());
p2.add(new JButton("first"));
p2.add(new JButton("second"));
p2.add(new JButton("third"));

p3=new JPanel();
p3.setLayout(new GridLayout(3,1));
p3.add(new JButton("fourth"));
p3.add(new JButton("fifth"));
p3.add(new JButton("This is the last button"));

p4=new JPanel();
p4.setLayout(new CardLayout());
p4.add("one",p2);
p4.add("two",p3);
/*要显示CardLayout的卡片,除了用show(Container parent,String name)这个方法外
*,也可试试first(Container),next(Container),previous(Container),last(Container)这
*四个方法,一样可以达到显示效果。
*/
((CardLayout)p4.getLayout()).show(p4,"one");

contentPane.add(p4);

f.setTitle("CardLayout");
f.pack();
f.setVisible(true);

f.addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
);

}
public void actionPerformed(ActionEvent event){
switch(i){
case 1:
((CardLayout)p4.getLayout()).show(p4,"two");
break;
case 2:
((CardLayout)p4.getLayout()).show(p4,"one");
break;
}
i++;
if (i==3) i=1;
f.validate();
}
public static void main(String[] args){
new CardLayoutDemo();
}
}
1-3-5:GridBagLayout的使用:是java中最有弹性但也是最复杂的一种版面管理器。它只有一种构造函数,但必须配合
GridBagConstraints才能达到设置的效果。
GridBagLayout的类层次结构图:
java.lang.Object
--java.awt.GridBagLayout
构造函数:
GirdBagLayout()建立一个新的GridBagLayout管理器。
GridBagConstraints()建立一个新的GridBagConstraints对象。
GridBagConstraints(int gridx,int gridy,int gridwidth,int gridheight,double weightx,double weighty,
int anchor,int fill, Insets insets,int ipadx,int ipady)建立一个新的GridBagConstraints对象
,并指定其参数的值。
参数说明:
gridx,gridy:设置组件的位置,gridx设置为GridBagConstraints.RELATIVE代表此组件位于之前所加入组件的右边。
若将gridy设置为GridBagConstraints.RELATIVE代表此组件位于以前所加入组件的下面。建议定义出
gridx,gridy的位置,以便以后维护程序。表示放在几行几列,gridx=0,gridy=0时放在0行0列。

gridwidth,gridheight:用来设置组件所占的单位长度与高度,默认值皆为1。你可以使用GridBagConstraints.REMAINDER常
量,代表此组件为此行或此列的最后一个组件,而且会占据所有剩余的空间。

weightx,weighty:用来设置窗口变大时,各组件跟着变大的比例,当数字越大,表示组件能得到更多的空间,默认值皆为0。
anchor: 当组件空间大于组件本身时,要将组件置于何处,有CENTER(默认值)、NORTH、NORTHEAST、EAST、SOUTHEAST、
WEST、NORTHWEST可供选择。
insets:设置组件之间彼此的间距,它有四个参数,分别是上,左,下,右,默认为(0,0,0,0).
ipadx,ipady:设置组件内的间距,默认值为0。
我们以前提过,GridBagLayout里的各种设置都必须通过GridBagConstraints,因此当我们将GridBagConstraints的参数都设置
好了之后,必须new一个GridBagConstraints的对象出来,以便GridBagLayout使用。
例子:
GridBagLayoutDemo.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GridBagLayoutDemo{
public GridBagLayoutDemo(){
JButton b;
GridBagConstraints c;
int gridx,gridy,gridwidth,gridheight,anchor,fill,ipadx,ipady;
double weightx,weighty;
Insets inset;

JFrame f=new JFrame();

GridBagLayout gridbag=new GridBagLayout();
Container contentPane=f.getContentPane();
contentPane.setLayout(gridbag);

b=new JButton("first");
gridx=0;
gridy=0;
gridwidth=1;
gridheight=1;
weightx=10;
weighty=1;
anchor=GridBagConstraints.CENTER;
fill=GridBagConstraints.HORIZONTAL;
inset=new Insets(0,0,0,0);
ipadx=0;
ipady=0;
c=new GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor,
fill,inset,ipadx,ipady);
gridbag.setConstraints(b,c);
contentPane.add(b);


b=new JButton("second");
gridx=1;
gridy=0;
gridwidth=2;
gridheight=1;
weightx=1;
weighty=1;
anchor=GridBagConstraints.CENTER;
fill=GridBagConstraints.HORIZONTAL;
inset=new Insets(0,0,0,0);
ipadx=50;
ipady=0;
c=new GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor,
fill,inset,ipadx,ipady);
gridbag.setConstraints(b,c);
contentPane.add(b);

b=new JButton("third");
gridx=0;
gridy=1;
gridwidth=1;
gridheight=1;
weightx=1;
weighty=1;
anchor=GridBagConstraints.CENTER;
fill=GridBagConstraints.HORIZONTAL;
inset=new Insets(0,0,0,0);
ipadx=0;
ipady=50;
c=new GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor,
fill,inset,ipadx,ipady);
gridbag.setConstraints(b,c);
contentPane.add(b);

b=new JButton("fourth");
gridx=1;
gridy=1;
gridwidth=1;
gridheight=1;
weightx=1;
weighty=1;
anchor=GridBagConstraints.CENTER;
fill=GridBagConstraints.HORIZONTAL;
inset=new Insets(0,0,0,0);
ipadx=0;
ipady=0;
c=new GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor,
fill,inset,ipadx,ipady);
gridbag.setConstraints(b,c);
contentPane.add(b);

b=new JButton("This is the last button");
gridx=2;
gridy=1;
gridwidth=1;
gridheight=2;
weightx=1;
weighty=1;
anchor=GridBagConstraints.CENTER;
fill=GridBagConstraints.HORIZONTAL;
inset=new Insets(0,0,0,0);
ipadx=0;
ipady=50;
c=new GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor,
fill,inset,ipadx,ipady);
gridbag.setConstraints(b,c);
contentPane.add(b);

f.setTitle("GridBagLayout");
f.pack();
f.setVisible(true);
f.addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
);
}
public static void main(String[] args){
new GridBagLayoutDemo();
}
}
1-3-5:BoxLayout的使用:
BoxLayout的类层次结构图:
java.lang.Object
--java.awt.BoxLayout

BoxLayout提供了两个常数X_AXIS,Y_AXIS来表示水平或垂直排列。若放进去的组件不等高,则系统将会使所有的组件与最高组件
等高,还有,若你将组件都摆在同一行时,系统不因组件宽度在于Container的宽度,而使组件自动摆在下一行,你必须自行处理换
行的操作。
构造函数:
BoxLayout(Container targe,int axis)建立一个水平或垂直的BoxLayout.
讲到BoxLayout,我们就不得不提到Box这个Container,Box这个Container默认的Layout为BoxLayout,而它只能使用这个Layout,
否则编译时会有Error产生,如同前面所讲的,BoxLayout是以水平或垂直方式排列,因此,当我们要产生一个Box Container时,
就必须指定它的排列方式,下面为Box的构造函数:
Box(int axis) 建立一个Box Container,并指定组件的排列方式是水平或垂直。
上面的axis参数,我们可以使用BoxLayout.X_AXIS或BoxLayout.Y_AXIS来指定。或是利用Box类所提供的两个方法:
createHorizontalBox()与createVerticalBox(),来建立BoxContainer.
Box类提供4种透明的组件来做更方便的版面管理。分别是glue、strut、rigid、filler:
下面以两个相连的按钮当例子,起始状态如下:
B1.java
1 import java.awt.*;
2 import java.awt.event.*;
3 import javax.swing.*;
4 public class B1{
5 public B1(){
6 JFrame f=new JFrame();

7 Container contentPane=f.getContentPane();
8 Box baseBox=Box.createHorizontalBox();
9 contentPane.add(baseBox);
10 baseBox.add(new JButton("A"));
11 baseBox.add(new JButton("B"));

12 f.setTitle("BoxLayout");
13 f.setSize(new Dimension(200,50));
14 f.setVisible(true);

15 f.addWindowListener(
16 new WindowAdapter(){
17 public void windowClosing(WindowEvent e){
18 System.exit(0);
19 }
20 }
21 );

22 }
public static void main(String[] args){
B1 b=new B1();
}
}
Glue:当glue插入在两组件间时,它会将两组件挤到最左与最右(或最上与最下),透明的glue将会占满整个中间的空间。
例:
在10与11行间加入下面一行程序:
baseBox.add(Box.createHorizontalGlue());
Strut:当你不想将A与B按钮挤到最旁边时,你可以使用Strut组件,来设置所需要的大小,但仅能限定一维的大小,例如限定
水平或垂直高度。
例:在10与11行间加入下面一行程序:
baseBox.add(Box.createHorizontalStrut(50));//A,B之间间隔50个像素。
Rigid:这个透明组件跟Strut很像,但它可以设置二维的限制,也就是可以设置水平与垂直的限制宽度。
例:在10与11行间加入下面一行程序:
baseBox.add(Box.createRigidArea(new Dimension(50,50)));
为了将Rigid的高度功能显示出来,因此以pack()方法代替setSize()方法,11行替换为:f.pack();
若我们将高度再拉长,例如baseBox.add(Box.createRigidArea(new Dimension(50,50)));的Dimension改成(50,100),则两
组件的上下空白将会增大,因为透明的Rigid组件高度增高了。
Filler:Filler是Box的inner class,它的功能跟Rigid很像,都可以指定长宽的大小限制,且Filler可以指定最大、较佳、最小的长
宽大小,以下是Filler的构造函数:
Box.Filler(Dimension min,Dimension pref Dimension max)建立一个指定大小的Filler对象。
参数min表示最小的显示区域大小,如同上面的例子所示,若所设置最小区域的高度大于按钮A与B的高度,则按钮A与B的上方
与下方将有空白出现。
pref表示较佳的显示区域大小。max表示最大的显示区域大小。
例:在10与11行间加入下面一行程序:
baseBox.add(new Box.Filler(new Dimension(50,50),
new Dimension(100,50),
new Dimension(200,50)));
Box类所提供的方法:
Static Component createGlue()构造一个Glue组件可向水平与垂直方向延伸
Static Box createHorizontalBox()构造一个水平排列的Box组件
Static Component createHorizontalGlue()构造一个水平的Glue组件
Static Component createHorizontalStrut(int width)构造一个水平的Strut组件
Static Component createRigidArea(Dimension d)构造一个Rigid组件
Static Box createVerticalBox()构造一个垂直排列的Box组件
Static Component createVerticalGlue()构造一个垂直的Glue组件
Static Component createVerticalStrut(int height)构造一个垂直的Strut组件
AccessibleContext getAccessibleContext()取得与JComponent相关边的AccessibleContext
Void setLayout(LayoutManager l)丢出AWTError,因为Box只能使用BoxLayout
例子:BoxLayoutDemo.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class BoxLayoutDemo{
public BoxLayoutDemo(){
JFrame f=new JFrame();

Container contentPane=f.getContentPane();
Box baseBox=Box.createHorizontalBox();//先产生水平排列方式的Box组件,当作基底容器(BaseBox)
contentPane.add(baseBox);

/*产生垂直排列方式的Box组件来安置第一与第三个按钮
*/
Box vBox=Box.createVerticalBox();
JButton b=new JButton("first");
vBox.add(b);
b=new JButton("third");
b.setMaximumSize(new Dimension(100,150));
vBox.add(b);
baseBox.add(vBox);

/*产生垂直排列方式的Box组件来安置第二与另一个水平排列方式的Box组件
*/
Box vBox1=Box.createVerticalBox();
baseBox.add(vBox1);
b=new JButton("second");
b.setAlignmentX(Component.CENTER_ALIGNMENT);
b.setMaximumSize(new Dimension(300,50));
vBox1.add(b);

Box hBox=Box.createHorizontalBox();
vBox1.add(hBox);


/*将第四与最后一个按钮加入水平排列方式的Box组件中
*/
Box vBox2=Box.createVerticalBox();
vBox2.add(Box.createVerticalStrut(50));
vBox2.add(new JButton("fourth"));
vBox2.add(Box.createVerticalStrut(50));
hBox.add(vBox2);

Box vBox3=Box.createVerticalBox();
vBox3.add(Box.createVerticalGlue());
vBox3.add(new JButton("THis is the last button"));
hBox.add(vBox3);

f.setTitle("BoxLayout");
f.pack();
f.setVisible(true);

f.addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
);

}
public static void main(String[] args){
BoxLayoutDemo b=new BoxLayoutDemo();
}
}

5.16.2008

Deutschland



无意中淘到的好物~~~

歌名叫Deutschland,翻过来就是德国的意思。


Deutschland(德国)
演唱:Die Prizen (王子组合)

Deutsch, deutsch, deutsch, deutsch, deutsch, deutsch
德语,德意志,德国人,……………

Natürlich hat ein Deutscher "Wetten, dass ... ?" erfunden
肯定只有德国人才能说出这样的话:“我说的是不会错的,打个赌好吗?”

Vielen Dank für die schoenen Stunden
非常感谢,我们过的非常愉快!

Wir sind die freundlichsten Kunden auf dieser Welt
我们是这个世界上最好的顾客

Wir sind bescheiden, wir haben Geld
我们谦虚并富有

Die Allerbesten in jedem Sport
我们有最好的运动员

Die Steuern hier sind Weltrekord
德国的捐税世界闻名

Bereisen Sie Deutschland und bleiben Sie hier
欢迎来德国旅行和逗留

Auf diese Art von Besuchern warten wir
我们期待您的光临

Es kann jeder hier wohnen, dem es gefaellt
只要高兴,谁都可以来德国住住

Wir sind das freundlichste Volk auf dieser Welt
我们是世界上最友善的民族

Deutsch, deutsch, deutsch, deutsch
德语,德意志,德国人,

Nur eine Kleinigkeit ist hier verkehrt
要澄清的一点小误会是,

Und zwar, dass Schumacher keinen Mercedes faehrt
舒马赫开的并不是梅塞德斯车

Das alles ist Deutschland
这就是德国

Das alles sind wir
我们就是德国人

Das gibt es nirgendwo anders
这里一点都不怪

Nur hier, nur hier
德国,德国

Das alles ist Deutschland
这就是德国

Das sind alles wir
我们就是德国人

Wir leben und wir sterben hier
我们在这里生活和死亡

Deutsch, deutsch, deutsch, deutsch
德语,德意志,德国人,……………

Deutsch, deutsch, deutsch, deutsch
德语,德意志,德国人,……………

Es bilden sich viele was auf Deutschland ein
都说德国人很自负

Und mancher findet es geil, ein Arschloch zu sein
不少德国人都认为不要脸的家伙就是好色之徒

Es gibt Manchen, der sich gern über Kanacken beschwert
有些人喜欢为了鸡毛蒜皮的小事而抱怨

Und zum Ficken jedes Jahr nach Thailand faehrt
有些人为了追求刺激每年都要去泰国

Wir lieben unsere Autos mehr als unsere Frauen
我们爱女人但更爱汽车

Den deutschen Autos koennen wir vertrauen
我们信赖德国车

Gott hat die Erde nur einmal geküsst
上帝偏爱德国,即使在他唯一一次亲吻地球时,

Genau an dieser Stelle, wo jetzt Deutschland ist
接受上帝之吻的地方就是现在的德国

Wir sind überall die Besten natürlich auch im Bett
我们什么都要做到最好,当然**也不例外

Und zu Hunden und Katzen besonders nett
猫和狗深受我们的喜爱

Das alles ist Deutschland
这就是德国

Das alles sind wir
我们就是德国人

Das gibt es nirgendwo anders
这里一点都不怪

Nur hier, nur hier (zwo, drei, vier)
德国,德国

Das alles ist Deutschland
这就是德国

Das sind alles wir
我们就是德国人

Wir leben und wir sterben hier
我们在这里生活和死亡

Wir sind besonders gut in und auf die Fressehauen
我们是出色的战士

Auch im Feuerregen kann man uns vertrauen
即使在枪林弹雨中人们也能信任我们

Wir stehen auf Ordnung und Sauberkeit
我们讲条里和喜欢整洁

Wir sind jederzeit für'n Krieg bereit
我们枕戈待旦

Schon Gross an die Welt zieht es endlich ein
总有一天大德意志会重现世界

Wir koennen stolz auf Deutschland sein
我们能为德国而骄傲

Schwein, Schwein, Schwein, Schwein
可怜虫,可怜虫,可怜虫,可怜虫

Schwein, Schwein, Schwein, Schwein
可怜虫,可怜虫,可怜虫,可怜虫

Das alles ist Deutschland
这就是德国

Das alles sind wir
我们就是德国人

Das gibt es nirgendwo anders
这里一点都不怪

Nur hier, nur hier
德国,德国

Das alles ist Deutschland
这就是德国

Das sind alles wir
我们就是德国人

Wir leben und wir sterben hier
我们在这里生活和死亡

Das alles ist Deutschland
这就是德国

Das alles sind wir
我们就是德国人

Das gibt es nirgendwo anders
这里一点都不怪

Nur hier, nur hier
德国,德国

Das alles ist Deutschland
这就是德国

Das sind alles wir
我们就是德国人

Wir leben und wir sterben hier
我们在这里生活和死亡





另一个版本的歌词,附解说

Deutsch, deutsch, deutsch, deutsch, deutsch, deutsch
德语,德意志,德国人,……………

Natürlich hat ein Deutscher ``Wetten, dass ... ?`` erfunden
肯定只有德国人才能发明“打赌吧……”这种节目
Vielen Dank für die sch鰊en Stunden
非常感谢,让我们度过的愉快时光!
Wir sind die freundlichsten Kunden auf dieser Welt
我们是这个世界上最友好的顾客
Wir sind bescheiden, wir haben Geld
我们谦虚并富有
Die Allerbesten in jedem Sport (去死吧!德国的足球没资格在这里叫嚣)(――b 这个…这些紫字可不是橙子我写的…
我们有最好的运动员
Die Steuern hier sind Weltrekord
德国的捐税世界闻名
Bereisen Sie Deutschland und bleiben Sie hier
欢迎来德国旅行和生活
Auf diese Art von Besuchern warten wir
我们期待您的光临
Es kann jeder hier wohnen, dem es gef鋖lt
只要高兴,谁都可以来德国住住
Wir sind das freundlichste Volk auf dieser Welt
我们是世界上最友善的民族

Deutsch, deutsch, deutsch, deutsch
德语,德意志,德国人,

Nur eine Kleinigkeit ist hier verkehrt
要澄清的一点小误会是,
Und zwar, dass Schumacher keinen Mercedes f鋒rt
舒马赫开的并不是梅塞德斯车

Das alles ist Deutschland
这就是德国
Das alles sind wir
我们就是德国人
Das gibt es nirgendwo anders
这里一点都不怪
Nur hier, nur hier
只有这里,只有这里
Das alles ist Deutschland
这就是德国
Das sind alles wir
我们就是德国人
Wir leben und wir sterben hier
我们在这里生活和死亡

Deutsch, deutsch, deutsch, deutsch
德语,德意志,德国人,……………
Deutsch, deutsch, deutsch, deutsch
德语,德意志,德国人,……………

Es bilden sich viele was auf Deutschland ein
很多人都说德国人很自负
Und mancher findet es geil, ein Arschloch zu sein
不少德国人都认为不要脸的家伙就是好色之徒 (或可解释为cool吧,新旧德语的区别)
Es gibt Manchen, der sich gern über Kanacken beschwert
有些人喜欢为了鸡毛蒜皮的小事而抱怨
Und zum Ficken jedes Jahr nach Thailand f鋒rt
有些人为了追求刺激每年都要去泰国 (有些德国人的糜烂生活……
Wir lieben unsere Autos mehr als unsere Frauen
我们爱女人但更爱汽车
Den deutschen Autos k鰊nen wir vertrauen
我们信赖德国车
Gott hat die Erde nur einmal geküsst
上帝偏爱德国,即使在他唯一一次亲吻地球时,
Genau an dieser Stelle, wo jetzt Deutschland ist
接受上帝之吻的地方就是现在的德国
Wir sind überall die Besten natürlich auch im Bett
我们什么都要做到最好,当然**也不例外
Und zu Hunden und Katzen besonders nett
猫和狗深受我们的喜爱

Das alles ist Deutschland
这就是德国
Das alles sind wir
我们就是德国人
Das gibt es nirgendwo anders
这里一点都不怪
Nur hier, nur hier (zwei, drei, vier)
德国,德国
Das alles ist Deutschland
这就是德国
Das sind alles wir
我们就是德国人
Wir leben und wir sterben hier
我们在这里生活和死亡

Wir sind besonders gut in und auf die Fressehauen
我们是出色的战士
Auch im Feuerregen kann man uns vertrauen
杀人放火人们也能信任我们
Wir stehen auf Ordnung und Sauberkeit
我们讲条里和喜欢整洁
Wir sind jederzeit für'n Krieg bereit
我们随时准备战争
Schon Gro an die Welt zieht es endlich ein
总有一天大德意志会重现世界 (这里就体现出Neonazis了,就是新纳粹。
Wir künen stolz auf Deutschland Schwein!
我们能为德国而(骄傲)
(这里本来最后一个词是sein,那就组成了为德国骄傲的意思了。但是他们摒了半天突出个Schwein(猪)出来,发音也能算是押韵了!哈哈哈这个是德国人的自嘲精神吧……

Schwein, Schwein, Schwein, Schwein
可怜虫,可怜虫,可怜虫,可怜虫
Schwein, Schwein, Schwein, Schwein
可怜虫,可怜虫,可怜虫,可怜虫

Das alles ist Deutschland
这就是德国
Das alles sind wir
我们就是德国人
Das gibt es nirgendwo anders
这里一点都不怪
Nur hier, nur hier
只有这里,只有这里
Das alles ist Deutschland
这就是德国
Das sind alles wir
我们就是德国人
Wir leben und wir sterben hier
我们在这里生活和死亡

Das alles ist Deutschland
这就是德国
Das alles sind wir
我们就是德国人
Das gibt es nirgendwo anders
这里一点都不怪
Nur hier, nur hier
只有这里,只有这里
Das alles ist Deutschland
这就是德国
Das sind alles wir
我们就是德国人
Wir leben und wir sterben hier
我们在这里生活和死亡

10天为一循环的减肥餐单(转自千龙)

  令人尴尬的夏天来了,如果你想要再瘦个几公斤,那可要抓紧啦!以下为你提供的10天减肥餐单,以蔬菜与水果为主,辅以必要的蛋白质及维生素,在保证基础营养的同时,可以达到清理肠胃、排除毒素的美容功效。

  1、此餐单提供的热量不超过1000大卡,
因此请勿长期使用,以免造成营养不良;

  2、请完全遵守餐单组合,请勿随意增加或减少食物;

  3、每周请泡澡或足浴最少2次,经常泡澡可以有效地促进新陈代谢,同时有利于皮肤的美容。

  4、可选用合格的纤体消脂霜,每天按摩皮肤可以防止减肥带来的皮肤细纹。

  如果你记住了以上事项,那么就赶快来看神奇的减肥餐单吧!

  Day 1~3

  早餐:起床后先喝一大杯温水,再选择下列任何一个早餐组合。

  ·水果2个(可以是任何时令水果,如苹果、橙子、猕猴桃、雪梨等)

  ·大番茄2个加一条小黄瓜

  ·水果番茄15粒加三条小黄瓜

  ·其它蔬菜类一碗

  吃完水果或蔬菜后,你可以再喝250ml酸乳酪,富含活性乳酸菌的酸乳酪可以清除体内毒素,加强肠胃功能。

  午餐:水煮菜1碗或生菜沙拉一份,可用醋和盐粒调味,请勿加热量高的沙拉酱。再选择下列任何一个午餐组合。

  ·瘦身汤1~2碗(可以是猪肉萝卜汤等少油的汤类)

  ·瘦身粥1~2碗 (如薏米粥、麦片粥、荷叶粥等,薏米粥可有效消除水肿;麦片粥可促进肠胃消化;荷叶粥具有减肥功效。)

  午餐后可以吃一例复合维他命来补充缺乏的维生素与微量元素。

  下午茶:也许你到了下午就饿的头晕眼花了,这时候可以吃2片高纤梳打饼干,配一杯低热量的脱脂牛奶(或无糖豆浆),立刻就能让你精神一振。把瘦身课程表坚持下去吧!

  晚餐:请继续坚持清淡的水煮菜或生菜沙拉(不可加沙拉酱),再选择以下任何一个晚餐组合。

  ·瘦身汤1~2碗(可以是猪肉萝卜汤等少油的汤类)

  ·瘦身粥1~2碗 (如薏米粥、麦片粥、荷叶粥等,薏米粥可有效消除水肿;麦片粥可促进肠胃消化;荷叶粥具有减肥功效。)

  晚餐后喝一杯清香的花草茶(如玫瑰蜜枣茶、荷叶茶、乌龙茶等),可以促进肠胃蠕动,同时去除油腻。

  Day 4~7

  早餐:请继续跟随第一天至第三天的餐单,不过为了补充蛋白质,请多加一个白水煮蛋,也可以加一杯250ml的酸乳酪。

  午餐:这几天你可以自由进食,可适度加大一些量,但必须注意要将蛋白质与淀粉分开食用,同时避开油炸食品、多糖多脂肪的食品,多喝开水也是必须的步骤。

  晚餐:请继续坚持清淡的水煮菜或生菜沙拉(不可加沙拉酱)1份,再选择以下任何一个晚餐组合。

  ·瘦身汤1~2碗(可以是猪肉萝卜汤等少油的汤类)

  ·瘦身粥1~2碗 (如薏米粥、麦片粥、荷叶粥等,薏米粥可有效消除水肿;麦片粥可促进肠胃消化;荷叶粥具有减肥功效。)

  Day 8~10

  早餐:请遵循第一天至第三天的餐单

  午餐:清淡的白灼青菜1碗或生菜沙拉1份(仍然不可以加沙拉酱哦~),再选择下列任何一款食物:

  ·瘦身汤1碗(可以是猪肉萝卜汤等少油的汤类)

  ·瘦身粥1碗 (如薏米粥、麦片粥、荷叶粥等,薏米粥可有效消除水肿;麦片粥可促进肠胃消化;荷叶粥具有减肥功效。)

  午餐后请补充符合维他命。

  在饥肠辘辘的下午可以喝脱脂牛奶(或无糖豆浆1杯),苏打饼干1~3片,还可以吃1~2个果冻,当然要注意它的含糖量。

  晚餐:水煮菜1碗或生菜沙拉1份(勿加沙拉酱),再选择下列任何一个组合。

  ·清蒸鸡胸肉一份,或切片后用高汤煮熟;

  ·去皮鸡腿一支;

  ·清蒸鱼一条(小),或5片生鱼片;

  ·瘦肉8片,可以清蒸,也可以用高汤煮熟;

  ·豆腐2块

  以上餐单以10天为一个循环,可坚持使用直到达到理想体重。如出现不适请停止使用;如你想减重10公斤以上,请咨询专业医生。

减肥计划

哈,真的得减肥了,这两个学期胖了快15斤,自己也觉着精神差了。
人还是得锻炼,身体是革命的本钱啊,综合了一下,还是运动加合理膳食。
Copy了一下萍聚上有人总结的经验,
方案一:
早餐: 碳水化合物 ( + 中性食品)
午餐: 随意
晚餐: 蛋白 ( + 中性食品)

方案2:
1, 早餐两只白煮蛋,加一只中等西红柿
2, 午饭在公司蔬菜不加色拉油,其实生蔬菜很容易饱,而且吃后不容易有饥饿感,下午可以吃点水果
3, 晚饭只要不吃面食和饭,其他肉量和蔬菜随意,我觉得这样可以对食物保持欲望,不然容易得厌食症
4, 晚上9点跑步45分钟到1个小时,主要速度慢一点,心情保持愉快,这样可以长期坚持下来,不然两三天就失去兴趣了
5, 跑步完了少喝水

不过我觉得有点太粗略,还是结合自己比较好。
早餐:一只煮鸡蛋,一杯牛奶或者一杯酸奶。
午餐:两片Vollkorn面包夹一边火腿,再加两片生菜或者四片黄瓜。下午一个苹果。
晚餐:我觉着晚餐最难决定,因为GF还要吃东西,很可能受不了诱惑。以少吃饭为主吧。
计划是吃些菜,一个苹果。
睡前一点红酒,hehe

减肥的根本方法是控制饮食和增加体力活动,下面的饮食小窍门对减肥有一定的帮助。

餐前的准备:


1.餐前喝汤。喝汤可使胃不感到饥饿,也可以使吃下的主食膨胀,预防吃过量。

2.餐前吃水果。水果体积大,有饱腹感,可以减少正餐的食量。

3.餐前含一小块水果糖。血糖浓度升高后,腹中不感到特别饥饿,吃饭的速度和数量会降低,不易吃过量。

4.不在腹中特别饥饿时进食食物,因为这时很可能吃得过量。

进餐中的注意事项:


1.进餐速度放慢,每一口饭都细嚼慢咽。多数肥胖者进餐速度太快,大脑还来不及感受饱的信息便已经吃过量。若放慢进餐速度,便会比较准确地感到饱的信息。

2.进餐时不可看书看报,要专心致志地感受胃肠的感觉,体验对食物的兴趣从强到弱的过程。

3.进餐时不要喝甜饮料和酒类,只能喝白开水、茶和含油脂较少的汤。

4.先吃蔬菜、海藻、蘑菇、豆腐等热能比较低的菜,再开始吃主食和动物性食品,这样可以保证热能不过量。

5.一边吃饭一边吃菜,不要等吃饱了菜再吃饭。

6.一旦对食物的兴趣减弱,即使饭还没有吃完,也要停下。

餐后的注意事项:


1.餐后决不可再吃花生、瓜子和零食,香蕉、苹果等含一定热能的水果也不能吃。

2.餐后决不可再喝甜饮料。

3.晚餐后要立刻刷牙,这样不仅对牙齿有很好的保护作用,而且可以防止餐后再吃零食。

4.餐后不可立刻坐下或躺下,应当做些轻微活动,帮助食物中的能量及时消耗。

食物的选择:


1.不要用饺子、包子、酥饼、点心等加入油脂、白糖或肉的食物代替米饭和馒头做主食,因为它们比馒头和米饭的热能高得多,更易使人发胖。

2.用豆腐代替动物性食品。能加速你减肥的一些食物

3.用鸡肉和鱼肉来代替猪肉。鸡肉的脂肪含量低而蛋白质含量高,而瘦猪肉含脂肪也达25%左右,排骨肉更高达30%~40%。

4.如果用土豆和甘薯作为菜肴或零食,就应当减少主食的数量,因为它们也含有淀粉。

5.经常吃些海带、蘑菇、香菇、木耳、魔芋等菜肴,它们本身热能很低,还具有填充作用,可以使胃中产生饱感,有利减肥。


运动是必须的了,每天9点回家,9点到10点满跑30分钟,仰卧起坐15分钟。俯卧撑5分钟。另外要合理休息了,保证12点半开始整理1点15之前睡下了。

5.14.2008

Html Parser

本文介绍了.net 版的一个HTMLParser网页解析开源类库(Winista.HTMLParser)的功能特性、工作原理和使用方法。对于使用.net进行Web信息提取的开发人员进行了一次HTMLParser的初步讲解。应用实例将会在日后的文中介绍,敬请关注。

一、背景知识
HTMLParser原本是一个在sourceforge上的一个Java开源项目,使用这个Java类库可以用来线性地或嵌套地解析HTML文本。他的功能强大和开源等特性吸引了大量Web信息提取的工作者。然而,许多.net开发者朋友一直在寻找一种能在.net中使用的HTMLParser类库,笔者将介绍Winista.HTMLParser类库,对比于其他原本数量就非常少的.net版HTMLParser类库,Winista的版本的类库结构可以说更接近于原始Java版本。
该类库目前分为Utltimate、Pro、Lite和Community四个版本,前三个版本都是收费的。只有Community版本可以免费下载并查看所有的源码。
当前Community最新版本1.8 下载。
该版本的类库文档下载。

二、功能和特性
1.可以在任何.net语言中使用(C#,VB.net,J#等)
2.可以解析几乎所有的Html标签,并且可以通过标签类别、属性或正则表达式来搜索标签。有些甚至在Java版本中无法支持的标签也在这个版本中得到了支持。
3.设置可扩展的过滤器来过滤结果集中不需要的标签。
4.高性能的API接口使得你能处理许多常见的问题,如:哪些是页面中的外部链接?哪些是图片?哪些是不同的表格?页面中有错误的链接吗等等问题。
5.一个基于Http协议引擎的配置文件使得你能通过一个指定的URL地址来获得该页面内容。该爬虫可以遵循robot.txt协议文件来获得组织和允许访问的列表。
6.Http协议引擎能够完整地处理来自任何站点的反馈。

三、词法分析的工作原理
HTMLParser的词法分析器对HTML进行了4级封装,从低级到高级的顺序为:ParserStream、Source、Page、Lexer。 ParserStream负责从文件中获取二进制数据,但不做任何处理。Source把二进制文件转换成相应的字符序列,存储一组未加工的字符序列。 Page可以看成是一个string数组,按行存储一个Source文本的每一行第一个字符开始的位置索引。Lexer包含了词法分析的代码,从Page 里读取字符串,用Cursor记录当前字符所在位置,通过状态机来生成Nodes节点。
Lexer中真正执行词法分析的是NextCode()方法,它每次词都查找返回下一个Node节点,直到Page结束。算法描述如下:
1.读入一个字符,判断是否已是页尾,是则返回null。
2.判断是否是"<",如果是,则可能是标签入口,需读取下一字符确认。
3.如果都不是,ParserString状态机开始解析一个StringNode,如果是"<",继续读取下一字符。
4.判断是否到页尾,是则产生一个StringNode返回。
5.如果读取到"%",则说明是JSP标签,进入JSP状态机去解析。
6.如果读取到"?",则说明是XML标签,进入XML状态机去解析。
7.如果读取到"/"或任何字母,说明是Tag标签,进入Tag标签状态机去解析。
8.如果读取到"!",则说明进入了一个注释标签,需要再读取一个字符,如果到页尾,则产生一个StringNode返回,如果字符为">"则生成一个RemarkNode返回,否则 回退一个字符,再判断字符如果是"-"则回退一个字符,进入Remark状态机去解析,如果不是,则回退一个字符进入Tag状态机去解析。

四、三种使用方法的比较
1.使用Lexer词法分析器直接解析HTML。
这样的方法较为底层,只能返回一个线性的Node节点序列,通过Lexer.NextNode()方法获得下一个Node的信息。虽然不够方便,但有时可完成一些较为灵活的工作。
调用的方法是(传入string类型的html代码):

Lexer lexer = new Lexer(htmlcode);
INode node = lexer.NextNode();
Console.Write(node.ToString());

返回结果是该页面的第一个标签"html"的Node结点信息。

2.使用Filter结点过滤模式。
如果你有一些很明确的结点需要提取,那么就该使用Filter结点过滤模式。系统定义了17种具体的Filter,根据不同的过滤条件来获得需要的结点。包括依据结点父子关系的Filter,连接Filter组合的Filter,依据网页内容匹配情况的filter,等等。我们也可以继承 Filter做自己的Filter来提取节点。

NodeList nodeList = myParser.parse(someFilter);
解析之后,我们可以采用:
INode[] nodes = nodeList.toNodeArray();

来获取节点数组,也可以直接访问:
INode node = nodeList.elementAt(i);
来获取Node。
另外,在Filter后得到NodeList以后,我们仍然可以使用nodeList.extractAllNodesThatMatch (someFilter)来进一步过滤,同时又可以用nodeList.visitAllNodesWith(someVisitor)来做进一步的访问。

3.使用Visitor结点访问模式
如果你希望HTMLParser遍历所有的结点,并按结点的不同类型(StringNode、RemarkNode、TagNode)和不同的访问过程来进行不同操作的话,可以使用Visitor模式。NodeVisitor是一个抽象类,分别定义了如下方法:
BeginParsing():解析前进行的操作
VitisTag():访问到开始标签时的操作
VisitEndTag():访问到结束标签时的操作
VisitStringNode():访问到文本结点时的操作
VisitRemarkNode():访问注释结点时的操作
自己定义一个类并继承NodeVisitor类,实现以上几个方法,即完成Visitor模式的访问类。系统也提供了7个具体的结点访问类,具体见上文提供的类库文档。不过这7个类并不实用,大多数的功能还需要自己来扩充定义。调用方法:
Parser parser = Parser.CreateParser((htmlcode), "GBK");//传入string类型的html代码
NodeVisitor visitor = new LinkFindingVisitor(linktext); //以链接查找的Visitor举例
parser.VisitAllNodesWith(visirot);

灵活使用以上三种模式的结合,相信就可以提取到任何我们所需要的信息了。

5.12.2008

Eclipse注释模板

in Eclipse, unter preference->Java->Code Style->Comments, for example in type:
/**
* INSTITUT FUER INFORMATIK
* Heinrich Heine Universitaet Duesseldorf
* http://www.dbs.cs.uni-duesseldorf.de
*
* @author ${user}
* @version
* @time ${date} ${time}
* @copyright Kaiyuan ZHU
*/