帐前卒专栏

code, software architect, articles and novels.
代码,软件架构,博客和小说

转载自 http://tech.ddvip.com/2009-02/1234594734108774.html

一、c程序存储空间布局

C程序一直由下列部分组成:

1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令;

2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。

3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。

4)栈——增长方向:自顶向下增长;自动变量以及每次函数调用时所需要保存的信息(返回地址;环境信息)。

5)堆——动态存储分。

` |-----------|

-----------
/
-----------
-----------
未初始化
-----------
初始化
-----------
正文段
-----------

二、 面向过程程序设计中的static

1. 全局静态变量

在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。

1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)

2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)

3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。

定义全局静态变量的好处:

<1>不会被其他文件所访问,修改

<2>其他文件中可以使用相同名字的变量,不会发生冲突。

2. 局部静态变量

在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。

1)内存中的位置:静态存储区

2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)

3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。

注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。但是局部静态变量在离开作用域之后,并没有被销毁,而是
仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进行访问。

当static用来修饰全局变量的时候,它就改变了全局变量的作用域(在声明他的文件之外是不可见的),但是没有改变它的存放位置,还是在静态存储区中。

3. 静态函数

在函数的返回类型前加上关键字static,函数就被定义成为静态函数。

函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。

定义静态函数的好处:

<1> 其他文件中可以定义相同名字的函数,不会发生冲突

<2> 静态函数不能被其他文件所用。

存储说明符auto,register,extern,static,对应两种存储期:自动存储期和静态存储期。

auto和register对应自动存储期。具有自动存储期的变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该程序块时撤销。

关键字extern和static用来说明具有静态存储期的变量和函数。用static声明的局部变量具有静态存储持续期(static storage
duration),或静态范围(static
extent)。虽然他的值在函数调用之间保持有效,但是其名字的可视性仍限制在其局部域内。静态局部对象在程序执行到该对象的声明处时被首次初始化。

扩展分析:

术语static有着不寻常的历史.起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量。随后,static
C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。为了避免引入新的关键字,所以仍使用static关键字来表示这第二种含义。最后,

C++重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数(与Java中此关键字的含义相同)。

** class BadPaddingException ** 这个类传说是sun的实现。
** enum BaseDirectory ** ,枚举类型的类,其实就是来设置  HOME( “euca.home” ),VAR( “euca.var.dir” ),CONF( “euca.conf.dir” ),LOG( “euca.log.dir” )这四个变量的。
** class BasicClient, ** 实现了Client,其中包含有serverclient和httpclient两个,主要使用uri进行连接的类。因为使用Axis2所以还没看懂。

** class BCrypt ** ,这个类竟然有注释!BCrypt implements OpenBSD-style Blowfish password hashing using the scheme described in “A Future-Adaptable Password Scheme” by Niels Provos and David Mazieres.实现了一个OpenBSD中的密码机制。来自于A Future-Adaptable Password Scheme一文。

** bin-assembly.xml ** 主要是为了将各个文件war包,jar包,so文件等集合在一起,包括其依赖关系。可能有自动化的程序代为处理吧。

** class Binding ** ,这个类看样子是一个抽象工厂的类,将class名和class的实例类型当做参数传入,然后得到IBindingFactory的某个实现类的实例。

** class BindingManager ** ,其实就是一个map,关于Binding类和绑定名的map.

** class BindingUtil ** ,这个类就是做了一个string中特殊字符的替换,先将http://和字符串末尾的"/"去掉,然后再将./-变为_,也就是说http://blog.csdn.net/cctt_1/将变为blog_csdn_net_cctt_1.

** interface BlockStorageManager ** ,主要是管理逻辑磁盘,快照,得到某个逻辑盘集合状态的接口。

** class BucketAlreadyExistsException ** ,这个异常类继承了 ** EucalyptusCloudException ** ,而EucalyptusCloudException又继承了 ** AxisFault ** 。 不过这里的bucket是指的什么?

** class BucketAlreadyOwnedByYouException ** ,这个异常类也继承了 ** EucalyptusCloudException ** ,从名字上很明显就是不不能将已经分配给你的bucket再重复分配给你。

** class BucketInfo ** ,这就是bucket的类了。里面有几个属性,bucketid,所有者的id,bucket的name,bucket创建的时间,是否全局读写,这个bucket所拥有的objects和那些objects的Info,global_read_acp和global_write_acp 这里acp是什么? bucket的size,位置,bucket的所有授权和授权信息。授权里的信息可以表明能否有读写acp的权限。 不过我还是不明白bucket是啥米?

** class BucketNotEmptyException ** ,同样继承了EucalyptusCloudException, 不过什么时候会抛出这个异常呢?

下面是一堆build.xml,这个是ant的build.xml.

** class Bukkit , ** 这个类是管理存储空间,bucket,image的类,应该是clc的核心类(image管理)。好像Eucalyptus中设置每个用户的最大bucketsize为5.其中也含有创建bucket的方法.终于渐渐有点眉目了,其实就是Eucalyptus中将image上传 Walrus的过程。 详情查看 ,并且含有解密Image和检查Manifest的过程。其中这个java文件中还含有几个内部类: ** class ImageCacheFlusher ** ,这个是私有的。并且是个线程类,调用的是私有函数flushImageCache主要用于将Image写入并清除ImageCache.上面还有一个共有函数FlushImageCache,和这个私有函数的区别在于没有使用信号量,并且首字母是大写的。 ** class ImageCacher ** 也是一个私有线程类,主要用于将Image做Cache. ** class StreamConsumer ** 同样是一个私有线程类,大意应该是做上传操作的。Eucalyptus中一个IO Chunk size的大小为102400byte也就是100KB.class Tar私有类主要是untar,解密Image用的。 ** class Reader ** 是一个default的线程类,是用于读取一个Object用的也是每100KB一读。 ** class SnapshotDeleter ** 也是私有线程类,用于快照的删除。

** class BukkitImageTest ** 做测试用的,继承于TestCase

** class BukkitTest ** ,继承于TestCase,是测试Bukkit用的。

其实可以按照厂家的步骤一步一步的走,不过有个前提条件。

就是你必须首先把你的ip地址设置为自动获得,然后用针呀笔呀之类的点击路由器上的reset。方可继续配置。如果你的ip已经设置完毕,是不能找到那个http:/
/192.168.0.1地址。

如果找到了就可以按照那个设置向导来配置。如果你的ip是别人分给你的ip并且和自己机器的mac地址绑定了,就把那写ip,mac,掩码啥的都填成和你PC机过去能
上网时配置一致的。这就让路由取代了你的机器的位置。下一步你可以设置路由动态的分配ip,这样路由相连的多台机器,不用配置ip就可以连网了。不过这只是用于公司内
部网络,对于ASDL或者DSL而言,我还没有试过。如果想让你的机器保持在192.168.1.0的网段,只要改掉路由的ip即可。不过改动之后,你要拔下网线再插
上,或者ifconfig up or
down,否则你的找不到http://192.168.1.1这个地址的,因为你的ip刚才已经被动态的分为192.168.0.1

以下命令如果不能被使用,就试试转为root用户,或者使用sudo命令。

想要查看某个用户所在的组只需要使用

groups username

输出的便是username所在的组。

想添加一个用户可以使用useradd username

这时新添加的用户没有密码,只属于自己的组(如果用户为tt1,那么所属的组也为tt1),没有自己的home目录。

想修改其密码使用passwd username,想添加到一个组可以使用usermod -g groupname
username,如果想加入多个组可不能频繁的使用usermod -g命令,因为它只是用来添加到一个组中。使用usermod -G groupname
username可以让用户加入到两个组中,但是继续使用usermod -G依旧只能加入两个组。可以使用gpasswd -a username
groupname就可以将用户加入到多个组中。

记下点简单的命令。

A Eucalyptus cloud setup consists of three types of components – the cloud
controller, the cluster controller(s), and the node controller(s). The cloud
controller is a Java program that, in addition to high-level resource
scheduling and system accounting, offers a Web services interface and a Web
interface to the outside world. Cluster controller and node controller are
written in C and deployed as Web services inside Apache.

Eucalyptus使用了 ** Axis2 ** ,啥是Axis2或者说Axis2有啥用。Axis就是快速发布web
service的工具,提供了SOAP协议的封装,方便于client端于webservice通信。

log机制使用了log4j。

使用X509认证。

** class AbstractIsomorph ** ,注释为MappedSuperclass,个人认为是一个保存用户信息和状态的抽象类。

** class AbstractKeyStore ** ,这个抽象类很有意思,其静态方法调用了子类的构造函数。并且子类GenericKeyStore是其内部类。感觉设计得不好。其意图是让这个类含有几个抽象的方法,但是这几个抽象方法有一个默认的实现。AbstractKeyStore主要是为了添加证书查找证书,并查找用户名对应的password来认证。并且将alias,cert添加到某一文件中。并将此alias对应的password放入到keystore中。

** class AbstractNamedRegistry ** ,这个抽象类将存放、更新某种继承自HasName接口的对象的两种状态。一种是active,一种是disable,这两种状态放在ConcurrentNavigableMap中,并且以对象的名作为key,value就是对象自身。

** class AbstractOperation ** ,这个抽象类是操作的抽象,并认为凡是操作就应该有request和reply,并且request和reply继承自EucalyptusMessage

** class AccessDeniedException ** ,就是一个禁止访问的异常,继承自EucalyptusCloudException。

** class Address ** ,这是一个address类(废话),存放地址id, 地址名(?? 个人认为可能是真实地址) ,cluster的地址,使用者的用户名,实例地址等(其实就是一个描述实例所需要的属性。)并使用高性能锁ReentrantReadWriteLock加以控制。 加锁是为了将实例assign出去,或者收回。不过我个人觉得ReentrantReadWriteLock可能使用的有问题。以为我看到函数release()中有this.canHas.writeLock().lock();,并在之后调用了unassign()方法,而unassign()方法中也有this.canHas.writeLock().lock();…难道可以对同一写锁加两次lock?不过我没有研究过ReentrantReadWriteLock。

** class Addresses, ** 这个类继承了 ** AbstractNamedRegistry, ** 并且可以填入 ** Address ** .这就是说,这个类是用来active,disable一个address的。另外它是用来单实例模式,也就是整个cloud中只有这一份实例。( 这里会不会崩溃后无法恢复的问题? )

** class AddressManager ** ,继承了org.mule.api.lifecycle.Startable类, Startable可能是处理生命周期吧 …不过这个类是和地址相关的,是用来分配,释放,将address和vm关联起来的类。

** class AddressUpdateCallback ** 继承了QueuedEventCallback并且实现了Runnable,也就是说它可以作为一个线程类。另外它sleep的时间好像有点过长了51000.这个类的作用好像是将用户名封装到msg中,然后发送给cluster队列来处理。之后睡一个51000秒,然后再醒来看看是否有cluster的回复,然后根据回复设置实例的地址。这里采用线程,是因为需要一直监督address的更新。可以看成是守护线程。

add_key.pl,这个是perl文件,看不太明白,应该是加入了ssh的public key.不过中间为啥使用loop
device,并且将图片加载到loop device上就不得而知了。后来发现,这里image的含义不是图片的意思,而是镜像,也就是将镜像加载到loop
device上。

add_key~add_wsdllocation.pl都是perl写成的。

** class Admin ** 是用来创建EucalyptusMessage的类。

** admin.xml ** 用来配置www的conf的。
** interface Allocator ** ,这接口用来分配的,根据String requestId, String userName, String vmtype, int min, int max, SortedSet clusters 来分配资源,会抛出NotEnoughResourcesAvailable异常

** class AlreadyExistsException ** 继承了RuntimeException

** class AOEManager ** 继承了StorageExportManager,是用来导出存储容量的?

** interface AppMessages ** 继承了Messages,从其函数中看,是一个与页面控件事件相关的类。

** class AssignAddressCallback ** ,分配地址的cluster,发送回消息后就会将network configure更新。

** class AttachedVolumeInfo ** 这是一个将附加逻辑磁盘id,逻辑磁盘名,实例id,设备名,状态和添加时间合成的类。如果其为一行,那么一张表就是AttachedVolumes

** interface Authenticator ** 是将X509证书和EucalyptusMessage中信息来生成是否授权的Msg的接口。

** aws-base.xml~aws-zones.xml ** 是将java类映射为XML,是否为Hibernate就不得而知了。

** Axis2.xml~class AxisHttpResponseImpl ** 可以认为是和Axis2打交道的东西。可以以后再研究下。

SQL中有各种join操作,例如 inner join, outer join, full join, cross join, natural join等。

-----------------------------------------------------------------------------

inner join内连接 也是最普通的join操作。只有join的两个属性值满足join条件后才能生成新的元组。类似于条件连接。例如select *
from tableA inner join tableB on tableA.attributeA = tableB.attributeB 等价于
select * from tableA join tableB on tableA.attributeA = tableB.attributeB也等价于
select * from tableA, tableB where tableA.attributeA = tableB.attributeB

tableA

id attributeA

1     1

2     2

tableB

id attributeB

1    2

3    3

最终结果

tableA.id tableB.id attributeA attributeB

2             1              2            2

-----------------------------------------------------------------------------

outer join外连接,分为left outer join(简写为left join)和 right outer join*(简写为right join
),左右外连接可以保存一边的所有元组值。即使join的两个属性值不满足join的条件,依然能留下一个表的元组,另外一半属性就填充为NULL.例如tableA
.attributeA = tableB.attributeB为连接条件。可是tableA.attributeA含有X值,但是tableB.attribut
eB却没有X值。如果直接使用inner join,
含X值的元组就会被丢弃。如果我们想在结果中保留tableA.attributeA的X类似的元组,拿上面的例子来说如果我想保留tableA中的1
1元组。那么就是用类似于下面的SQL: select * from tableA left join tableB on tableA.attributeA
= tableB.attributeB 等价于 select * from tableB right join tableA on
tableA.attributeA = tableB.attributeB, left join 是保留左边表的元组,right
join是保留右边表的元组。

最终结果为:

tableA.id attributeA  tableB.id  attributeB

1             1             null            null

2             2               1               2

-----------------------------------------------------------------------------

full join 全连接(或者为full outer join),left/right join只能保留一边的表元组,full
join可以保留两边表的元组。select * from tableA full join tableB on tableA.attributeA =
tableB.attributeB

最终结果为:

tableA.id attributeA  tableB.id  attributeB

1             1             null            null

2             2               1               2

null         null            3                3

-----------------------------------------------------------------------------

cross join笛卡尔积,这个就是每一个A中元组和每个B中元组拼接成新的元组。

最终结果为:

tableA.id attributeA  tableB.id  attributeB

1           1                 1            2

1           1                 3            3

2           2                 1            2

2           2                 3            3

-----------------------------------------------------------------------------

natural join自然连接。这个是将两个表的公共属性做连接,同名公共属性只保留一份在最终结果里。例如tableA和tableB中都有id字段,自然连接
后,结果里只保留一个id字段。例如select * from tableA natural join tableB

最终结果为:

id attributeA   attributeB

1           1            2

-----------------------------------------------------------------------------

半连接。貌似没有半连接对应的SQL关键字。半连接就是保留一张表参与连接的元组。所以我们可以再连接之后加入字段的选择。例如select attributeA
from tableA join tableB on tableA.attributeA = tableB.attributeB.

最终结果为:

id attributeA

2       2

-----------------------------------------------------------------------------

自连接,这个名字我不记得在哪里见过。不过传说是有的。和其他join操作不一样之处在于自连接要加入distinct关键字,所以SQL类似于select
distinct attributeA from tableA cross join tableB

最终结果为:

attributeA

1

2

今日细细看了一下Amazon中用于保存云实例、JOB等状态和中间结果的Simple DB.发现果真非常的Simple.

下面详细介绍下:

这个SimpleDB中有四个主要的对象。一是Domain,这个就好像我们的表一样(这只是类比,后面有详细介绍)。二是item这个就像行一样。三是attrib
ute这个就如同列一样。四是value,这就是每个列中的值,类比就是cell.SimpleDB中每一个attribute中的值可以是是一个,也可以是多个。S
impleDB可以有多个Domain,每个Domain中有多个items.每个items中可以有许多个attribute,每个item中的attribute
和其他的item中的attribute可以不相同。这个是啥米?听起来是不是很像google的big table.

后来看了几行SimpleDB的操作才知道,原来就是一个多重map.唉~

每个domain就是一个map我叫它map_domain,每一行也是一个map,叫它map_item.那么如同python的map一样。一个map_item
中可以有多个key,每个key也可以有多个value.如同{key1:value1,key2:[value2,value3,value4]}.map_dom
ain的组织形式为:{map_name:map_item1,map_name:map_item2},这样组织成的SimpleDB有至少两个功能要求:一,可以
根据key快速查找到map_item;二可以根据多个key,查找到map_item.

另外为了支持容错,每个domain必须有多个副本。如果一个副本发生更新,就要将更新在多个副本中传播。所以也可能不能及时看到更新。它自己说是"最终一致"的模型
。对于domain来说,出了要实现那几个功能之外,还有几个属性:

1.最后更新的日期和时间

2。items的个数

3。attribute-value的个数

4。不同名attribute的个数

5。items名字也就是map_item所叫名字的总字节数

6。所有属性值所占大小

7。一致的属性名大小(这个还不知道有什么用处)

自动ssh登录的几种方法

此帖转载自: http://blueicer.blog.51cto.com/395686/88175

不过好像那个地方的也是转载。

我依照下面的方法尝试了一下。在2中其实并不需要# ssh -i /root/.ssh/id_rsa_192.168.60.110 [email protected] 这样写。只需要ssh
[email protected]即可。或许是版本的问题吧。

** 1. 自动ssh/scp方法== **

A为本地主机(即用于控制其他主机的机器) ;
B为远程主机(即被控制的机器Server), 假如ip为192.168.60.110;
A和B的系统都是Linux

在A上运行命令:

ssh-keygen -t rsa (连续三次回车,即在本地生成了公钥和私钥,不设置密码)

ssh [email protected] “mkdir .ssh”

(需要输入密码)

scp ~/.ssh/id_rsa.pub [email protected]

:.ssh/id_rsa.pub (需要输入密码)

在B上的命令:

touch /root/.ssh/authorized_keys (如果已经存在这个文件, 跳过这条)

cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys

(将id_rsa.pub的内容追加到authorized_keys 中)

回到A机器:

ssh [email protected] (不需要密码, 登录成功)

** 2. 控制n个机器如上所述自动登录 **
那就需要n对钥匙(密钥和公钥), ssh-keygen 命令可以随意更改钥匙对的名字, 比如:

ssh-keygen -t rsa

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
/root/.ssh/id_rsa_192.168.60.110

这 样私钥和公钥的名字分别就是: id_rsa_192.168.60.110和 id_rsa_192.168.60.110.pub;然后将
id_rsa_192.168.60.110.pub 文件的内容, 追加到sever的 ~/.ssh/authorized_keys文件中,最后,
在本地用ssh命令的 -i 参数指定本地密钥, 并登录:

ssh -i /root/.ssh/id_rsa_192.168.60.110 [email protected]

scp也是一样的

scp -i /root/.ssh/id_rsa_192.168.60.110 filename [email protected] :/home/someone

在文件.bashrc中加下两行,每次做同样的操作就不用敲入这样长的命令了:
alias sshcell='ssh -i /root/.ssh/id_rsa_192.168.60.110 [email protected]
alias scpcell=‘scp -i /root/.ssh/id_rsa_192.168.60.110 filename [email protected] :/home/someone’

这样,直接键入一下指令实现ssh和scp自动登录:

sshcell

scpcell

** 3. 自动ssh/scp脚本 **
如果需要从A,到B,然后才能够到C,那么需要ssh和scp两次,是比较麻烦的。
ssh自动登录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/expect -f  
set timeout 30
spawn ssh weiqiong@B
expect "password:"
send "pppppp/r"
expect "]*"
send "ssh weiqiong@C/r"
expect "password:"
send "pppppp/r"
interact
scp从A拷贝文件到C:
#!/usr/bin/expect -f
set timeout 300
set file [lindex $argv 0]
spawn scp $file weiqiong@B:/home/weiqiong
expect "password:"
send "pppppp/r"
expect "]*"
spawn ssh weiqiong@B
expect "password:"
send "pppppp/r"
expect "]*"
send "scp $file weiqiong@C:/home/weiqiong/r"
expect "password:"
send "pppppp/r"
expect "]*"
exit
interact

scp从C拷贝文件到A:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/expect -f  
set timeout 300
set file [lindex $argv 0]
spawn ssh weiqiong@B
expect "password:"
send "pppppp/r"
expect "]*"
send "scp weiqiong@C:/home/weiqiong/$file ./r"
expect "password:"
send "pppppp/r"
expect "]*"
send "exit/r"
expect "]*"
spawn scp weiqiong@B:/home/weiqiong/$file .
expect "password:"
send "pppppp/r"
interact

** 4. 建立ssh/scp通道 **
比如说我的机器是A,中间服务器为B,目标服务器是C

从A可以ssh到B,从B可以ssh到C,但是A不能直接ssh到C

现在展示利用ssh通道技术从A直接传输文件到C

1. ssh -L1234:C:22 userid@B

input B’s password

(1234是本机A的空闲端口,该指令需要A机器上的root用户权限,实际上是在本机1234端口建立了一个通道)

2. 打开一个新的console,键入:

scp -P1234 filename userid@localhost:

input C’s password

首先要update你的源。因为ubuntu自带的源速度不是很快,所以需要替换掉那些源。去官方网站上找到以下这些源: [ 源地址 ](http://wiki.
ubuntu.org.cn/如何使用我们推%
E8%8D%90%E7%9A%84%E6%BA%90)

例如我选用了中科大的源:

deb http://debian.ustc.edu.cn/ubuntu/ jaunty main multiverse restricted
universe deb http://debian.ustc.edu.cn/ubuntu/ jaunty-backports main
multiverse restricted universe deb http://debian.ustc.edu.cn/ubuntu/ jaunty-
proposed main multiverse restricted universe deb
http://debian.ustc.edu.cn/ubuntu/ jaunty-security main multiverse restricted
universe deb http://debian.ustc.edu.cn/ubuntu/ jaunty-updates main multiverse
restricted universe deb-src http://debian.ustc.edu.cn/ubuntu/ jaunty main
multiverse restricted universe deb-src http://debian.ustc.edu.cn/ubuntu/
jaunty-backports main multiverse restricted universe deb-src
http://debian.ustc.edu.cn/ubuntu/ jaunty-proposed main multiverse restricted
universe deb-src http://debian.ustc.edu.cn/ubuntu/ jaunty-security main
multiverse restricted universe deb-src http://debian.ustc.edu.cn/ubuntu/
jaunty-updates main multiverse restricted universe

先把你过去的源改名sudo mv   /etc/apt/sources.list   /etc/apt/sources.list.old

然后创建新源sudo vi   /etc/apt/sources.list

然后将上一段的源贴到你的sources.list中。保存。

然后使用sudo apt-get update这句是更新源。之后你就可以更新你的系统了。使用sudo apt-get upgrade即可。

下面是安装scim,有很多种安装方法,各个版本各个操作系统的安装方法不一样。因为要使用中文输入法。所以必须装这个。我使用的操作系统是英文版的所以要再装中文包
。先下载scim和scim-chinese。

sudo apt-get install scim

sudo apt-get install scim-chinese

然后在system->administration->language support中Install / remove language中,将chines
e那项选上。官方文件说如果chinese已经被选上,那么就去掉它并保存,然后重新进入system->administration->language
support,在将chinese那项选上,保存。然后就会有自动安装程序启动。安装好之后,log out,然后再log
in就可以使用了。我使用的是9.04的版本,旧版本的稍有不同。详见 scim
.

0%