EMF介绍系列(二、从模型生成应用程序)

还是从一个例子里看看EMF的使用方法和作用吧。假设我们的应用是一个网上商店,在系统里有这些对象:商店Shop、类别Category、 商品Product,其中类别可以包含子类别。现在我们用EMF从头到尾生成一个可以管理类别和商品的应用程序。如果你的Eclipse里还没有安装 EMF,在eclipse.org/emf 下载适合你Eclipse版本的EMF SDK,建议你下载全部包含的那种。安装后,在新建对话框里会增加EMF的类别,如图1所示:

file
图1 新建向导里的EMF类别

其中“EMF Model”是从已有的模型文件创建genmodel模型,这个模型是专门用来生成代码的;如果你手里已经有一个模型(比如一个.mdl文件或是一个.xsd文件等等),可以选择新建“EMF Project”,这样在向导的后面部分里会要求提供已有的模型文件;因为我们打算自己从头开始建立这样的模型,所以选择“Empty EMF Project”,和建立普通插件一样,要提供一个插件名称,我们为这个商店项目起名为com.my.shop,然后按Finish即完成向导。目前这个新建立的 项目里还没有包含任何代码,只是在META-INF/MANIFEST.MF文件里定义了对EMF相关插件的依赖。

下面开始定义ecore模型,我比较喜欢图形化的方式,因为看起来很直观,所以我使用Omondo公司的EclipseUML插件来画类图,这个插件的免费版本在 它们网站下载,注意下载适合你的Eclipse的版本。当然rose也不错而且更加稳定,但它 不是免费的,而且只能在Windows里使用。和Rose不同,EclipseUML对EMF有特别的支 持,安装这个插件后,我就们可以在项目里新建一个“EMF Class Diagram”,这样会同时创建一个.ecd文件和一个.ecore文件,EclipseUML编辑的类图信息会保存在这两个文件里,前者主要是图形方 面的内容,而后者是真正的模型信息,注意这两个文件中的任何一个都不要搞丢了,最好能经常备份一下。

在EclipseUML里编辑类图很简单,需要注意的是,两个对象之间如果有关联,要仔细考虑关联是否为“包含”关系(一般在UML中以黑色菱形表 示),如果一个类没有包含在任何其它类里,则这个类的实例不会被保存到文件。例如图2中Category包含在Shop中,Product包含在 Category中。这样,所有的对象都直接或间接的被Shop对象包含。换句话说,如果以Shop作为“根”,所有的对象都可以被保存到文件里。

EMF对java基本类型和一些常用类做了包装,例如int->EInt,java.lang.Integer->EInteger以 及java.util.List->EList等等,所以在定义类的属性时要使用这些EMF的类型,当然也有办法使用自定义类型(以后会用到)。我 们例子里的模型相当简单,一共只有三种业务对象(为了更加直观,我们增加了一个NamedElement接口),现在网上 商店类图的第一个版本如图2所示。

file
图2 网上商店类图(版本1.0)

接下来就要生成代码了。EMF使用JET利用模板生成代码(前面曾介绍过JET),所以要把ecore模型转换为可以被JET利用的genmodel模型,具体的操作是按 ctrl+n新建一个EMF Model,在这个向导的第一步指定名称shop.genmodel,第二步选择从ecore模型导入,第三步选择ecore模型文件 (shop.ecore),这样就建立了缺省的genmodel模型,在这个模型的基础上还可以做一些定制工作,例如每个属性的描述信息等等。

有了genmodel模型,离得到可用的java代码就只有一步之遥了。打开shop.genmodel文件,在根节点上点开右键菜单(见图3),如果只想生 成模型代码选择“Generate Model Code”,如果需要.edit的代码(EMF提供的一些ItemProvider和AdapterFactory,帮助实现编辑器)和可用的编辑器,选 择“Generate All”最方便,这也是例子里选择的方式。EMF的代码生成器为模型、.edit、编辑器和测试代码各生成一个插件项目 (com.my.shop、com.my.shop.edit、com.my.shop.editor和com.my.shop.tests),前三个是后者依赖前者的关系。这里插上一句,即使没有 用EMF的项目,也建议把模型和界面使用不同的插件项目分开,这样做有很多好处,主要是灵活性大大提高了。

file
图3 从菜单里选择生成部分或全部代码

现在可以运行起来看看效果了,注意我们甚至连一句代码也没有写呢。EMF为我们生成了一个新建向导(New Wizard),利用这个向导可以生成新的Shop实例,注意在第三步要选择以Shop类为根类型。编辑器的运行界面如图4所示,它的外观虽然有待改进,但功能已 经足够我们对网上商店里的类别和产品进行编辑了。在以后的帖子里,我们要对网上商店的ecore模型和编辑器的界面做一些修改。

file
图4 缺省的编辑器界面

搬家前链接:https://www.cnblogs.com/bjzhanghao/archive/2005/11/13/275054.html

EMF介绍系列(一、EMF与MDA)

接触Eclipse一段时间的朋友应该都听说过EMF这个名字,EMF是Eclipse Modeling Framework的缩写,它是Eclipse的一个重要的子项目,如果翻译成中文就是“Eclipse建模框架”。其实只从这个名字还真是难以确定它的 作用是什么,我认为要完全掌握EMF应该对模型驱动开发(MDA)有一定的了解,而EMF可以看作是Eclipse上的MDA一个实现(代码生成是MDA 的重要组成部分之一),它能够生成在Eclipse上执行的代码。可惜我对MDA没有系统研究过,对EMF的应用大多是为了减少模型修改带来的影响,所以 也希望EMF能带我进入MDA的世界。

MDA讲究的是把模型和应用系统实现分开,模型是最重要的部分,可以说有了清楚的模型,就完成了一半的工作。模型是由元模型(Meta Model)定义的,例如UML里“类”和“属性”这些概念是在UML的元模型里定义的,而元模型又是由“元元模型”来定义,后者多是自描述的,也就是能 够自己定义自己,所以很少见到“元元元模型”的概念。在MOF规范里, 元元模型处于M3层,元模型处于M2层,往下的M1层是模型,而M0层是实例。EMF定义了一套Ecore元模型,该模型是EMOF(MOF的一个子集, MOF是Meta-Object Facility的缩写)的一个实现,这是一个自描述的模型,可以认为它处于MOF中的M2层,即与UML元模型相同的位置。用Ecore元模型可以定义 ecore模型,也就是.ecore文件,这个模型处于M1层,而ecore模型的实例处于M0层。关于MOF的更多概念请参考MOF规范和相关文档, MDA的各种概念是相当多的,研究它的人也很多,我认为EMF算是比较务实的一派。如果以后有机会深入研究Ecore元模型,我也会把心得写在这里供大家 参考。

EMF自发布以来一直受到Eclipse社区的热情拥护,目前很多Eclipse的子项目都是基于它开发的,可见EMF确实能给开发者带来好处。随着EMF的成长,出现了越来越多的文档,在eclipse.org/emf上就可以找到不少,最全面和权威的当属这本Eclipse Modeling Framework A Developers Guide, 完整的讲解了EMF,虽然针对的版本较早,但绝大部分内容还是适用的;作为入门读物,网站上Documents里列出的一些教程也是不错的选择;EMF的 新闻组更是一个很好的交流场所,Ed Merks(EMF设计师之一)和其它几位开发人员可以说是有问必答,感谢他们的认真态度。

通过在一些项目里使用EMF,我也逐渐感觉了到它起到的作用,特别是当模型里各种元素和关系比较多时,EMF的代码生成功能会节省不少工作量,对于 我们开发人员来讲,这不就是最大的好处吗。其实用EMF构造一个应用的步骤很简单:1、构造模型,2、生成代码,前者可以通过UML类图、Java接口、 XML Schema等多种方式定义,后者可以选择只生成模型部分的代码,也可以同时生成编辑器部分的代码,对这个编辑器做一些定制就可以得到符合需求的应用程 序。

类图可以帮助我们直观的了解应用系统里各对象的关系,但在开发过程中,类图里的定义很可能被修改,如果这一修改没有及时反映回类图,类图就会逐渐变 得不准确而失去作用。但是保持代码和类图的一致是一件很烦琐的工作,有时由于项目管理的需要,类图又必须保证能够反映系统的真实结构。比较好的解决方法是 让代码由类图直接生成,模型需要修改时也在类图上做改动,并且重新生成代码,这正是EMF的专长。

说了这么多,你可能还是没弄明白EMF到底能为我们带来哪些好处,是怎样为我们节省工作量的,从下个帖子开始我们将一步步了解怎样使用EMF构造应用程序。因为是边用边写,所以这个系列的帖子都不会太长,相信后面部分会以心得和技巧等内容为主。

搬家前链接:https://www.cnblogs.com/bjzhanghao/archive/2005/11/12/275024.html

用Debian遇到的部分问题和解决

1、待机命令

echo mem>/sys/power/state

这之前要确认acpid服务已经启动;

2、打开Firefox的profilemanager

firefox -profilemanager

3、支持speedstep,在/etc/modules里加入speedstep-ich、cpufreq_powersave和cpufreq_userspace这三项,其中第一项是针对PIIIM的笔记本,如果是迅驰用speedstep-centrino;

4、查看pcmcia读卡器的设备名

cat /proc/partions

5、释放空间:

apt-get clean

6、Linux下听ape用SuperMMX的mac-port:http://sourceforge.net/projects/mac-port/

7、从stable转换到testing后,在一个窗口输入过汉字后,alt-tab会失效无法切换到其他窗口,考虑是fcitx的问题,所以决定 换输入法系统。apt-get install scim,scim-tables-zh,scim-gtk2-immodule,然后编辑/etc/X11/Xsession.d/90chinput -start内容如下:

export XMODIFIERS=@im=SCIM
export XIM=xim
export XIM_PROGRAM="scim -d"
export GTK_IM_MODULE=xim
export QT_IM_MODULE=xim
scim -d

scim-tables-zh里并不包括拼音输入法,所以apt-get install scim-pinyin(这个包以前叫scim-chinese),而且我是添加了一个unstable源才找到的。

Update2006-4-21:解决有些程序里不能输入中文的问题,要安装scim-gtk2-immodule这个包,然后把上面的90chinput-start文件改为如下:

export XMODIFIERS="@im=SCIM"
export GTK_IM_MODULE="SCIM"
scim -d

8、手动关闭显示器

xset dpms force off

9、更改gnome的splash:#update-alternatives --config desktop-splash,(来自Debian学习笔记

10、用totem播放其他格式:从这个地址下载win32codecs-essential-20040703.tar.bz2和rp9codecs-20050115.tar.bz2,解开的内容放到/usr/lib/win32(如果不存在建一个)即可。

11、DNS解析很慢可能是ipv6造成的,去掉ipv6的方法:在/etc/modprobe.d/aliases中,把“alias net-pf-10 ipv6”注释掉,然后update-modules,再重启。(这个方法更方便:在firefox地址栏里输入about:config,用 filter找到network.dns.disableIPv6,修改为true。来自Ubuntu快速入门手册

12、如遇到空间不足,可以考虑先清掉apt的cache:apt-get clean;还可以用debfoster工具删除不需要的deb包。

13、文件名转码工具convmv,用于转换windows分区拷文件过来可能出现文件名乱码,例如

convmv -f utf8 -t cp936 --notest *

14、把从cd抓下来的ape文件分为多个:安装cuetools和shntool,然后cuebreakpoints -i cue CDImage.cue|shnsplit -n track CDImage.ape,这样得到的是多个.wav文件,可以给shnsplit加-o ape参数转为ape,但要使用特别的mac版本,在shntool主页有下载。

15、修改grub的背景:修改/boot/grub/menu.lst,加入splashimage (hd0,2)/boot/grub/images/xxx.xpm.gz,图片文件要自己制作或者下载现成的。

16、修改console分辨率,在menu.lst的kernel行最后加入vga=791,表示1024x768的分辨率。好像还可以vga=ask?

17、彩蛋:在gnome里按alt+f2打开运行程序对话框,输入free the fish,会出现一条小鱼(旺达)在屏幕上游动。

18、对时用ntpdate,教育网内时间服务成员列表

19、用wget批量下载,方法1:seq 20 | awk '{print "http://mydomain/file"$1".zip"}' | wget -i -;方法2:for i in seq 1 20;do wget http://domain/$i.txt;done;更简单的:curl http://mydomain/file[1-20].zip -O

20、代理服务器的环境变量:

export http_proxy="myproxy:port"
export ALL_PROXY="myproxy:port"

21、使用usb光驱

mount -t iso9660 -o iocharset=cp936 /dev/scd0 /mnt/usb

22、网卡命名:nameif(链接

23、同步internet时间

ntpdate time.nist.gov

搬家前链接:https://www.cnblogs.com/bjzhanghao/archive/2005/11/09/272253.html

SWT里Slider和Scale的区别

以前以为SliderScale之间只是外观的区别,今天发现不是这样的,因为Slider有一个特点:getSelection()能得到的最 大值并不是getMaximum()的值,要减去getThumb()值,后者是中间的滑块所拥有的值,缺省为10,最小为1。运行这个程序观察控制台的 输出。

import org.eclipse.swt.*;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.*;

public class SliderTest {

    public static void main(String[] args) {
        Display display = new Display();
        Shell shell = new Shell(display);

        //Slider
        final Slider slider = new Slider(shell, SWT.HORIZONTAL);
        slider.setBounds(10, 10, 200, 32);
        slider.setMinimum(0);
        slider.setMaximum(100);
        slider.setThumb(5);
        slider.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                System.out.println("Slider Selection:" + slider.getSelection());
            }
        });

        //Scale
        final Scale scale = new Scale(shell, SWT.HORIZONTAL);
        scale.setBounds(10, 50, 200, 72);
        scale.setMinimum(0);
        scale.setMaximum(100);
        scale.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                System.out.println("Scale Selection:" + scale.getSelection());
            }
        });

        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }
}

搬家前链接:https://www.cnblogs.com/bjzhanghao/archive/2005/10/26/262517.html

EMF+GEF的属性页问题

最近有朋友问使用EMF作为GEF模型时,如何在选中editpart时在属性页里显示属性的问题。是的,因为GEF是这样判断是否填充属性 页的:

public Object getAdapter(Class key) {
    if (IPropertySource.class == key) {
        if (getModel() instanceof IPropertySource)
            return getModel();
        if (getModel() instanceof IAdaptable)
            return ((IAdaptable)getModel()).getAdapter(key);
    }
    if (AccessibleEditPart.class == key)
        return getAccessibleEditPart();
    return null;
}

所以,一般(不使用EMF)我们让模型类实现IPropertySource接口即可看到属性。而用EMF生成的模型类是不实现这个接口的,因此用户在界面上选中 editpart时属性页里只能是空白。

要解决这个问题,一种方式是覆盖editpart的getAdapter()方法,返回一个自定义的PropertySource, 这个办法比较直接,但那么多属性写起来很麻烦,更重要的是当ecore模型改变后这些属性是不会跟着变的;另一种方式是在editor类里作文章,工作量 比较小,具体办法如下:

ModelItemProviderAdapterFactory adapterFactory;
AdapterFactoryContentProvider adapterFactoryConentProvider;

//Constructor of the editor
public TobeEditor() {
    setEditDomain(new DefaultEditDomain(this));
    //For getting propertysource from emf.edit
    adapterFactory = new ModelItemProviderAdapterFactory();
    adapterFactoryConentProvider = new AdapterFactoryContentProvider(adapterFactory);
}

public Object getAdapter(Class type) {
    if (type == IContentOutlinePage.class)
        return new OutlinePage();
    if (type == org.eclipse.ui.views.properties.IPropertySheetPage.class) {
        PropertySheetPage page = new PropertySheetPage();
        UndoablePropertySheetEntry root = new UndoablePropertySheetEntry(getCommandStack());
        root.setPropertySourceProvider(new IPropertySourceProvider() {
            public IPropertySource getPropertySource(Object object) {
                if (object instanceof EditPart) {
                    Object model = ((EditPart) object).getModel();
                    return new PropertySource(model, (IItemPropertySource) adapterFactory.adapt(model,
                            IItemPropertySource.class));
                } else {
                    return adapterFactoryConentProvider.getPropertySource(object);
                }
            }
        });
        page.setRootEntry(root);
        return page;
    }
    return super.getAdapter(type);
}

也就是对UndoablePropertySheetEntry做一些处理,让它能够适应editpart的选择(GEF里选中元素的都是 editpart而非model本身)。这个方法在显示属性方面没有什么问题,但在属性页里修改属性值后,是不能undo的,而且不会显示表示dirty 的*号,所以还有待改进。

EMF+GEF里像这种别扭的地方还远不只这一处,不过我相信大部分都是可以适当修改一些代码解决的,希望它们之间增加一些合作,同时继续期待GMF

搬家前链接:https://www.cnblogs.com/bjzhanghao/archive/2005/10/24/261106.html

把GEF放在ViewPart里

其实GEF可以放在任何Composite上,当然也就可以放在视图里了。关键任务是创建GraphicalViewer、RootEditPart、EditDomain和EditPartFactory这些对象,下面的代码是我从别处拷来的,稍微修改了一下。

public class TestView extends ViewPart {
    ScrollingGraphicalViewer graphicalViewer;
    FigureCanvas canvas;
    Diagram diagram;

    public void createPartControl(Composite parent) {
        graphicalViewer = new ScrollingGraphicalViewer();
        canvas = (FigureCanvas) graphicalViewer.createControl(parent);
        ScalableFreeformRootEditPart root = new ScalableFreeformRootEditPart();
        graphicalViewer.setRootEditPart(root);
        graphicalViewer.setEditDomain(new EditDomain());
        graphicalViewer.setEditPartFactory(new PartFactory());
        graphicalViewer.setContents(diagram);
    }
}

运行结果如下,这个基本上只有视图的功能,也可以增加编辑功能,例如对GraphicalViewer加一个DropTargetListener就可以从调色板里拉对象上来了,等等。这个代码有点问题,就是打开View后要调整一下大小才能显示出图形,该怎么解决呢……

file

搬家前链接:https://www.cnblogs.com/bjzhanghao/archive/2005/10/21/259500.html

把第三方jar文件包装为plugin

前面说过,输出eclipse插件的时候问题比较多(google搜索3rd party jars site:dev.eclipse.org),特别是使用了第三方jar文件的时候。有一个比较方便的办法是把这些jar文件包装为一个单独的插件,然后 你的功能插件用dependencies的方式引用它们,这也是eclipse推荐的方式。

在eclipse里包装jar包很容易:按ctrl+N,在新建对话框里选择Plug-in from existing JAR archives,按下一步选择你需要的jar文件,再下一步指定这个plugin的名称,注意这一步里一般要把最下面的Unzip the JAR archives into the project选项清除,否则eclipse会把jar文件全部展开为.class文件树,最后按Finish就可以了。

奇怪的是,我不使用上面这种方式,用建立普通plugin项目的方式怎么也无法建立好包装plugin,表现为其它plugin依赖它后找不到里面的那些类。

搬家前链接:https://www.cnblogs.com/bjzhanghao/archive/2005/10/17/256330.html

Debian里编译内核

以Debian 2.6.8版本为例:

1、Debian.org上关于编译内核的说明;另一篇看起来不错的文章:Creating custom kernels with Debian's kernel-package system

2、下载内核源代码apt-get install kernel-source-2.6.8,在/usr/src下得到kernel-source-2.6.8.tar.bz2文件,用tar xfj命令展开;

3、下载需要的patch,比如休眠功能的patch是kernel-patch-suspend2,注意目前在experimental里才有,所以要在/etc/apt/sources.list里加上必要的源;

4、执行以下操作,如果当前语言是中文,执行前最好执行zhcon进入中文环境:

# cd /usr/src/kernel-source-2.6.8
# cp /boot/config* .
# make-kpkg clean
# make-kpkg --append_to_version -2 --added_patches suspend2 --config menuconfig
# make-kpkg --append_to_version -2 --initrd kernel_image
# cd ..
# dpkg -i kernel-image-2.6.8-2.i386.deb

注意在menuconfig的时候先载入原来的配置文件,即上面第二行复制过来的/usr/source/config-xxx文件,然后在这个配置上进行修改;另外,我如果不加--initrd参数,则新内核无法启动。

5、重启电脑用新内核启动。

Update(2005/12/23):不加--initrd参数可以启动了,关键是在menuconfig的时候要把ext2,ext3等文件类型加入内核,同时要把对ide设备的支持直接加入内核,我以前只注意了前者。

搬家前链接:https://www.cnblogs.com/bjzhanghao/archive/2005/10/13/254213.html

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是小写的,这样会造成编译时出现很多错误,所以一定要保证它们是全部小写的。

file

图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
apt-get install 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访问时文件名的中文部分都是空白)

搬家前链接:https://www.cnblogs.com/bjzhanghao/archive/2005/09/30/247027.html

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版本,更名为isl3890isl3877各一份放在/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

搬家前链接:https://www.cnblogs.com/bjzhanghao/archive/2005/09/26/244596.html