2008年02月29日

最近学习Swing,写了个文件选种器,可以浏览图片哦。很粗糙,不过很有意思。
首先是一个JPanel的继承类。用来设置文件选择器JFileChooser

 1package book.swing.jfilechooser;
 2
 3import javax.swing.*;
 4import javax.swing.border.BevelBorder;
 5import java.io.*;
 6import java.awt.*;
 7import java.awt.event.*;
 8import java.beans.PropertyChangeEvent;
 9import java.beans.PropertyChangeListener;
10
11public class ImageAccessory extends JPanel implements PropertyChangeListener{
12
13    private Icon icon;
14    private JLabel imageName;
15    private JLabel imageLabel;
16    private JScrollPane scrollpane;
17    public ImageAccessory(){
18        setLayout(new BorderLayout());
19        icon = new ImageIcon("/home/madic/adapter.png");
20        imageLabel = new JLabel(icon);
21    //    imagePanel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
22        imageLabel.setBorder(BorderFactory.createLineBorder(Color.green));
23        scrollpane = new JScrollPane(imageLabel);
24        add(imageName = new JLabel("imagename"), BorderLayout.NORTH);
25        add(scrollpane, BorderLayout.CENTER);
26    }

27    public void propertyChange(PropertyChangeEvent pe){
28        if(pe.getPropertyName().equals(
29                JFileChooser.SELECTED_FILE_CHANGED_PROPERTY)){
30            File f = (File)pe.getNewValue();
31            if(f==null){
32                return;
33            }

34            if(!f.isDirectory()){
35                System.out.println(f.getAbsolutePath());
36                imageName.setText(f.getName());
37                ImageIcon ii = new ImageIcon(f.getAbsolutePath());
38              Image image = ii.getImage().getScaledInstance(200300, Image.SCALE_DEFAULT);
39                ii.setImage(image);
40                icon = ii;
41                imageLabel.setIcon(icon);
42                imageLabel.updateUI();
43            this.updateUI();
44            }

45        }

46    }

47
48}

49

下面就是一个演示JFileChooser的例子了:

package book.swing.jfilechooser;

import javax.swing.*;

import java.awt.*;
import java.awt.event.*;


public class ImageFileChooser extends JFrame{
    
private JButton open;
    
private JFrame parent;
    
private final JLabel statusbar;
    
public ImageFileChooser(){
        
super("ImageFileChooser");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        parent 
= this;
         statusbar 
= new JLabel(
        
"Output of your selection will go here");
        Container c 
= getContentPane();
        c.setLayout(
new FlowLayout());
        open 
= new JButton("Open");
        open.addActionListener(
new ActionListener(){
            
public void actionPerformed(ActionEvent e){
                JFileChooser chooser 
= new JFileChooser();
                ImageAccessory ia 
= new ImageAccessory();
                chooser.setAccessory(ia);
                chooser.addPropertyChangeListener(ia);
                
int option = chooser.showOpenDialog(parent);
                
if(option == JFileChooser.APPROVE_OPTION){
                    statusbar.setText(
"You chose "
                            
+ ((chooser.getSelectedFile() != null? chooser
                                    .getSelectedFile().getName() : 
"nothing"));
                }
 else {
                    statusbar.setText(
"You canceled.");
                }

            }

        }
);
        
        c.add(open);
        c.add(statusbar);
        setSize(
200,300);
    }

    
    
public static void main(String[] args){
        
new ImageFileChooser().setVisible(true);
    }

}

关键在于 需要设置JFileChooser的 accessory属性,我们在这个JPanel中来实现我们的东西。还要注意的是我们的JPanel类需要实现一个PropertyChangeListener类,这样,当你选择改变的时候,就可以在函数
propertyChange(PropertyChangeEvent ev)中实现动作了。
其中注意getScaledInstance(200, 300, Image.SCALE_DEFAULT);这个函数主要用来设置图片的大小。最后一个参数:Image.SCALE_DEFAULT是改变图像大小的算法。
要点就这么多。呵呵。试试看。

2008年01月26日

设数列{Xn},a是常数。若对于任意给定的€>0 ,总存在一个正整数N,使得当一切n>N时,有:

 |Xn-a|<€

则称a为数列{Xn}的极限,记为:省略。哈哈。

很有意思。

2008年01月25日

如果你telnet遇到某些命令执行不了。
返回错误为: ‘vt320′: unknown terminal type
那么可能是你telnet的主机没有安装某个终端。如果你在ubuntu下,试用如下命令
sudo apt-get install ncurses-term
安装完成后就OK了。

2008年01月12日

dd真的很好用

if=  输入文件(或设备名称)。 of=  输出文件(或设备名称)。 ibs=bytes   一次读取bytes字节,即读入缓冲区的字节数。 skip=blocks 跳过读入缓冲区开头的ibs*blocks块。 obs=bytes   一次写入bytes字节,即写入缓冲区的字节数。 bs=bytes    同时设置读/写缓冲区的字节数(等于设置ibs和obs)。 cbs=byte    一次转换bytes字节。 count=blocks 只拷贝输入的blocks块。 conv=ASCII  把EBCDIC码转换为ASCIl码。 conv=ebcdic 把ASCIl码转换为EBCDIC码。 conv=ibm    把ASCIl码转换为alternate EBCDIC码。 conv=block  把变动位转换成固定字符。 conv=ublock 把固定位转换成变动位。 conv=ucase  把字母由小写转换为大写。 conv=lcase  把字母由大写转换为小写。 conv=notrunc 不截短输出文件。 conv=swab    交换每一对输入字节。 conv=noerror 出错时不停止处理。 conv=sync    把每个输入记录的大小都调到ibs的大小(用NUL填充)。
2007年12月28日

在这篇日志安装Oracle 10g XE on Debian/Ubuntu中,在 apt 安装 oracle-xe-client 时,有可能会出现如下的错误,提示 Swap 分区没有达到要求的大小,安装无法继续。

引用
This system does not meet the minimum requirements for swap space. Based on the amount of physical memory available on the system, Oracle Client 10g Express Edition requires 1024 MB of swap space. This system has 951 MB of swap space. Configure more swap space on the system and retry the installation.

下面我们就来增加系统的 Swap 大小。

1.首先用命令free查看系统内 Swap 分区大小。
free -m

引用

total used free shared buffers cached
Mem: 1002 964 38 0 21 410
-/+ buffers/cache: 532 470
Swap: 951 32 929

可以看到 Swap 只有951M,不符合 Oracle-xe-client 的安装要求。

2.创建一个 Swap 文件。
mkdir swap
cd swap
sudo dd if=/dev/zero of=swapfile bs=1024 count=100000

出现下列提示,上面命令中的 count 即代表swap文件大小。

引用
记录了 100000+0 的读入
记录了 100000+0 的写出
102400000 字节 (102 MB) 已复制,0.74704 秒,137 MB/秒

把生成的文件转换成 Swap 文件
sudo mkswap swapfile

引用
Setting up swapspace version 1, size = 102395 kB
no label, UUID=09fde987-5567-498a-a60b-477e302a988b

3.激活 Swap 文件。
sudo swapon swapfile

再次查看 free -m 的结果。

引用
total used free shared buffers cached
Mem: 1002 967 34 0 22 410
-/+ buffers/cache: 534 467
Swap: 1053 32 1021

添加成功。

扩展:
如果需要卸载这个 swap 文件,可以进入建立的 swap 文件目录。执行下列命令。
sudo swapoff swapfile

如果需要一直保持这个 swap ,可以把它写入 /etc/fstab 文件。

引用
swapfilepath swap swap defaults 0 0

2007年12月25日

在Linux下的Bochs没有bochsdbg.exe(调试模式),bochs.exe这些东西。当需要调试的时候,需要在编译的时候指定可调试–enable-debugger –enable-disasm 选项,即可使用bochs调试了,即,在configure时指定上述两个参数。
下面是某个blogger的例子: ./configure –with-all-libs –prefix=/usr/local/bochs-2.3.5 –enable-show-ips –enable-x86-debugger –enable-cdrom –enable-debugger –enable-disasm
具体的调试命令还正准备学习。呵呵。

2007年12月24日

利用BIOS的0×13号中断,我们可以从磁盘拷贝数据到内存。

BIOS自检的时候,就把磁盘的信息(所有硬件信息)都获取了。所以之后我们就可以通过BIOS中断来获取这些数据。但是要如何取得这些数据呢?

在调用中断int之前,我们要设置一些寄存器,这些寄存器就可以看作是参数,当然执行int调用以后,也要从这些寄存器获得参数。

这里顺便说一下,IBM PC机 启动后,bios会自己把磁盘的引导区即 0柱面 0磁道 1扇区 ,512字节(含引导程序和分区信息)加载到内存的0×07c0的位置。

load_setup:
        mov     dx,#0×0000              ! drive 0, head 0
         mov     cx,#0×0002              ! sector 2, track 0
         mov     bx,#0×0200              ! address = 512, in INITSEG
         mov     ax,#0×0200+SETUPLEN     ! service 2, nr of sectors
         int     0×13                    ! read it
         jnc     ok_load_setup           ! ok – continue
         mov     dx,#0×0000
         mov     ax,#0×0000              ! reset the diskette
         int     0×13
         j       load_setup
上面的一段代码摘自 linux 0.11 内核的源码。我们可以看到
各个寄存器所保存的参数:
    dl 驱动器号(7代表硬盘) dh磁头号 cl 扇区号(0-5,6-7是柱面号高2位) ch 磁道号 bx 缓存(内存地址) ah 服务号(表示读磁盘) 。如果出错 ,CF置位。
注意一点,数据拷贝到内存的 es:bx的地方。所以注意设置es

2007年12月07日

 若集合C的元素本身都是结合X的子集,则称C为集合X上的一个集族。

设有一个集合A,称为指标集。使得对于指标集A中的每一个元素£,有X上的一个子集B£与之对应,这样就得到X上的一个集族。

              B£ 即为 C

 

可以这样想,那么就是

X={张三,李斯,王二,赵六,小五,大头}    —-集合X

好人={张三,李斯,赵六}    —集合X的子集

坏人={王二,大头,小五}   —-结合X的子集

C={好人,坏人}    —-集族

C1={好人}

C2={坏人}

A={张三,李斯,赵六}  —-指标集

 

集族是一个集合的分类集合。而指标集是指确定分类的具体集合元素。

在指标集A确定的集族应该是C1,因为A里的元素都是属于子集好人。

2007年11月06日

1 与其说这是一个模式,不如说这是一种方法。Facade 字面意思是外观,外表。我们要做的就是给用户看的东西。客户不需要深入。如同我们给一个主机做各种不同的机箱,用户关心的是电源接口,鼠标、键盘接口,USB,显示器接口等等。如果有客户只要usb接口,那么我们可能就只需要做有一个USB接口的机箱(当然不可能)就可以了。Facade还不仅仅如此。

2、好了,现在来说Facade模式。有的时候,当我们面对与一个复杂系统交互的时候,一定会很难捉摸,如果这个时候我们把这个复杂系统的大量的API都简化成少量我们需要的API,那么,我们就可以不用关心这个系统有多么复杂,我们只需要关心我们的东西和如何用这些精简的API达成我们的目的了。Facade模式便是把那些复杂的东西用接口统一起来,而我们的东西不用和太多的东西打交道。

 

3、Facade模式的功用,首先,化复杂为实用,简洁。其次,减少对象的交互;再次,封装,为我们要隐藏的东西披上外衣。扩展开来,不仅能化简,而且可以添加新的功能,或者应对变化而更换Facade。

4、生活中,我们随处可见。总经理在面对公司各个部门时,部门的Facade就是部门经理,当然,公司总裁看到的公司的Facade便是总经理。或者我们使用的操作系统,我们可能调用某个API实现某个功能,而不是直接深入到操作系统内部,这些API便是操作系统的Facade。

2007年10月29日

以前一直都看不懂,总觉得太抽象,或者觉得没有多少用。然后等到现在,总算接触了一些比较复杂的系统,然后突然明白了设计模式的用处。

其实设计模式没有什么难的。可能以前你就用了很多个。其实如果你没有写过很复杂的系统,或者深入学习过一些大的系统,可能你对设计模式的理解还很有限,即使看过书,也很快忘记了。所以这里我也不仔细说设计模式的细节。

其实设计模式(GOF)主要是针对面向对象的程序设计方法。其实也不过是一些解决方案的核心。比如一个很小的单例模式,够小了吧,但是这类问题却实在众多设计中常常要用到的。

关于模式,其实我们不需要去一个一个记住。我想记住他们的分类就差不多了。

1、创建型

2、结构型

3、行为型

当你觉得自己的某个设计很糟糕的时候,再想想设计模式吧,看看他们是如何帮你解决问题的。这样用一次,就足够你记住很长时间了。如果你觉得自己的设计已经很完美了,那么做完以后再看看(设计模式)是否如此。

当然,如果你熟悉面向对象的程序设计和UML,那么设计模式一看便知,是一种简洁的美。你也可以在这些核心的基础上扩展他们吧。