Debian安装配置常用软件

1、安装j2sdk,下载j2sdk-1_4_2_09-linux-i586-rpm.bin文件,chmod 755 j2sdk-1_4_2_09-linux-i586-rpm.bin,运行后得到.rpm文件,用alien转换为.deb包,然后dpkg -i  xxx.deb即可,安装后的文件在/usr/java目录;

Update: 在debian里用上面rpm包安装jdk有问题,一些jar文件没有被展开,所以下载非rpm的那个包比较好,chmod +x后解压到想要的目录即可。在~/bash_profile里设置JAVA_HOME和PATH=$PATH:$JAVA_HOME/bin, gnome的shell要在菜单里设置为登录shell。

2、安装eclipse,下载后直接tar zxvf即可,然后在桌面建立一个快捷方式,vm参数指向刚才安装的jdk下的bin/java;特别要注意一个问题,在windows下开发的插件项目 拿到linux下,META-INF目录和里面的MANIFEST.MF是小写的,这样会造成编译时出现很多错误,所以一定要保证它们是全部小写的。

图1 运行在Linux下的Tree

3、字体和美化问题真是有够麻烦。字体的美化(毕竟眼睛健康很重要),暂时使用这个方案,比较省事吧;解决xmms乱码问题,最简单的方法,卸掉xmms装beep-media-player。

4、设置gnome里的环境变量,//todo,修改.bash_profile后在gnome里竟然不起作用,但在console里就有用;

5、查看deb包安装后的位置,dpkg -L xxx;

6、屏幕截图用printscreen即可,可以截全屏或一个窗口区域;或者scrot -d 5延迟5秒截图,适合截菜单界面,因为gnome里打开菜单后热键会失效;

7、安装gnome主题(gnome-looks.org),要在~/.themes和~/.icons下分别放不同的主题文件;模拟mac的 start bar要装gdesklets,我感觉不太实用;安装gdm主题,运行gdmsetup;安装xmms主题,似乎要重启gnome才可生效;

8、gnome下的音量控制用gnome-media;gnome下的apt用gnome-apt(alpha版,小心使用);安装deborphan可以找到不被任何包使用的库,然后apt-get remove之就可以节省出一些空间;

9、其他很多软件,推荐:Windows软件的Liunx版本替换表,俄国人写的;

10、解压缩.tar.gz文件的方法:tar zxvf a.tar.gz;解压缩.tar.bz2文件:tar xfj a.tar.bz2;

11、关于网卡的配置:apt-get install etherconf,然后dpkg-reconfigure etherconf;如果无线网络需要密码,iwconfig eth1 key xxxxxx就可以了 ,或者在/etc/network/interfaces里加上wireless_key xxxxxx的配置;要改为自动获得ip时,执行dhclient eth1;

12、从www.rssowl.org下载rssowl阅读blog,但我发现rssowl在linux下内置的浏览器有些问题,很多格式丢失了,看起来会比较费力;

13、要在linux里远程桌面到windows xp系统,apt-get install grdesktop;

14、在gaim里用代理服务器上msn,直接在首选项里设置http代理会提示“访问被禁止:代理服务器禁止端口1863流过”,应该在msn帐号里选择使用http方式,并设置代理服务器;

15、安装mysql很简单,直接apt-get install mysql-server-4.1就可以了,使用上比windows的gui方式稍微麻烦些,见这篇文章;另外,从windows版本的mysql里直接拷出来的库不能拿来用,因为表名和字段名在linux里区分大小写。

16、安装teTex:在sources.list里添加ustc的源deb http://debian.ustc.edu.cn/debian-uo/ sid marillat rareware misc ustc,然后apt-get install tetex-bin tetex-base tetex-extra cjk-latex dvipdfmx dvipdfm-cjk ttf-arphic* tfm-arphic*

为了能使用中文,在这个网站下载gbkfonts工具,静态的那个即可。用下面的命令配置一下:

mkdir ~/texmf
cd ~/texmf
gbkfonts /usr/share/fonts/zh/simsun.ttf song 
gbkfonts /usr/share/fonts/zh/simkai.ttf kai
mv cid-x.map dvipdfm/config/
mkdir dvips/config
mv cjk.map dvips/config/

cp /usr/share/texmf-tetex/dvips/config/config.ps dvips/config/
echo "p +cjk.map" >> dvips/config/config.ps
mv pdftex.cfg pdftex/config/
mktexlsr

配置中文的部分来自这个网页,修改了一些地方。在.tex文件里像下面这样写就可以显示中文了

\documentclass{article}
\usepackage{CJK}
\begin{document}
\begin{CJK}{GBK}{song}
这是 latex
\end{CJK}
\end{document}

17、apt安装samba,然后修改/etc/samba/smb.conf,把 security = user前的分号去掉; touch /etc/samba/smbpassword 生成smbpassword文件,再smbpassword -a username添加一个user。显示中文,在smb.conf里边的[global] 栏目下添加一行:client code page 936(用windows访问正常,但用palm上的wifile访问时文件名的中文部分都是空白)

Debian安装备忘

对linux的兴趣时断时续,以前用的都是redhat,这次换用Debian吧,希望能坚持一直用下去,直到完全替代windows。这是安装Debian的过程,遇到的问题和解决方法,备忘。

1、用分区工具如PQMagic划出一块空闲分区,我给的大小是4G;

2、下载debian当前版本的第一张光盘映像,刻成光盘;

3、用这张光盘启动,在boot时输入linux26用2.6内核启动,选择语言为中文,其余按提示操作,注意分区时选择最大空闲空间,自动分区即 可。安装时曾遇到过无法dhcp连接的问题,后来把网线插在无线路由器上就解决了,原来一直是插在歌华有线送的cable-modem上,很奇怪在 win2000下这样是可以得到IP地址的;

4、无线网卡的配置。我用的是Netgear WG511网卡,方法是在http://prism54.org/%7Emcgrof/firmware/下 载最新的firmware版本,更名为isl3890和isl3877各一份放在/usr/lib/hotplug/firmware下面(用grep FIRMWARE_DIR /etc/hotplug/firmware.agent命令找到),对于2.6版本的内核需要mount sysfs,方法如下:

mkdir /sys 
Add "none /sys sysfs defaults 0 0" to /etc/fstab 
mount /sys

再在/etc/network/interfaces里添加这样两句(假设无线网卡的代号是eth1),

auto eth1 
iface eth1 inet dhcp

这样用ifup就可以启动无线网卡并通过dhcp获取ip地址了:

ifup eth1

这个是关于prism(WG511所使用的芯片)驱动的wiki网站http://prism54.org/phpwiki

4、apt-get install gdm gnome-core x-window-system-core ttf-arphic-uming,其中ttf-arphic-uming字体是为了让gnome显示中文(虽然不是非常好看);安装小企鹅输入法, apt-get install fcitx,完成后要做一些设置:把下面的内容保存为/etc/X11/Xsessin.d/25chinput-start,然后重新启动X或重新启动 系统:

export XMODIFIERS="@im=fcitx" 
export XIM=fcitx 
export XIM_PROGRAM=fcitx 
fcitx&

如果需要配置fcitx的参数,可以修改/root/.fticx/config文件;

5、因为屏幕1400x1050算非标准分辨率,所以在/etc/X11/XF86Config-4里添加这个值,然后在gnome里就可以把桌面设置为这个分辨率了;

6、(从现在开始是在Debian里写了;)要在面板上显示电池电量,先要安装acpid,然后在面板上添加电池电量监视器即可;

7、这时的声音不正常,用mpg123播放mp3发出刺耳的噪音,apt-get install alsa后,执行alsaconf检测声卡,然后重新启动就好了;

8、安装应用软件:msn用gaim,画图用gimp,收信用evolution,浏览器mozilla firefox,听歌xmms,媒体播放器totem,等等;

9、用优盘mount /mnt/sda1,同时用第二个优盘mount /mnt/sdb1,用pcmcia的读卡器mount /mnt/sde1。写到/etc/fstab里可以简化命令,iocharset=cp936选项可以显示中文文件名。

10、网卡如果要使用静态ip地址(在实验室就是这种情况),/etc/network/interfaces里这样写:

iface eth1 inet static
        address 162.105.131.205
        netmask 255.255.255.128
        broadcast 162.105.131.255
        gateway 162.105.131.129
        dns-nameservers 162.105.129.27

要转换为dhcp时运行$dhclient eth1即可。

11、让cpu支持降频,装cpufreqd,在/etc/modules里添加speedstep-ich;可用的模块列表在这里 /lib/modules/[你的内核版本]/kernel/arch/i386/kernel/cpu/cpufreq;重启服务sudo /etc/init.d/cpufreqd restart。

12、若usb设备不能停止,用这个命令杀掉使用它的所有进程:sync && fuser -m /dev/sda1 -k

[翻译]IAdaptable是什么?

原文地址:http://www.eclipsezone.com/articles/what-is-iadaptable/

IAdaptable在Eclipse里是一个非常重要的接口。对于Eclipse开发老手来说,它就像异常处理和抽象类一样寻常;但是对新手而言,它却令人感到困惑和畏惧。这篇文章将向你解释IAdaptable到底是什么,以及它在Eclipse里起到的作用。

类型转换

Java是所谓的强类型语言,也就是说,每个实例都对应一个类型。其实类型分为两种:声明类型和运行时类型(也分别被称为静态类型和动态类型)。像Python这样的弱类型语言常被称为无类型的语言,其实严格说来不是这样,因为每个实例都对应一个运行时类型,只是你并不需要声明这一点而已。

现在回到Java,为了能够执行一个类的某个方法,这个方法必须在声明类型中可见,换句话说,即使在运行时实例是某个子类型,你也只能执行那些父类型里定义的方法。

List list = new ArrayList(); 
list.add("data");       // 正确,add是List里定义的方法 
list.ensureCapacity(4); // 不正确,ensureCapacity()只在ArrayList被定义 

如果一定要执行特定类型的方法,我们必须先强制转换这个实例到正确的类型。对于上面的例子,我们可以将list转换为ArrayList(译注:原文In this case, we can cast ArrayList to List,怀疑是笔误),因为ArrayList实现了List接口,你甚至可以在运行时通过instanceof关键字检验list是否为ArrayList的一个实例。

可扩展的接口

不幸的是,一个类可能并没有实现你需要的接口,这样就无法进行强制类型转换了。原因有很多,比如只在少数情况下才需要这个接口,或者你需要的接口是在另一个不相关的库里,又或者接口是有了类以后才开发出来的,等等。

这时你就需要IAdaptable了。可以把IAdaptable想象为一个能够动态进行类型转换的途径。对比下面的直接类型转换:

Object o = new ArrayList(); 
List list = (List)o; 

换一种方式,我们可以这样做:

IAdaptable adaptable = new ArrayList();//译注:这里的ArrayList应该不是指java.util.ArrayList 
List list = (List)adaptable.getAdapter(java.util.List.class);

这就是上面所说的动态类型转换,我们所做的事情是试图把adaptable转换为一个List实例。

那么,当可以直接转换的时候为什么要费这个力气通过getAdapter()来转换呢?其实这种机制可以让我们将目标类转换为它并没有实现的接口。举个例子,我们可能想把一个HashMap当作List来用,尽管这两个类的性质并不相同,可以这么做:

IAdaptable adaptable = new HashMap();//译注:这里的HashMap应该不是指java.util.HashMap 
List list = (List)adaptable.getAdapter(java.util.List.class); 

实现IAdaptable接口

大部分IAdaptable的实现是一些if语句的叠加,比如我们现在要实现HashMap的getAdapter()方法,它看起来可能是这样:

public class HashMap implements IAdaptable { 
  public Object getAdapter(Class clazz) { 
    if (clazz == java.util.List.class) { 
      List list = new ArrayList(this.size()); 
      list.addAll(this.values()); 
      return list; 
    } 
    return null; 
  } 
  //  
} 

所做的就是返回一个适配器(adapter,更确切的说是一个副本),而不是进行直接的类型转换。如果参数类型没有被支持,惯例是返回null值(而非抛出异常),代表这个方法失败了。因此,在调用这个方法时,不应该假定它总是返回非null值。

PlatformObject

当然,如果你希望增加一个新的被支持的adapter类型时必须编辑这个类才行(译注:在getAdapter()里增加更多的if语句),这会比较辛苦。而且,既然你已经知道了这个类型,何不直接修改接口声明呢?其实有很多原因使得你并不希望直接编辑这个类(例如更容易保持向下兼容性),也不想改变它的类型(HashMap虽然不是一个List,但可以转换过去)。

Eclipse通过PlatformObject抽象类来解决以上问题,它为你实现了IAdaptable接口,Eclipse平台(Platform)提供了IAdapterManager的一个实现,并且可以通过Platform.getAdapterManager()访问到,它把所有对getAdapter()的请求(调用)委托给一个名为IAdapterManager的东西。你可以将它想象为一个巨大的保存着类和adapter信息的Map,而PlatformObject的getAdapter()方法会查找这个Map。

适配已存在的类

这样,PlatformObject不需要重新编译就能够支持新的adapter类型,这一点在Eclipse里被大量使用以支持workspace的扩展点。

现在假设我们想要将一个只包含String类型元素的List转换为一个XMl节点,这个节点的格式如下:

<List> 
  <Entry>First String</Entry> 
  <Entry>Second String</Entry> 
  <Entry>Third String</Entry> 
</List>

因为toString()方法可能有其他用途,我们不能通过覆盖toString()方法来实现这个功能。所以,我们要给List关联一个工厂类以处理XML节点类型的适配请求。要管理工厂类需要以下三个步骤:

1、由List生成一个Node,我们把这个转换过程用IAdapterFactory包装起来:

import nu.xom.*; 
public class NodeListFactory implements IAdapterFactory { 
  /* 可以转换到的类型 */ 
  private static final Class[] types = { 
    Node.class, 
  }; 
  public Class[] getAdapterList() { 
    return types; 
  } 
  /* 转换到Node的功能代码 */ 
  public Object getAdapter(Object list, Class clazz) { 
    if (clazz == Node.class && list instanceof List) { 
      Element root = new Element("List"); 
      Iterator it = list.iterator(); 
      while(it.hasNext()) { 
        Element item = new Element("Entry"); 
        item.appendChild(it.next().toString()); 
        root.appendChild(item); 
      } 
      return root; 
    } else { 
      return null; 
    } 
  } 
} 

2、把这个工厂类注册到Platform的AdapterManager,这样当我们希望从List的实例中获得一个Node实例时,就会找到我们的工厂类。注册一个工厂类的方式也很简单:

Platform.getAdapterManager().registerAdapters( 
  new NodeListFactory(), List.class 
); 

这条语句将NodeListFactory关联到List类型。当从List里请求adapter时,Platform的AdapterManager会找到NodeListFactory,因为在后者的getAdapterList()方法的返回结果里包含了Node类,所以它知道从List实例得到一个Node实例是可行的。在Eclipse里,这个注册步骤一般是在plugin启动时完成的,但也可以通过org.eclipse.core.runtime.adapters扩展点来完成。

3、从List获得Node,下面是例子代码:

Node getNodeFrom(IAdaptable list) { 
  Object adaptable = list.getAdapter(Node.class); 
  if (adaptable != null) { 
    Node node = (Node)adaptable; 
    return node; 
  } 
  return null; 
} 

总结

综上所述,要在运行时为一个已有的类增加功能,所要做的只是定义一个用来转换的工厂类,然后把它注册到Platform的AdapterManager即可。这种方式在保持UI组件和非UI组件的分离方面特别有用。例如在org.rcpapps.rcpnews.ui和org.rcpapps.rcpnews这两个plugin里,前者的IPropertySource需要与后者的数据对象(data object)相关联,当前者初始化时,它将IPropertySource注册到Platform,当数据对象在导航器(navigator)里被选中的时候,属性视图里就会显示正确的属性。

显然,java.util.List并不是PlatformObject的子类,所以如果你希望能够编译这里所说的例子,必须建立一个List的子类型。注意,可以直接实现IAdaptable接口,而非必须继承PlatformObject抽象类。

public class AdaptableList implements IAdaptable, List { 
  public Object getAdapter(Class adapter) { 
     return Platform.getAdapterManager().getAdapter(this, adapter); 
  } 
  private List delegate = new ArrayList(); 
  public int size() { 
    return delegate.size(); 
  } 
  //  
} 

最后,例子里生成XML的部分使用了XOM的类库.

SWT的PaintListener

以前很少用到这个类(org.eclipse.swt.events.PaintListener),利用它可以用来在control上画一些东西,基本方法是在control上 addPaintListener()一个PaintListener,然后在这个listener里做具体的画图工作,listener在control需要绘制的时候调用。

下面例子代码用来在一个composite的中央绘制一行文字。

package com.test; 
 
import org.eclipse.swt.SWT; 
import org.eclipse.swt.events.PaintEvent; 
import org.eclipse.swt.events.PaintListener; 
import org.eclipse.swt.graphics.GC; 
import org.eclipse.swt.graphics.Rectangle; 
import org.eclipse.swt.layout.FillLayout; 
import org.eclipse.swt.widgets.Button; 
import org.eclipse.swt.widgets.Composite; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Shell; 
 
public class Test3 { 
 
    public static void main(String[] args) { 
        Display display = new Display(); 
        Shell shell = new Shell(display); 
        shell.setLayout(new FillLayout()); 
        final Button button = new Button(shell, SWT.PUSH); 
        button.setText("This is a button"); 
        final Composite comp2 = new Composite(shell, SWT.BORDER); 
        comp2.addPaintListener(new PaintListener() { 
            public void paintControl(PaintEvent e) { 
                String text = "This is a composite"; 
                Rectangle area = comp2.getClientArea();//client area 
                int tw = calcTextWidth(e.gc, text);//text width 
                int th = e.gc.getFontMetrics().getHeight();//text height 
                Rectangle textArea = new Rectangle(area.x + (area.width - tw) / 2, 
                        area.y + (area.height - th) / 2,  
                        tw, 
                        th);//centerized text area 
                e.gc.drawString(text, textArea.x, textArea.y); 
                e.gc.drawRectangle(textArea); 
            } 
 
            private int calcTextWidth(GC gc, String text) { 
                int stWidth = 0; 
                for (int i = 0; i < text.length(); i++) { 
                    char c = text.charAt(i); 
                    stWidth += gc.getAdvanceWidth(c); 
                } 
                return stWidth; 
            } 
        }); 
        shell.open(); 
        while (!shell.isDisposed()) { 
            if (!display.readAndDispatch()) 
                display.sleep(); 
        } 
        display.dispose(); 
    } 
}

运行结果如下图: