Who are you?

Q&A-ubuntu

这篇文档主要记录一些在Ubuntu使用过程中遇到的问题,然后就是各种google后的解决方案~

20170304 - Matlab中文显示乱码

Q:在英文环境下安装的Matlab,打开包含有中文字符的文件时将乱码显示

A:由于linux下的Matlab是用Java编写的,因此切入点就是Java的中文显示

  1. 确定Matlab的JRE目录位置

    /matlab/sys/java/jre/glnx86/jre 请根据自己的安装目录和版本确定JRE的目录;

  2. $ cd /(matlab 目录)/sys/java/jre/glnx86/jre/lib/fonts/;

  3. 建立目录fallback: $ mkdir fallback,可能需要超级用户权限执行

  4. 把字体复制或链接到fallback目录

    linux下的系统字体位于/usr/share/fonts文件夹下,可将相应的中文字体复制到fallback文件夹下

    • sudo cp xxx.ttc path/to/matlab/fonts/fallback/
  5. 进入fallback目录,执行 mkfontscale 命令;

  6. 将上一步生成的文件添加到 lib/fonts/fonts.dir文件中,可用以下命令完成,当然也可以用编辑器复制粘贴:

    为了使fonts.dir可写,需要用chmod

    $ sudo chmod 766 fonts.dir

    $ cat fallback/fonts.scale >> fonts.dir (注意fonts.dir应该设为可写)

    把fallback下的字体加上可读属性:$ chmod a+r fallback/*

  7. 至此Matlab的Java环境中文支持安装完了,接下来配置Matlab;

  8. 进入Matlab,选择 菜单 File>>Preferences>>Fonts ,text fonts去掉Use system default,选择文泉驿字体一种就行了;

  9. 如果没有相应的字体,请把fallback下的字体加上可读属性:$ chmod a+r fallback/*

另:文泉驿字体安装

1
2
3
sudo apt-get install ttf-wqy-microhei #文泉驿-微米黑
sudo apt-get install ttf-wqy-zenhei #文泉驿-正黑
sudo apt-get install xfonts-wqy #文泉驿-点阵宋体

安装完成后可以去系统字体文件夹中的truetype文件夹中查找相应的ttc文件

参考:


20170304 - Gedit中文显示乱码

Q:在windows下编写的文件放到Ubuntu中无法用gedit正确显示中文

A:主要还是编码的问题,增加gedit的编码方式

  1. 代码解决方式

    1
    gsettings set org.gnome.gedit.preferences.encodings candidate-encodings "['GB18030','UTF-8','CURRENT','ISO-8859-15','UTF-16']"
  2. 图形界面解决方式

    • 终端:dconf-editor

      若是运行说找不到该命令,则需要安装运行sudo apt-get install dconf-tools

    • 展开/org/gnome/gedit/preferences/encodings

    • 在candidate-encodings中加入'GB18030','UTF-8','CURRENT','ISO-8859-15','UTF-16'

参考:


20170307 - Linux下应用程序的安装

Q:Linux系统有许多程序不像windows中那样,双击运行就可以安装,需要自己输入命令执行安装过程

A:除了*.deb的安装包可以直接双击安装外,还要二进制形式的安装和源码形式的安装。

  1. 以二进制形式安装:

    以二进制方式发布的程序,安装相对简单,一般只要解压缩后设置好环境变量即可,以Gaussian09为例:

    • 将压缩包复制到某个地方,如/opt

    • 解压缩:tar -xvf gaussian09.tar.gz

    • 设置环境变量:修改~/.bashrc,添加:

      1
      2
      3
      4
      5
      ##Add␣for␣g09
      export g09root="/opt"
      export GAUSS_SCRDIR="/tmp"
      . $g09root/g09/bsd/g09.profile
      ##End␣for␣g09
    • 刷新环境设置:. ˜/.bashrc或重新登录下。

  2. 以源码形式安装:

    源代码发布的程序安装相对复杂,需了解所采用的编译环境,并对配置等做相应修改(主要修改编译命令、库、头文件等编译参数):

    • 查看主页等帮助
    • 解压缩:tar -xvf appsrc.tar.gz
    • 进入解压缩的目录查看是否有README、INSTALL和doc等类似文件和目录,有的话先查看
    • 有configure文件的话,可以./confugure -h看看帮助及选项
    • 生成配置:./confugure [OPTION]... [VAR=VALUE]
    • 修改生成的Makefile等文件
    • 编译:make
    • 安装:make install

    注意:

    • 每种软件的具体安装步骤不一定相同,务必要看对应说明

    • 一些在configure、Makefile中常见变量:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      --prefix:安装到的目录前缀
      CC:编译C源文件的编译器命令
      CLAGS:C程序编译参数
      CPP:预处理参数
      CXX:编译C++源文件的编译器命令
      CXXFLAGS:C++程序编译参数
      F77:编译Fortran77源文件的编译器命令
      F90:编译Fortran90及以后源文件的编译器命令
      FC:编译Fortran源文件的编译器命令
      FFLAGS:Fortran编译参数
      INCLUDE:头文件参数
      LIB:库文件参数
      LINK:链接参数
      OFLAG:优化参数

参考:


20170307 - Linux Shell中的点命令与source命令

Q:Linux中的点命令是什么,与source命令又是什么关系,它们与其他的可执行程序之间又是声明关系

A:点命令就是source命令,但是其与./cmd.sh不同

  1. 格式:source FileName

    source命令是bash中的内建命令,它等同于点命令(.),用于读取和在当前shell环境中执行FILENAME中的命令,执行完毕之后退出码为该文件中的最后一个命令的退出码。FILENAME可以没有执行权限。有时候我们修改了/etc/profile里面的内容,如增加了环境变量,那么要立即生效的话,就必须使用source命令或者点命令在当前shell中执行一下;

    1
    2
    3
    # 以下命令等效
    source ~/.bashrc
    . ~/.bashrc

    另:

    source还有另外一种格式:source filename [arguments]

    作用: Read and execute commands from FILENAME and return. The pathnames in $PATH are used to find the directory containing FILENAME. If any ARGUMENTS are supplied, they become the positional parameters when FILENAME is executed.【目前只在intel编译器安装过程中看到过此命令格式】

  2. 比较:

    1
    2
    3
    4
    5
    6
    7
    # a.sh
    #! /bin/bash
    a="hi"
    # 以下两个命令执行结果不同
    source a.sh && echo $a
    ./a.sh && echo $a
    • 用source命令执行,脚本中的命令是在本shell中读入然后执行的,因而执行echo命令时变量a是有值的;
    • 直接执行脚本,会另起shell进程,而启动这个进行的时候,它会建立自己的进程环境,然后在这个进程结束的时候,它所建立的环境也随之被销毁。
    • 在当前shell中执行和在子shell中执行的区别是,后者定义的变量和函数在执行结束后就消失了,而前者却可以保留下来。./xxx.shsh xxx.sh都是在当前shell的子shell中执行的,子shell中的变量不会影响父shell,而source是把文件中的命令都读出来一个个执行,所有的变量其实就是在父shell中设置的。

参考:


20170313 - Markdown图片居中显示

Q:如何实现Typora中图片在导出时的居中显示?

A:

  1. 在需要居中的图片上下添加如下代码

    1
    2
    3
    <div align=center>
    ![]()
    </div>
  2. 修改CSS文件(暂时还没找到相应的解决方法)


20170327 - 远程服务器免密登录

Q:对于需要频繁登录的Linux服务器,如何实现免密直接登录(类似于git中ssh的设置)?

A:

  1. 首选方法——ssh-copy-id

    • 前提:确保本地Linux系统以及服务器上的Linux系统的个人home目录下有文件夹.ssh,如果不存在,需要分别在本地和服务器上运行以下命令

      1
      2
      3
      4
      5
      6
      # -t 表示的是加密类型
      # rsa 表示加密方式,它也是默认的加密方式,因此可以省略,直接键入ssh-keygen
      ssh-keygen -t rsa
      # 默认的RSA长度是2048位,我们可以加长,命令如下
      ssh-keygen -b 4096 -t rsa

      注:

      • 之后需要输入保存的路径,以及是否加密id_rsa文件,可以自定义,一般直接enter键到底即可,即保存在默认路径下,且不设置id_rsa文件的密码
      • 更多的ssh-keygen 基本用法可以参见Here
    • 采用ssh-copy-id将公钥上传到Linux服务器中

      1
      ssh-copy-id username@remote-server

      注:

      • 之后需要输入一次远程服务器用户的登录密码
      • 输入远程用户的密码后,SSH公钥就会自动上传了。SSH公钥保存在远程Linux服务器的.ssh/authorized_keys文件中。
      • 如果需要将多台本地实现免密登录,只需重复该命令即可,其每运行一次,就会将相应的本地公钥id_rsa.pub复制到服务器的.ssh/authorized_keys文件中
      • 上传完成后,SSH登录就不需要再次输入密码了.但是首次使用SSH Key登录时需要输入一次SSH密钥的加密密码.(只需要输入一次,将来会自动登录,不再需要输入密钥的密码.)
      • 使用scp命令来传送文件时也不需要输入密码.
  2. 复制粘贴

    1
    cat id_dsa.pub >> ~/.ssh/authorized_keys

    实际也可以直接采用复制本地公钥到服务器上的.ssh/authorized_keys文件来实现添加

  3. alias 实现命令快速登陆

    在home目录下的配置文件中(一般为.bashrc添加alias,实现简化登录

    1
    2
    3
    4
    5
    6
    7
    8
    # 打开配置文件
    vim ~/.bashrc
    # 添加如下语句
    alias to-101='ssh username@hostip'
    # source
    . ~/.bashrc

    之后就可以在终端中直接输入to-101实现快速登录

  4. 无法登录的一般原因

    • 客户端的私钥和公钥文件位置必须位于 ~/.ssh 下。

    • 确保双方 ~/.ssh 目录,父目录,公钥私钥,authorized_keys 文件的权限对当前用户至少要有执行权限,对其他用户最多只能有执行权限。

      • 以我的设置为例,对~/.ssh/authorized_keys的权限是600
-  **注意git登录,要求对公钥和私钥以及config文件,其他用户不能有任何权限。**
  • 服务器端 ~/.ssh/authorized_keys 文件名确保没错

参考:


20170519 - shell脚本中export变量生效

  • 问题:在shell脚本中,若要使用export命令, 如果直接运行./abc.sh,之后使用echo命令查看相应变量还是处于未赋值状态
  • 原因:参见该部分内容 [20170307 - Linux Shell中的点命令与source命令]
  • 解决方法:使用source或是.命令