主页 | 新闻 | 深度报道 | 技术文章 | 开源软件 | 资源站点 | 书讯 | 往日版面  | 网站地图
解决在Ubuntu中无法激活中文输入法问题

Ubuntu对中文的支持是目前比较常用的Linux发行版中最好的之一。它的中文输入法为SCIM (Smart Common Input Method,即原来的Smart Chinese Input Method),通过载入不同输入法模块实现 了对包括拼音、五笔、二笔等中文输入法,以及许多外文输入法的支持。但是,Ubuntu在默认情况下并没有将 SCIM作为守护进程加以启动,而是通过 Gnome输入框的插件在需要时启动。这虽然提高了系统启动速度(几乎和没提一样),降低了系统负担(五年前的电脑都不觉得有负担),但当我们使用不是用 GTK编写的程序或输入框不支持Gnome的相关插件(如Firefox、Openoffice等)时,中文输入法就无法使用了。为了解决以上问题,我们 可以用以下方法加以解决:(注意大小写)

打开终端,输入 sudo gedit /etc/X11/Xsession.d/95xinput

在打开的文本编辑器中输入如下内容:

export XMODIFIERS=@im=SCIM

export XIM=scim

export XIM_PROGRAM=scim

export GTK_IM_MODULE="scim"

export QT_IM_MODULE="scim"

scim -d

保存该文件,重启。至此,SCIM就将作为守护进程加以启动。但是,此时拼音输入法依然没有被安装,因此我们需要通过网络来安装相关输入法模块。

打开新立得软件管理器(Synaptic),单击“搜索”按钮,输入scim,搜索与SCIM相关得所有软件。找到pinyin模块,单击右键,选择“标记并安装”项,单击“应用”按钮。打开SCIM配置实用工具对相关选项进行配置,重启计算机。

原文链接: http://tech.ccidnet.com/art/302/...

Real公司于近日发布新版Linux平台播放器

现在Linux平台下的播放器已经不像早年那样贫乏,Mplayer、Amarok、Rhythmbox都已经非常成熟了。老牌的RealPlayer也早已不是Linux下视频播放的首选,不过随着之前Windows下新版的发布,RealNetworks也对Linux等系统下的播放器进行了更新。

RealNetworks日前发布了RealPlayer 11 for Linxu和它的开源版本Helix Player 11。RealPlayer 11现在已经支持在Linux下播放Windows Media内容,集成的播放列表编辑器,支持Perfect Play。另外,还加入了对ALSA和环绕立体声播放的支持。

关于更详细的信息和下载地址请参考:helixcommunity.org/projects/player/news/907

原文链接: http://tech.ccidnet.com/art/302/...

新手学堂:Linux系统下网卡网络配置基础

Ifconfig命令使LINUX核心知道软件回送和网卡这样一些网络接口,这样Linux就可以使用它们。除了上面介绍的这些用法之外,ifconfig命令用来监控和改变网络接口的状态,并且还可以带上很多命令行参数。下面是一个ifconfig的通用调用语法:

#ifconfig interface [[-net|-host] address [parameters]]

其中interface是网络接口名:address是分配给指定接口的主机名或IP地址。这里使用的主机名被解析成它们的对等IP地址,这个参数是必须的。-net和-host参数分别告诉ifconfig将这个地址作为网络号或者是主机地址。

如果调用ifconfig命令时后面只跟上端口设备名,那么它将显示这个端口的配置情况;如果不带任何参数,ifconfig命令将显示至今为止所配置的接口的所有信息;如果带上-a选项,那么还可以显示当前不活跃的接口。

一个检查以太网接口eth0的ifconfig调用可以得到如下的输出:

#ifconfig eth0

eth0 Link encap 10Mbps
Ethernet HWaddr 00:00:C0:90:B3:44

inet addr xxx.xxx.xxx.xxx
Bcast xxx.xxx.xxx.255 Mask 255.255.255.0

UP BROADCAST RUNNING MTU 1500 Metric 0

RX packets 3136 errors 217 dropped 7 overrun 26

TX packets 1752 errors 25 dropped 0 overrun 0

(注意:其中XXX.XXX.XXX.XXX是IP地址)

MTU和Metric这两列显示了当前eth0接口的最大数据传送值和接口度量值。接口度量值表示在这个路径上发送一个分组的成本。目前内核中还没有使用路由,但可能以后会用。RX(接收分组数)和TX(传送分组数)这两行显示出了接收、传送分组的数目,以及分组出错数、丢失分组数(一个可能原因是内存较少)和超限数(通常在接收器接收数据的速度快于核心的处理速度的时候发生)。

如何修改Linux操作系统下Hostname的设置

需要修改2处文件即可:

1. vi /etc/hosts

/etc/hosts 的内容一般有如下类似内容:

127.0.0.1 localhost.localdomain localhost

192.168.1.195 debian.localdomain debian

修改:localhost.localdomain=yourname

保存退出。

2. vi /etc/sysconfig/network

可以直接修改配置文件/etc/sysconfig/network

这里有一个HOSTNAME=yourname

直接修改掉就可以了。

原文链接: http://tech.ccidnet.com/art/302/...

实用技巧:在Linux下设置xhost方法步骤

第一步:用root登陆linux,启动vnc服务;

第二步:根据vnc起来的端口,设置export DISPLAY=localhost:1(1表示vnc在第一个tty上启动的),vnc的启动信息见附件1;

第三步:执行xhost ,并且提示“access control disabled, clients can connect from any host”才正确。

linux下的操作日志如下:

[root@localhost ~]# vncserver

New 'localhost:1 (root)' desktop is localhost:1

Starting applications specified in /root/.vnc/xstartup
Log file is /root/.vnc/localhost:1.log

[root@localhost ~]# export DISPLAY=localhost:1 
[root@localhost ~]# xhost  
access control disabled, clients can connect from any host

在设置xhost时,出现了unable的问题。

使用上诉方法就可以搞定。

原文链接: http://tech.ccidnet.com/art/302/...

Linux系统下实现SCSI硬盘热插拔及在线识别

在向服务器添加SCSI硬盘时,可以在服务器不停机的情况下,让系统识别出新插入的硬盘,具体步骤如下:

第一步:将新硬盘插到机器上;

第二步:以root用户运行命令:

echo "scsi add-single-device x y z u" > /proc/scsi/scsi

其中:

x是硬盘所在SCSI控制器号(一般机器就一个SCSI控制器,所以就是0);

y是硬盘所在SCSI通道的编号(一般单通道的就是0,多通道的要看是哪个通道了);

z是硬盘的SCSI ID号(可以通过具体插入的硬盘插槽来判断);

u是硬盘的lun号(默认情况都是0)

由于我是插入第三块硬盘,所以我运行的命令是:

echo "scsi add-single-device 0 0 2 0" > /proc/scsi/scsi

如果x y z参数不正确,系统是不能识别添加的硬盘的,可以通过查看/proc/scsi/scsi文件的内容来判断是否添加成功。添加好之后,这个文件中会多出一个设备。这个文件中包含系统识别到的所有SCSI设备的详细信息,包括厂商、型号、介质访问类型等。

我在运行上面的命令后查看文件/proc/scsi/scsi,发现多了一个设备(最后一个):

Attached devices:

Host: scsi0 Channel: 00 Id: 00 Lun: 00

Vendor: MAXTOR Model: ATLASU320_18_SCA Rev: B120

Type: Direct-Access ANSI SCSI revision: 03

Host: scsi0 Channel: 00 Id: 01 Lun: 00

Vendor: IBM Model: IC35L036UCDY10-0 Rev: S28F

Type: Direct-Access ANSI SCSI revision: 03

Host: scsi0 Channel: 00 Id: 06 Lun: 00

Vendor: ESG-SHV Model: SCA HSBP M17 Rev: 1.15

Type: Processor ANSI SCSI revision: 02

Host: scsi0 Channel: 00 Id: 02 Lun: 00

Vendor: IBM Model: IC35L146UCDY10-0 Rev: S26B

Type: Direct-Access ANSI SCSI revision: 03

然后再看/proc/partition文件,发现已经识别出硬盘了!接下来就可以分区、格式化、使用了,由于使用parted分区工具不需要重新引导系统,所以整个添加硬盘的过程是不需要重启系统的。

如果要移除硬盘,那么可以这样操作:

第一步:以root用户运行命令:

echo "scsi remove-single-device x y z u" > /proc/scsi/scsi

x y z u的定义同上

第二步:物理上断开硬盘的连接。

原文链接: http://tech.ccidnet.com/art/302/...

Linux系统下C语言编程 线程操作入门常识

线程的创建和使用

线程的创建是用下面的几个函数来实现的.

#include <pthread.h>
int pthread_create(pthread_t *thread,pthread_attr_t *attr,
void *(*start_routine)(void *),void *arg);
void pthread_exit(void *retval);
int pthread_join(pthread *thread,void **thread_return);

pthread_create创建一个线程,thread是用来表明创建线程的ID,attr指出线程创建时候的属性,我们用NULL来表明使用缺省属性.start_routine函数指针是线程创建成功后开始执行的函数,arg是这个函数的唯一一个参数.表明传递给start_routine的参数. pthread_exit函数和exit函数类似用来退出线程.这个函数结束线程,释放函数的资源,并在最后阻塞,直到其他线程使用pthread_join函数等待它.然后将*retval的值传递给**thread_return.由于这个函数释放所以的函数资源,所以retval不能够指向函数的局部变量. pthread_join和wait调用一样用来等待指定的线程. 下面我们使用一个实例来解释一下使用方法.在实践中,我们经常要备份一些文件.下面这个程序可以实现当前目录下的所有文件备份.备份后的后缀名为bak

#include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <string.h>
    #include <errno.h>
    #include <pthread.h>
    #include <dirent.h>
    #include <fcntl.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <sys/time.h>

    #define BUFFER 512
    struct copy_file {
    int infile;
    int outfile;
    };
    void *copy(void *arg)
    {
    int infile,outfile;
    int bytes_read,bytes_write,*bytes_copy_p;
    char buffer[BUFFER],*buffer_p;
    struct copy_file *file=(struct copy_file *)arg;
    infile=file->infile;
    outfile=file->outfile;
    /* 因为线程退出时,所有的变量空间都要被释放,所以我们只好自己分配内存了 */
    if((bytes_copy_p=(int *)malloc(sizeof(int)))==NULL) pthread_exit(NULL);
    bytes_read=bytes_write=0;
    *bytes_copy_p=0;
    while((bytes_read=read(infile,buffer,BUFFER))!=0)
    {
    if((bytes_read==-1)&&(errno!=EINTR))break;
    else if(bytes_read>0)
    {
    buffer_p=buffer;
    while((bytes_write=write(outfile,buffer_p,bytes_read))!=0)
    {
    if((bytes_write==-1)&&(errno!=EINTR))break;
    else if(bytes_write==bytes_read)break;
    else if(bytes_write>0)
    {
    buffer_p+=bytes_write;
    bytes_read-=bytes_write;
    }
    }
    if(bytes_write==-1)break;
    *bytes_copy_p+=bytes_read;
    }
    }
    close(infile);
    close(outfile);
    pthread_exit(bytes_copy_p);
    }
    int main(int argc,char **argv)
    {
    pthread_t *thread;
    struct copy_file *file;
    int byte_copy,*byte_copy_p,num,i,j;
    char filename[BUFFER];
    struct dirent **namelist;
    struct stat filestat;
    /* 得到当前路径下面所有的文件(包含目录)的个数 */
    if((num=scandir(".",&namelist,0,alphasort))<0)
    {
    fprintf(stderr,"Get File Num Error:%s\n\a",strerror(errno));
    exit(1);
    }
    /* 给线程分配空间,其实没有必要这么多的 */
    if(((thread=(pthread_t *)malloc(sizeof(pthread_t)*num))==NULL)||
    ((file=(struct copy_file *)malloc(sizeof(struct copy_file)*num))==NULL)
    )
    {
    fprintf(stderr,"Out Of Memory!\n\a");
    exit(1);
    }

    for(i=0,j=0;i<num;i++)
    {
    memset(filename,'\0',BUFFER);
    strcpy(filename,namelist[i]->d_name);
    if(stat(filename,&filestat)==-1)
    {
    fprintf(stderr,"Get File Information:%s\n\a",strerror(errno));
    exit(1);
    }
    /* 我们忽略目录 */
    if(!S_ISREG(filestat.st_mode))continue;
    if((file[j].infile=open(filename,O_RDONLY))<0)
    {
    fprintf(stderr,"Open %s Error:%s\n\a",filename,strerror(errno));
    continue;
    }
    strcat(filename,".bak");
    if((file[j].outfile=open(filename,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))
    <0)
    {
    fprintf(stderr,"Creat %s Error:%s\n\a",filename,strerror(errno
    ));
    continue;
    }
    /* 创建线程,进行文件拷贝 */
    if(pthread_create(&thread[j],NULL,copy,(void *)&file[j])!=0)
    fprintf(stderr,"Create Thread[%d] Error:%s\n\a",i,strerror(errno));
    j++;
    }
    byte_copy=0;
    for(i=0;i<j;i++)
    {
    /* 等待线程结束 */
    if(pthread_join(thread[i],(void **)&byte_copy_p)!=0)
    fprintf(stderr,"Thread[%d] Join Error:%s\n\a",
    i,strerror(errno));
    else
    {
    if(bytes_copy_p==NULL)continue;
    printf("Thread[%d] Copy %d bytes\n\a",i,*byte_copy_p);
    byte_copy+=*byte_copy_p;
    /* 释放我们在copy函数里面创建的内存 */
    free(byte_copy_p);
    }
    }
    printf("Total Copy Bytes %d\n\a",byte_copy);
    free(thread);
    free(file);
    exit(0);
    }

原文链接: http://tech.ccidnet.com/art/302/...

Linux系统下精确到微秒级的时间操作函数

Linux下对时间进行运算,如果是到秒级的,相信大家都用过time之类的函数实现了,但要更精确些呢?到毫秒、微秒级呢?

看看下面这段源代码就明白了:

#include <sys/time.h>
#include <stdio.h>
#include <math.h>

void function()/*用来耗用一定的时间而已,无实际用处的函数*/
{
  unsigned int i,j;
  double y;
  for(i=0;i<10000;i++)
    for(j=0;j<10000;j++)
      y=sin((double)i);
}

int main(int argc, char ** argv)
{
  struct timeval tpstart,tpend;
  float timeuse;

  gettimeofday(&tpstart,NULL);
  function();
  gettimeofday(&tpend,NULL);
  timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+tpend.tv_usec-tpstart.tv_usec;
  timeuse/=1000000;
  printf("Used Time:%f\n",timeuse);
  exit(0);
}

主要是用到了gettimeofday函数,函数里用到了这个结构:

struct timeval {
               long tv_sec;        /* seconds */
               long tv_usec;  /* microseconds */
       };

原文链接: http://tech.ccidnet.com/art/302/...

ubuntu8.04如何修改默认文件关联打开程序

从总体上讲

/etc/gnome/defaults.list 保存了全局的打开方式

/.local/share/applications/mimeapps.list 保存了个人的打开方式

当两着不一致是,优先采用局部的个人设置。

例如,ubuntu8.04下多媒体文件默认是用Totem打开的,如果你想要改成用smplayer(本人比较喜欢用这个)来打开的话,可以按照以下步聚来进行:

1.进入/etc/gnome目录 命令 cd /etc/gnome

2.复制要改变打开方式的那些内容行到mimeapps.list文件 命令 grep “totem” defaults.list >> ~/.local/share/applications/mimeapps.list

3.进入~/.local/share/applications目录 命令 cd ~/.local/share/applications

4.编缉mimeapps.list文件 命令: sudo vim mimeapps.list

5.在vim中执行 命令:%s/totem/smplayer/g

6.然后执行保存命令:wq

7.完成

想要改其它类型的可照此类推,比如我就把音频文件换成了audacious来打开,文本文件用gvim来默认打开。

原文链接: http://tech.ccidnet.com/art/302/...

Linux服务器中OpenSSH的源码编译与升级

一.AS4 升级步骤

1.建议使用源码安装方式,下载安装包

cd /root

wget -c "ftp://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-5.0p1.tar.gz"

tar zxvf openssh-5.0p1.tar.gz

cd openssh-5.0p1

2.升级请确认Zlib和OpenSSL的版本:

openssh-5.0p1要求Zlib的版本在1.2.1.2以上,OpenSSL版本在0.9.6以上.下面是Zlib和 OpenSSL的官方地址:

http://www.gzip.org/zlib/

http://www.openssl.org/

注意: OpenSSL 0.9.5a属于可接受的版本,但是在使用SSH protocol 1 时,一些加密功能可能会出现问题(出于安全考虑,建议使用SSH protocol 2)。详见INSTALL文档。

3.编译常用的参数--prefix=和--sysconfdir=,省略以上参数,默认的ssh将安装在 /usr/local/bin下,sshd装在/usr/local/sbin,sftp-server装在/usr/local/libexec/sftp-server,配置文件在/usr/locale/etc下。

./configure --sysconfdir=/etc/ssh

make

make install

4.对比安装默认和当前配置文件,个别重要参数请务必修改

diff sshd_config /etc/ssh.bak/sshd_config