• ubuntu 备忘录


    使用ubuntu的一些经验总结。本人最常用的是ubuntu16.04,后续也可能加一些ubuntu 20.04特定的东西。

    目录

    换源

    ubuntu16.04, aliyun

    sudo tee /etc/apt/sources.list  << EOF
    # 默认注释了源码仓库,如有需要可自行取消注释
    deb https://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
    # deb-src https://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
    # deb-src https://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
    deb https://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
    # deb-src https://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
    deb https://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
    # deb-src https://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
    
    # 预发布软件源,不建议启用
    # deb https://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
    # deb-src https://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
    EOF
    

    ubuntu16.04, ustc

    sudo tee /etc/apt/sources.list  << EOF
    # 默认注释了源码仓库,如有需要可自行取消注释
    deb https://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse
    # deb-src https://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse
    deb https://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
    # deb-src https://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
    deb https://mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
    # deb-src https://mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
    deb https://mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
    # deb-src https://mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
    
    # 预发布软件源,不建议启用
    # deb https://mirrors.ustc.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse
    # deb-src https://mirrors.ustc.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse
    EOF
    

    ubuntu18.04, ustc

    sudo tee /etc/apt/sources.list  << EOF
    
    # 默认注释了源码仓库,如有需要可自行取消注释
    deb https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse
    # deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse
    deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
    # deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
    deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
    # deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
    deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
    # deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
    
    # 预发布软件源,不建议启用
    # deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
    # deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
    EOF
    

    For other options, use this python script to generate it

    #!/usr/bin/env python
    #coding: utf-8
    
    def get_mirror_site(dist_num_str='16.04', site_name='ustc'):
        site_mp = {
            'ustc': 'https://mirrors.ustc.edu.cn',
            'aliyun': 'http://mirrors.aliyun.com',
            'tuna': 'https://mirrors.tuna.tsinghua.edu.cn',
        }
    
        site_url = site_mp[site_name]
    
        dist_mp = {
            '12.04': 'precise',
            '14.04': 'trusty',
            '16.04': 'xenial',
            '16.10': 'yakkety',
            '17.04': 'zesty',
            '17.10': 'artful',
            '18.04': 'bionic'
        }
    
        dist_name = dist_mp[dist_num_str]
    
    
        mirror_url_lst = [
            '# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释',
            'deb {:s}/ubuntu/ {:s} main restricted universe multiverse'.format(site_url, dist_name),
            '# deb-src {:s}/ubuntu/ {:s} main restricted universe multiverse'.format(site_url, dist_name),
            'deb {:s}/ubuntu/ {:s}-updates main restricted universe multiverse'.format(site_url, dist_name),
            '# deb-src {:s}/ubuntu/ {:s}-updates main restricted universe multiverse'.format(site_url, dist_name),
            'deb {:s}/ubuntu/ {:s}-backports main restricted universe multiverse'.format(site_url, dist_name),
            '# deb-src {:s}/ubuntu/ {:s}-backports main restricted universe multiverse'.format(site_url, dist_name),
            'deb {:s}/ubuntu/ {:s}-security main restricted universe multiverse'.format(site_url, dist_name),
            '# deb-src {:s}/ubuntu/ {:s}-security main restricted universe multiverse'.format(site_url, dist_name),
    
            '# 预发布软件源,不建议启用',
            '# deb {:s}/ubuntu/ {:s}-proposed main restricted universe multiverse'.format(site_url, dist_name),
            '# deb-src {:s}/ubuntu/ {:s}-proposed main restricted universe multiverse'.format(site_url, dist_name)
        ]
        for mirror_url in mirror_url_lst:
            print(mirror_url)
    
    if __name__ == '__main__':
        get_mirror_site()
    
    

    remember to sudo apt update

    开发相关的基本包

    ubuntu桌面版,默认不带vim,不带git,不带cmake,不带pip...真搞不清楚ubuntu是啥定位,明明实际情况是:用ubuntu的90%+的是用来开发的,基本的开发包还得要手动安装:

    sudo apt install vim git curl aptitude apt-file apt-show-versions autoconf automake libtool exfat-utils openssh-server subversion tmux enca tig samba python-dev python3-dev silversearcher-ag zsh ncdu tree dos2unix libncurses5-dev htop iotop xorg openbox 
    
    sudo apt install clang valgrind cppcheck 
    

    vimrc

    git clone --depth=1 https://github.com/amix/vimrc.git ~/.vim_runtime
    sh ~/.vim_runtime/install_awesome_vimrc.sh
    git clone --depth=1 https://github.com/zchrissirhcz/dotfiles /tmp/dotfiles
    cp /tmp/dotfiles/my_configs.vim ~/.vim_runtime/
    

    python, pip

    mkdir -p ~/.pip
    (
    cat << EOF
    [global]
    index-url = https://pypi.doubanio.com/simple
    EOF
    ) > ~/.pip/pip.conf
    
    sudo apt install -y python-pip
    sudo pip install -U pip
    sudo apt remove -y python-pip
    
    sudo apt  install -y python3-pip
    sudo pip3 install  -U  pip
    sudo apt remove -y python3-pip
    
    sudo sed -i "s//usr/bin/python3//usr/bin/python/g" `which pip`
    

    zsh, oh-my-zsh, josh

    sudo apt install zsh
    sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
    sed -i "s/ZSH_THEME="robbyrussell"/ZSH_THEME="josh"/g" ~/.zshrc
    

    默认情况下,oh-my-zsh为基础的zsh,cd进入目录会特别慢,因为oh-my-zsh本身以及使用的theme里的git相关操作很慢,卡顿可能有十几秒。
    解决方案:

    git config --global --add oh-my-zsh.hide-dirty 1
    git config --global --add oh-my-zsh.hide-dirty 1
    

    配置android相关环境

    最近突然觉得各种rc文件很方便,需要用的时候source一下就能用,不需要的时候也不至于污染系统PATH,哈哈。
    ~/.androidrc内容:

    export ANDROID_SDK=/home/zz/Android/Sdk                                          
    export PATH=$ANDROID_SDK/cmake/3.6.4111459/bin:$ANDROID_SDK/platform-tools:$PATH 
    export ANDROID_NDK=/home/zz/Android/Sdk/ndk-bundle                               
    

    使用android ndk构建之前,只需要source ~/.androidrc再cmake构建即可。

    查看库文件(libxxx.a/libxxx.so,动态静态库均可)是哪个编译器生成的

    objdump -s --section=.comment libxxx.a    #静态库
    
    objdump -s --section=.comment libxxx.so  #动态库
    

    ldd查看动态库的依赖项

    ldd libxxx.so
    

    通常可以查看出glibc版本,确定gcc版本

    nvidia-smi反应慢

    一般出现在4卡以上的机器上。解决办法是输入如下命令:

    sudo nvidia-persistenced --persistence-mode
    

    注意:这会开启一个进程(通过ps -ef | grep nvidia查看),如果此时需要重新安装nvidia驱动,尽管已经卸载了同版本驱动,但是新驱动会提示装不上,因为这个persistence的进程没有关掉。kill掉它再重装驱动。

    查找ppa软件包

    经常发现ubuntu的apt提供的包版本太老,手动编译新版本实际上要自己手动解决依赖不方便,google/bing查找的话也比较凌乱。

    实际上,直接从launchpad上就能找的。https://launchpad.net/ubuntu这里查找各种ppa提供的包。

    (其实很久之前玩fedora的时候就用过类似的一个网站:pkgs.org,但是后来用ubuntu后就忘记了。。)

    U盘启动ubuntu(安装),进不去桌面

    换个usb接口试试。选择try ubuntu而不是install试试。

    安装软件包/编译常见软件包

    有些包用apt去装就可以了,或许需要添加ppa源;有些包则版本太老,需要从源码编译安装。

    查找包

    aptitude search pkgName
    

    pkgName可以有多个(空格分隔)

    安装软件到系统路径

    有些软件包无法通过apt安装,例如CUDA;又或者,apt提供的安装包比较老/不全,希望自行编译安装,例如OpenCV、CMake、Protobuf。

    其中,如果某个包主要对应一个可执行程序,比如cmake,而你希望apt安装的版本和自行编译安装的版本同时存在,那么安装到/usr/local/cmake-3.12这样的路径下就好了,通过~/.cmakerc中设定:

    export PATH=/usr/local/cmake-3.12/bin:$PATH
    

    并使用source ~/.cmakerc来临时切换版本。

    而对于另外一些包,它被安装的目的可能更多的是提供一个.so,被其他程序连接,比如CUDA相关的libcudart.so,libcudnn.so等,以及OpenCV的各种库文件,则往往是在链接器相关的路径、环境变量上做游戏,例如写入到LD_LIBRARY_PATH,或者写入到/etc/ld.so.conf相应的配置文件+执行sudo ldconfig命令,来系统级的让相应的库文件被找到。
    相关的,还有个LD_PRELOAD,可以用于同一个库的不同版本的先后查找配置上。

    编译时提示头文件找不到

    问题原因可能有多种。以caffe在ubuntu16.04上编译为例。

    提示hdf5.h找不到。猜测是hdf相关的包的头文件不在系统的INCLUDE查找路径。

    查找hdf相关的包。我记得自己装过,所以增加grep过滤:aptitude search hdf5 | grep '^i'

    过滤查找结果中最可能的是-dev包。查看-dev包都安装了什么,分别装在哪里。因为确定是要找hdf5.h,所以依然grep过滤:dpkg -L libhdf5-dev | grep 'hdf5.h$'

    结果是唯一的,/usr/include/hdf5/serial/hdf5.h。添加/usr/include/hdf5/serial到Caffe的Makefile中INCLUDE_DIRS变量上。

    双“重定向”

    用caffe训练,产生log。想既在屏幕上看到实时log输出,也同时保存一份到文件。使用2>&1和tee命令,以及管道:

     ......caffe train --solver=......  2>&1 | tee log.txt  
    

    装ffmpeg

    比如opencv调用网络摄像头 需要编解码支持 要用ffmpeg

    sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-next 
    sudo apt-get update 
    sudo apt-get install ffmpeg
    

    (已失效,请用下面的:)

    sudo apt-get install ppa-purge && sudo ppa-purge ppa:jonathonf/ffmpeg-4
    

    编译安装opencv和opencv contrib 以及python接口

    罗嗦版:http://www.cnblogs.com/zjutzz/p/6714490.html

    mkdir -p ~/work/gitdown
    cd $_
    git clone https://github.com/opencv/opencv
    git clone https://github.com/opencv/opencv_contrib
    cd opencv
    mkdir build
    cd build
    cmake 
    -D CMAKE_BUILD_TYPE=Release 
    -D CMAKE_INSTALL_PREFIX=/usr/local/opencv-git-master 
    -D WITH_CUDA=OFF 
    -D WITH_VTK=OFF 
    -D WITH_MATLAB=OFF 
    -D BUILD_DOCS=ON 
    -D OPENCV_EXTRA_MODULES_PATH=/home/chris/work/gitwhat/opencv_contrib/modules 
    -D PYTHON2_EXECUTABLE=/usr/bin/python 
    -D PYTHON3_EXECUTABLE=/usr/bin/python3 
    -D PYTHON_INCLUDE_DIR=/usr/include/python2.7 
    -D PYTHON_INCLUDE_DIR2=/usr/include/x86_64-linux-gnu/python2.7 
    -D PYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython2.7.so 
    -D PYTHON2_NUMPY_INCLUDE_DIRS=/usr/lib/python2.7/dist-packages/numpy/core/include/ 
    -D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/lib/python3.5/dist-packages/numpy/core/include/ 
    ..
    

    期间容易出现ippicv等第三方包下载不下来的情况。找到对应的.cmake文件,把下载地址拼接出来自行下载,注意替换掉md5的hash值。下载的文件放到<opencv_root>/.cache目录下,例如:

    .cache
    ├── ippicv
    │   └── 1469ff5ced054be500921d2d46278ef4-ippicv_linux_20151201.tgz
    ├── protobuf
    │   └── bd5e3eed635a8d32e2b99658633815ef-protobuf-cpp-3.1.0.tar.gz
    ├── tiny_dnn
    │   └── adb1c512e09ca2c7a6faef36f9c53e59-v1.0.0a3.tar.gz
    └── xfeatures2d
        ├── boostdesc
        │   ├── 0ae0675534aa318d9668f2a179c2a052-boostdesc_lbgm.i
        │   ├── 0ea90e7a8f3f7876d450e4149c97c74f-boostdesc_bgm.i
        │   ├── 202e1b3e9fec871b04da31f7f016679f-boostdesc_binboost_064.i
        │   ├── 232c966b13651bd0e46a1497b0852191-boostdesc_bgm_bi.i
        │   ├── 324426a24fa56ad9c5b8e3e0b3e5303e-boostdesc_bgm_hd.i
        │   ├── 98ea99d399965c03d555cef3ea502a0b-boostdesc_binboost_128.i
        │   └── e6dcfa9f647779eb1ce446a8d759b6ea-boostdesc_binboost_256.i
        └── vgg
            ├── 151805e03568c9f490a5e3a872777b75-vgg_generated_120.i
            ├── 7126a5d9a8884ebca5aea5d63d677225-vgg_generated_64.i
            ├── 7cd47228edec52b6d82f46511af325c5-vgg_generated_80.i
            └── e8d0dcd54d1bcfdc29203d011a797179-vgg_generated_48.i
    
    

    新编译出来的cv2.so位于/usr/local/opencv-git-master/lib/cv2.so

    sudo apt-get remove python-opencv
    sudo ln -sf /usr/local/opencv-git-master/lib/python2.7/dist-packages/cv2.so /usr/lib/python2.7
    

    或者设定PYTHONPATH也可以

    编译安装protobuf3.2

    apt装的protobuf是2.5版本. pip装的protobuf是3.2版。 使用了python layer的网络,如果用tools/caffe.cpp编译出的工具build/caffe来执行网络,会报protobuf版本问题,需要protobuf-cpp的版本装3.2版

    编译装protobuf3.2

    卸载apt的protobub

    sudo apt-get remove --purge libprotobuf-dev
    

    如果你是ubuntu-desktop用户,那你的桌面有可能被误删。立即安装(不要重启):

    sudo apt-get install ubuntu-desktop -y
    sudo apt-get install unity -y
    sudo apt-get install compiz-gnome -y
    sudo apt-get install libcompizconfig0 -y
    

    静态编译protobuf(产生libprotobuf.a而不是.so文件,否则caffe编译会报错)

    sudo apt-get install autoconf automake libtool curl make g++ unzip
    cd ~/work/gitdown
    git clone https://github.com/google/protobuf
    cd protobuf
    git checkout -b 3.2.x origin/3.2.x
    
    ./autogen.sh
    vim configure
    

    修改2658行和2661行,引号里面都换成"-fPIC"

    ./configure --disable-shared
    make -j8
    sudo make install
    

    sudo ldconfig

    重新编译caffe

    cd ~/work/caffe-BVLC
    make clean
    make -j8
    make pycaffe
    

    py-faster-rcnn

    http://www.cnblogs.com/zjutzz/p/6034408.html

    android-studio

    真机调试:需要先设定udev的规则。
    参考:http://www.jianshu.com/p/958361328ae5

    exfat无法挂载?

    sudo apt-get install exfat-utils
    

    flash

    sudo apt-get install flashplugin-installer
    

    正确安装pip, pip3

    需要安装pip,并且pip升级到最新版。现在(2018.07.28)可行的做法(亲测有效,ubuntu16.04):

    sudo  apt  install  python-pip    #用apt装pip,是8.0版的pip
    sudo  pip  install  -U  pip           #用8.0的pip给自己升级
    sudo  apt  remove  python-pip  #干掉apt装的(老版本的)pip.  现在,系统有的pip,是最新版的pip
    

    pip3?如法炮制:

    sudo  apt  install  python3-pip
    sudo  pip3  install  -U  pip
    sudo  apt  remove  python-pip
    
    sudo  vim   `which  pip`   #查看一下pip,是否被python3给覆盖了,也就是确保解释器为#!/usr/bin/python而不是#!/usr/bin/python3
    

    耳机插入后没声音

    需要手动设置下:

    sudo apt install alsa
    sudo apt install pavucontrol
    pavucontrol  #打开了音量控制中心的GUI界面,然后手动选择输出设备为headphone
    

    参考:
    http://www.linuxdiyf.com/linux/25058.html

    实测发现,我的显卡是GTX1080Ti,显卡内置了声卡,并且耳机插在屏幕上,屏幕和主机用DP线连接,Windows下有声音,Ubuntu下默认没声音,按上面链接里的设定不起作用,正确的设定是:

    启发我的博客:https://blog.csdn.net/zz2230633069/article/details/85958197

    安装最新版emacs

    当不得不只能通过ssh连接到linux服务器进行C++开发时,我选择使用emacs。ubuntu16.04自带的emacs是24版,用我的配置文件会出现打开emacs后卡死在加载配置文件上的问题。索性安装最新版emacs(27):

    #(emacs-snapshot 是最新版本,更新速度相对较快) 
    sudo add-apt-repository ppa:ubuntu-elisp/ppa 
    sudo apt update 
    sudo apt install emacs-snapshot emacs-snapshot-el
    

    refs

    http://blog.csdn.net/linyushan11/article/details/10378419

    https://github.com/BVLC/caffe/issues/19

    安装最新emacs

    好用的命令与参数搭配

    将所有文件的编码,转换为UTF-8

    find . ! -type d -exec enca -L zh_CN -x UTF-8 {} ;
    

    将所有c/cpp/h文件的行尾换行符,从unix改成dos(使用场景:工程的代码中有//开头的中文注释,在linux下可正常编译,在visual studio中编译报错,报错地点处于"//开头的注释后的一行"对应的字段/变量定义等):

    find . -name '*.[c|cpp|h]' -exec unix2dos {} ;
    

    将指定目录下所有文件权限设定为644

    find . ! -type d -exec chmod 644 {} ;
    

    将指定目录下所有目录权限设定为755

    find .  -type d -exec chmod 755 {} ;
    

    替换文本文件中行尾换行符,从dos(CRLF)为unix行尾换行符(LF):

    find . -name '*.php' | xargs -I {} perl -pi -e 's/
    //g' {}
    

    或者更简单点:

    find . -name '*.cpp' | xargs sed -i 's/
    //g'
    

    批量删除所有.svn子目录:

    find . -type d -name ".svn"|xargs rm -rf
    

    找出目录下所有".c"和".cpp"结尾的文件,统计它们一共有多少个:

    ls -1 | grep -E '.(c|cpp)$' | wc -l
    

    其中-E参数开启了扩展的正则表达式。

    对目录下所有文件执行同种操作,比如文件名追加"pop":

    for file in "$(ls)"; do echo -e "$file"pop; done
    

    列出目录下所有png图片的绝对路径,并重定向到txt文件:

    for f in `ls *.png`;do ls `pwd`/$f; done > img_list.txt 2>&1
    

    计算md5加密:

    echo -n "你的字符串" | openssl md5
    

    其中-n参数一定要有,否则结果就不一样了(掺杂了回车的结果)

    查看CPU是几核的:

    cat /proc/cpuinfo | grep 'procossor' | wc -l
    

    持续查看某条命令结果:用watch。例如每隔一秒监控一次nvidia显卡显存占用:

    watch -n 1 nvidia-smi
    

    列出目录下的文件,每行1个:

    ls src -1  #-1表示每行1个
    

    列出目录下文件,每行一个,并且加上路径名作为前缀:

    ls src -1  | awk '{print "src/"$1}'
    

    常见vim操作

    鼠标粘贴

    用鼠标复制内容到系统粘贴板后,粘贴到vim中,需要先开启paste(避免不正常的缩进),然后再粘贴

    # 先按escape进入命令模式
    :set paste
    # 然后按i,进入insert模式
    # 用鼠标粘贴
    

    全局替换

    :1,$s/old_string/new_string/g
    

    解释:1,$表示从第一行到最后一行;s表示替代;old_string表示想要被替换掉的字符串(替换为new_string);g表示global,是说对于每一行,替换行内所有的old_string

    几个简单方便的脚本

    cmake项目的编译脚本

    cmake执行后产生log,希望保存log方便后续查看。
    cmake可能有很多参数,一下子记不住。
    那么使用这个脚本:

    #!/bin/bash
    # compile.sh
    set -x   #把本行后的脚本执行内容,打印到屏幕。用于调试
    set -e   #本行后,如果某行执行结果返回值不是true,那么终止
    
    LOG="log.build"
    touch $LOG
    rm $LOG
    
    exec &> >(tee -a "$LOG")   #将屏幕输出内容,同时写入log文件:便于后续查找
    
    echo "Logging to $LOG"
    
    
    BUILD_ROOT=build
    if [ -d $BUILD_ROOT ]; then
        rm -rf $BUILD_ROOT
    fi
    mkdir -p $BUILD_ROOT
    cd $BUILD_ROOT
    echo "building root folder is $BUILD_ROOT"
    
    echo "Now do cmake"
    
    cmake ..
    
    echo "Now do make"
    
    make -j8
    
    echo "Done"
    
    

    在此基础上可以添加sudo make install,以及cmake的各种option值。

    使用外部库的CMakeLists.txt

    dlib

    比如使用dlib库写自己的代码。那么自行下载并编译dlib,会同时生成静态库libdlib.a和动态库libdlib.dylib文件。

    要使用dlib(静态库、动态库都可以),假设我的代码只有一个assignment_learning_ex.cpp文件(来自dlib的tutorial),那么它配套的CMakeLists.txt这样写:

    cmake_minimum_required(VERSION 2.8.12)
    
    project(examples)
    
    set (CMAKE_CXX_STANDARD 11)  # -std=c++11
    
    set(INC_DIR /Users/tusdk/work/dlib)   #dlib头文件路径,改成你的
    
    set(LINK_DIR /Users/tusdk/work/dlib/build/dlib)  #dlib库文件路径,改成你的
    
    include_directories(${INC_DIR})
    
    link_directories(${LINK_DIR})
    
    add_executable(assignment_learning_ex assignment_learning_ex.cpp)
    
    target_link_libraries(assignment_learning_ex dlib)
    

    .cpp文件和CMakeLists.txt文件放同一目录下,执行:

    mkdir -p build
    cd build
    cmake ..
    make -j8
    

    完成编译,可以运行了。

    这种写法,应该是比较方便使用的,每次只编译自己代码就好了,dlib不用重新编译。

    而dlib官方的文档,意思是自己的调用dlib库的程序(用cmake构建),每次都重新编译dlib。虽然说了一堆道理,但是编译dlib对我来说没有必要,浪费时间,不如去掉,所以,用我贴出来这个脚本会方便。

    在cmake项目中使用自行编译的opencv

    find_package时指定opencv编译的build目录即可。其实前面的dlib,原则上这么做应该也行。但是dlib生成的.cmake脚本不在同一目录有点麻烦。

    caffe2中有个Dependencies.cmake,稍作修改,把opencv的部分拿出来:

    # ---[ OpenCV
    if(USE_OPENCV)
      # OpenCV 3
      find_package(OpenCV QUIET COMPONENTS core highgui imgproc imgcodecs
          CONFIG
          PATHS "/Users/tusdk/work/opencv/build/")
      if(NOT OpenCV_FOUND)
        # OpenCV 2
        find_package(OpenCV QUIET COMPONENTS core highgui imgproc)
      endif()
      if (OpenCV_FOUND)
        include_directories(SYSTEM ${OpenCV_INCLUDE_DIRS})
        list(APPEND Caffe2_DEPENDENCY_LIBS ${OpenCV_LIBS})
        message(STATUS "OpenCV found (${OpenCV_CONFIG_PATH})")
      else()
        message(WARNING "Not compiling with OpenCV. Suppress this warning with -DUSE_OPENCV=OFF")
        set(USE_OPENCV OFF)
      endif()
    endif()
    

    ==== update =====

    也是被opencv和cmake折腾的醉了。仔细看了下cmake的find_package的文档后,才知道怎么master这些包(比如opencv)

    对于自行编译的opencv 假设安装在了/opt/opencv-git-master 那么通过在CMakeLists.txt里设定CMAKE_PREFIX_PATH,能最高优先级地设定opencv的查找路径。e.g.:

    cmake_minimum_required(VERSION 3.2)
    project(play)
    
    message("CMAKE_MODULE_PATH is: ${CMAKE_MODULE_PATH}")
    message("CMAKE_SYSTEM_PREFIX_PATH: ${CMAKE_SYSTEM_PREFIX_PATH}")
    message("CMAKE_SYSTEM_FRAMEWORK_PATH: ${CMAKE_SYSTEM_FRAMEWORK_PATH}")
    message("CMAKE_SYSTEM_APPBUNDLE_PATH: ${CMAKE_SYSTEM_APPBUNDLE_PATH}")
    
    list(APPEND CMAKE_PREFIX_PATH "/opt/opencv-git-master")  ##!! 这里在设定
    # 假如是apt装的opencv,那么先通过dpkg -L libopencv-dev查询知道,.cmake文件在/usr/share/OpenCV,那么用下面这行:
    #list(APPEND CMAKE_PREFIX_PATH "/usr/share/OpenCV/")
    message("CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH}")
    
    find_package(OpenCV
        #NO_CMAKE_PATH
        #NO_CMAKE_ENVIRONMENT_PATH
        #NO_SYSTEM_ENVIRONMENT_PATH
        #NO_CMAKE_PACKAGE_REGISTRY
        #NO_CMAKE_SYSTEM_PATH
        )
    
    message(${OpenCV_DIR})
    
    #add_executable(hello main.cpp)
    

    而如果你opencv安装在/usr/local或者/usr/local/opencv开头的路径中,那么不用设定CMAKE_PREFIX_PATH就能被找到,当然设定这个变量会有更高优先级。

    具体参考cmake官方文档中find_package()的内容,或者cmake简明使用指南.

    启动后提示硬盘出错,进入busybox的initramfs界面

    这问题今天(2017-11-21 11:44:35)第一次遇到,解决办法是手动调用磁盘修复命令。虽然它提示了手动修复,但是我怎么知道哪些参数?还是靠百度,靠网友的经历了。
    参考http://blog.csdn.net/babyfish13/article/details/51190148,我用的文中第二种方式。

    提示"boot"分区空间不足

    是旧的内核太多了。保险的方式是安装byobu后操作。
    purge-old-kernels在byobu软件包中,首先,安装byobu:

    sudo apt install byobu
    

    运行purge-old-kernels卸载旧内核:

    sudo purge-old-kernels
    

    为了保险它会保留最新的两个Linux内核。

    参考:[http://blog.topspeedsnail.com/archives/6069](使用purge-old-kernels移除旧的Linux内核-Ubuntu 16.04)

    svn1.6在centos6下的使用

    之前用centos6.5的时候 懒得手动编译高版本svn,用的是1.6版的,写了一些笔记:
    http://www.cnblogs.com/zjutzz/p/4887288.html

    其实如果可以还是用更新版本的svn吧,bug少,操作更人性化。

    pureftp在centos下与MySQL搭配使用

    之前用pureftp作为ftp的服务端软件,写了一些笔记:
    http://www.cnblogs.com/zjutzz/p/4993106.html

    其实如果只是内网使用服务器,比如Deep Learning日常连接到服务器做训练、测试、开发,用sftp就好了,简单省事。

    配置samba服务器

    使用场景:在windows系统上访问linux主机/服务器上的目录、文件。
    在ubuntu16.04上配置如下:
    1)关防火墙

    sudo ufw disable      //关闭防火墙 
    sudo ufw enable        //开启
    sudo ufw status   //查看状态 
    
    1. 安装samba包
    sudo apt-get install samba
    
    1. 改配置文件
    sudo vim /etc/samba/smb.conf
    

    配置项参考:https://blog.csdn.net/lan120576664/article/details/50396511

    这里还需要注意目录权限问题。比如/home/tony的目录默认只能tony或者tony组的访问,其他用户不能访问。

    并且注意:配置/etc/smb.conf中使用@tony表示tony组,而tony则表示用户tony

    1. 添加samba用户并设置密码
      要求用户必须是已经存在的linux用户
    sudo smbpasswd -a chris
    

    表示的是添加chris用户,然后输入samba访问的密码。

    5)修改samba密码
    管理员为了方便可以把每个用户的samba账号和密码设定为相同,或者都是123456这种密码。但是每个人的安全需要自行保证,每个用户应该可以自行修改密码。

    管理员账号修改某个samba账号的密码:

    sudo smbpasswd wjj
    

    然后输入两次新密码即可

    普通用户修改自己的samba密码:

    smbpasswd
    

    然后先输入原有密码,再输入两次新密码,注意新密码的长度要大于等于5个字符,否则会修改失败

    6)设置目录权限
    包括两种case:限制性访问,例如只读、只能浏览、只能某个用户或某个组有权限;另一种是所有人都有可读可写权限。这里说一下后者,先前一直被忽略了。。

    先前一直忽略了这个配置的存在,导致想配置一个所有人public访问可读可写的目录失败。
    ref: http://blog.sina.com.cn/s/blog_61b313a30101h199.html

    ref: How to create a Samba share that is writable from Windows without 777 permissions?

    仍然是需要创建用户的:

    adduser --system shareuser
    chown -R shareuser /path/to/share
    

    Then add force user and permission mask settings in smb.conf:

    [myshare]
    path = /path/to/share
    writeable = yes
    browseable = yes
    public = yes
    create mask = 0644
    directory mask = 0755
    force user = shareuser
    Note that guest ok is a synonym for public.
    
    1. 重启服务以生效
    sudo service smbd restart
    

    8)在windows上访问
    打开资源管理器,地址栏输入"172.17.xxx.xxx",这个是你的ubuntu的ip地址,可以通过ifconfig命令查看

    1. windows上清除访问凭证
      查看现有samba连接凭证:
    net use 
    

    清除某个凭证:net use \172.17.89.33some_dir /delete(感觉好像没有用)

    control userpasswords2
    

    用户管理->高级->密码管理->找到凭证并删除->重开资源管理器,地址栏重新输入目录

    1. 通过samba操作,解压、拷贝很慢,why?
      例如想要把A服务器上的B目录内容拷贝到/media/public,结果现在samba会先拷贝到本地,然后再传上去。而本机的网络传输速度很明显是小水管慢的很。

    2. 拷贝文件,samba提示空间不足,但是磁盘明明有空间?
      google了一番,发现问题在于samba的“挂载点”和系统磁盘挂载点不一致导致的。

    譬如/etc/fstab中配置了/media/data1, /media/data2, 而/etc/samba/smb.conf中配置的是"/media",虽然访问起来方便了,但是拷贝很大(比如100G)的文件到data2的某个子目录,提示空间不足。就是因为"/media"在fstab中没有找到诶!主要改了smb.conf即可。

    sudo命令突然不能使用

    有个师妹今天运行py-faster-rcnn代码来调用Matlab命令,提示matlab权限不足,但是修改权限时候不小心改了/usr路径的权限(大概是chown -R777 /usr这样,缺少了必要的空格,导致路径下文件的setuid权限出问题)。
    总之,效果就是,sudo命令用不了了。
    解决方法很简单:进入tty界面(ctrl+F1),用root登录,然后输入chmod -R 4755 /usr

    当然,如果你仅仅是sudo命令本身不能用 那么就是chmod 4755 /usr/bin/sudo

    参考:http://blog.csdn.net/shihuacai/article/details/14645447

    安装python3.6

    项目用到python3.6特性(比如f'name.png'形式的表达)。ubuntu16.04默认的python3是3.5。

    以下做法搜集自网络,表面上看起来可用,但是隐患众多。最简单的例子:重启后gnome-terminal可能用不了了。因为很多系统工具比如gnome-terminal用了python3.5,如果把系统的python3从python3.5改到python3.6会埋藏各种隐患。最好是自行编译,对于项目中需要用python3.6的地方,通过#!/usr/bin/env python3.6来指定

    添加ppa源并安装

    sudo add-apt-repository ppa:jonathonf/python-3.6
    sudo apt update
    sudo apt install python3.6
    sudo apt install python3.6-dev #!这里是重点!记得装dev包,不然后续pip3 install xx时容易报错提示Python.h找不到
    

    设定python3默认指向python3.6:

    sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.5  1
    sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6  2
    

    确认一下:

    python3  -V
    

    补救措施
    如果你不幸重启后发现gnome-terminal不能用了。执行这些:

    sudo apt-get remove --purge python-apt 
    sudo apt-get install python-apt -f  
    cd /usr/lib/python3/dist-packages/ 
    sudo ln -sf apt_pkg.cpython-35m-x86_64-linux-gnu.so apt_pkg.cpython-36m-x86_64-linux-gnu.so
    
    cd /usr/lib/python3/dist-packages/gi
    sudo ln -sf _gi.cpython-35m-x86_64-linux-gnu.so _gi.cpython-36m-x86_64-linux-gnu.so
    sudo ln -sf _gi_cairo.cpython-35m-x86_64-linux-gnu.so _gi_cairo.cpython-36m-x86_64-linux-gnu.so
    
    # 以下两个如果没有执行,则software & updates的GUI程序窗口就打不开了。
    sudo ln -sf _dbus_glib_bindings.cpython-35m-x86_64-linux-gnu.so _dbus_glib_bindings.cpython-36m-x86_64-linux-gnu.so
    sudo ln -sf _dbus_bindings.cpython-35m-x86_64-linux-gnu.so _dbus_bindings.cpython-36m-x86_64-linux-gnu.so
    

    ref1, ref2

    Ubuntu的man就是个渣渣

    在用pip3装python包,并且开了lantern的socks代理。但是还是提示socks错误,很无语。
    然后想让pip缓存文件。于是man pip3。没想到里面的帮助信息都是过时的。正确方法是:pip3 --help而不是man pip3

    删除(大)文件后,磁盘可用空间没有变化?

    本人把一块3T的硬盘划分出1.1T,挂在/opt了,用来缓解/home和/下捉襟见肘的磁盘空间。
    然而,训练产生的caffemodel文件很大,很快,整个/opt也只有70G可用了。尝试查看每个目录占用大小:

    cd /opt
    du -sh *
    

    找到大块文件后,删掉它,包括用rm命令,和手动右键选择"move to trash"。随后再次du -sh *以及df -Th,发现/opt可用大小还是70G。

    问题在于,文件没有真的被干掉,而是被转移在/opt/.Trash/files目录下了。删除这个目录下的文件,就彻底删除了。


    ssh突然无法连接

    比如A想ssh到B但是连不上。首先确认B开启了sshd服务,并且如果有错误的话,也能在查看服务的时候看到:

    sudo service ssdh status
    

    发生过的实际例子是,B上的shell先前用的zsh,后来删掉了换成了bash,然后A这里,先前能连B,后来连不上。简单办法是B上装上zsh即可。


    protobuf报错,未定义的引用

    可能出现在很多软件的编译环节。比如,编译opencv的时候,编译了opencv contrib中的dnn模块,该模块需要用protobuf来转换Caffe的模型。报错如下:

    [ 75%] Linking CXX executable ../../bin/opencv_test_dnn
    ../../lib/libopencv_dnn.so.3.1.0:对‘google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(int, std::string const&, google::protobuf::io::CodedOutputStream*)’未定义的引用
    ../../lib/libopencv_dnn.so.3.1.0:对‘google::protobuf::io::CodedOutputStream::WriteStringWithSizeToArray(std::string const&, unsigned char*)’未定义的引用
    ../../lib/libopencv_dnn.so.3.1.0:对‘google::protobuf::internal::WireFormatLite::ReadString(google::protobuf::io::CodedInputStream*, std::string*)’未定义的引用
    ../../lib/libopencv_dnn.so.3.1.0:对‘google::protobuf::Message::GetTypeName() const’未定义的引用
    ../../lib/libopencv_dnn.so.3.1.0:对‘google::protobuf::internal::StringTypeHandlerBase::Delete(std::string*)’未定义的引用
    ../../lib/libopencv_dnn.so.3.1.0:对‘google::protobuf::MessageFactory::InternalRegisterGeneratedFile(char const*, void (*)(std::string const&))’未定义的引用
    ../../lib/libopencv_dnn.so.3.1.0:对‘google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased(int, std::string const&, google::protobuf::io::CodedOutputStream*)’未定义的引用
    ../../lib/libopencv_dnn.so.3.1.0:对‘google::protobuf::internal::StringTypeHandlerBase::New()’未定义的引用
    ../../lib/libopencv_dnn.so.3.1.0:对‘google::protobuf::internal::empty_string_’未定义的引用
    ../../lib/libopencv_dnn.so.3.1.0:对‘google::protobuf::internal::WireFormatLite::WriteString(int, std::string const&, google::protobuf::io::CodedOutputStream*)’未定义的引用
    ../../lib/libopencv_dnn.so.3.1.0:对‘google::protobuf::DescriptorPool::FindFileByName(std::string const&) const’未定义的引用
    ../../lib/libopencv_dnn.so.3.1.0:对‘google::protobuf::internal::WireFormatLite::ReadBytes(google::protobuf::io::CodedInputStream*, std::string*)’未定义的引用
    ../../lib/libopencv_dnn.so.3.1.0:对‘google::protobuf::Message::InitializationErrorString() const’未定义的引用
    collect2: error: ld returned 1 exit status
    modules/dnn/CMakeFiles/opencv_test_dnn.dir/build.make:258: recipe for target 'bin/opencv_test_dnn' failed
    make[2]: *** [bin/opencv_test_dnn] Error 1
    CMakeFiles/Makefile2:4958: recipe for target 'modules/dnn/CMakeFiles/opencv_test_dnn.dir/all' failed
    make[1]: *** [modules/dnn/CMakeFiles/opencv_test_dnn.dir/all] Error 2
    

    解决办法:一开始我猜是存在多个版本的protobuf导致的。其实这个思维定式在一定条件下是正确的。然而本质原因是:你的protobuf对应的动态链接库文件(protobuf-xxx-.so),它被编译出来的时候的g++版本,和你当前使用的(比如用来编译OpenCV的dnn模块)的g++版本不一致。

    典型的例子:因为一些原因,切换了g++版本。个人是很讨厌切换系统g++版本的,会导致类似这个例子中的各种问题。要用不同版本的g++,可以,但是不要替换系统默认的g++。

    nvidia显卡驱动需要重装

    应该是安装nvidia显卡驱动的时候没有打到内核里面去。。。还没有测试过,不过看起来应该是这么搞的:

    https://askubuntu.com/questions/841876/how-to-disable-nouveau-kernel-driver

    参考其中第二个答案,主要是dkms的安装、重新编译内核、重启

    明确/etc/environment的存在

    2018-12-25 20:58:50
    今天晚上帮同事配hexo,这个开源博客系统很久之前玩过,基于nodejs的,npm包的下载通常是卡脖子的问题,今天也是卡在这里。
    具体描述:已经配置了npm镜像,无论是否开启代理(to cross the great wall),都无法下载hexo,一直提示localhost的1080端口走不通。

    我的思路:肯定是某个配置文件设定了1080代理端口,直觉是~/.bashrc或者/etc/profile设定的,这俩文件应该说是进入bash后必然执行的两个文件了。然而naive,就算不加载这两个文件,环境变量$http_proxy依然是1080。

    最后总算找到,是/etc/environment这个文件设定了1080代理。

    /etc/environment设定了系统级别的环境变量。没什么特殊癖好的话别在这个文件里写东西,这是StackOverFlow上的网友以及我的共同观点。因为修改它导致的环境变量出问题,大部分人根本不知道这玩意儿的存在。。

    JetBrain CLion破解

    ubuntu desktop版本用来写代码 + cmake + CLion,调试方便。

    最新版CLion破解:https://gitee.com/pengzhile/jetbrains-agent

    更换硬盘,修复grub启动问题

    场景举例:原来是有n块硬盘(n>=2),现在其中某一块坏了,关机状态下把它换下,重新启动机器进ubuntu系统发现黑乎乎一片,进不去系统。

    这是因为/etc/fstab文件里的内容和硬盘实际内容不匹配导致的。

    解决思路是删掉刚刚取下的硬盘在fstab中的记录(如果有新增硬盘,并且希望系统启动就自动挂载,则也需要配置fstab文件),也就是手动编辑下/etc/fstab内容,去掉不匹配的。

    然后记得重装grub:

    #----------------------------
    # step1: 查看分区,初步认领linux分区
    #----------------------------
    # 查看磁盘分区情况。比如我有三块硬盘,分别是/dev/sda,/dev/sdb, /dev/sdc,编号按顺序从a到c,
    # 我需要搞清楚除了被卸载下来的那块硬盘,现有硬盘分区哪个对应到我先前的Linux分区
    # 比如我看到/dev/sdc上各种Linux字样的信息,说明我的原来的Linux装在/dev/sdc上了,等会要挂载到/mnt目录下
    sudo fdisk -l
    
    #----------------------------
    # step2: 认领各个linux分区
    #----------------------------
    # 这一步先通过mount -t auto  /dev/sdcX  /mnt 来认领每一个硬盘分区和Linux分区对应关系
    # 每次mount一个,然后cd /mnt,看看长什么样子,确认是/啊,还是/home啊,还是/boot啊,甚至/data等
    sudo mount -t /dev
    
    #----------------------------
    # step3: 挂载/(以及/boot,如果原来有/boot分区)
    #----------------------------
    # 这一步的目的是确保grub安装的东西是放在原有的Linux分区下的
    # 比如我的:
    sudo mount /dev/sdc7 /
    sudo mount /dev/sdc5 /boot
    
    #----------------------------
    # step4: 安装grub
    #----------------------------
    # 会把grub安装在/mnt/boot目录中
    # 也就是原来的Linux系统下的/boot目录
    # 为了确保OK,指定一下root-directory,也就是你原来的Linux分区的根目录,并且如果你原来有boot分区那么也要挂载到/分区的/boot目录上
    sudo grub-install --root-directory=/mnt/
    
    #----------------------------
    # step5: 重启以生效
    #----------------------------
    sudo reboot
    

    千万别手贱执行sudo apt autoremove命令

    这条命令对于初级中级用户来说,等同于"sudo rm -rf /*"一样危险,很容易毁掉整个Linux系统,基本上要重装的节奏。

    解释:autoremove是说删除不需要的依赖,通常在执行apt install/remove后会“友好”地提示说:

    The following packges were automatically installed and are no longer required:
    ....
    Use 'sudo apt autoremove' to remove them.

    然而实际上这个提示简直是坑爹,因为autoremove是说把你指定的包的依赖包都删掉。比如我要autoremove libreoffice,那么会把libreofflice***开头的库删掉。问题是,这些库很可能被其他正在用的软件依赖(例如firefox)。也就是:要autoremove A,那么A依赖的B也被删除,而autoremove并会去检查发现B被正在用的C所依赖,导致C也不能使用,而C往往是众多的,例如ubuntu的桌面。所以,autoremove是株连九族的暴力指令,没有十足的把握不要用,而ubuntu在apt get/remove等命令执行的最后提示的autoremove非常误导人,其心可诛

    Failed to initialize NVML: Driver/library version mismatch.

    我遇到这个问题的场景:先前用的cuda9.0,以及nvidia驱动是384(还是396?不太确定,反正低于400);然后新装了cuda10,因为cuda10必须要nvidia驱动>=410才可以正常用。

    解决办法:先卸载(如果有)原有nvidia驱动,然后安装合适版本的新驱动:
    1) 卸载:

    sudo apt install aptitude
    sudo aptitude search nvidia | grep '^i'
    sudo apt remove --purge nvidia-XXX #例如我是nvidia-384
    

    2)从nvidia官方根据自己机器显卡型号和操作系统,下载对应的驱动。我下载了418版本的。

    1. 安装
    sudo init 3
    sudo chmod +x NVIDIA-Linux-x86_64-418.43.run
    sudo ./NVIDIA-Linux-x86_64-418.43.run
    

    安装过程中注意看提示,不要一股脑全都选默认的。比如我安装时候提示说什么“pre-install脚本失败”,其实继续安装并没有问题;还有就是DKMS要选择yes,用来确保下次更新了内核时自动注册nvidia驱动模块到内核中

    参考:https://comzyh.com/blog/archives/967/

    重启后开机,循环登录

    首先是分辨率变的很小,字体很大;并且输入密码后进不了桌面,再次提示输入密码。

    这个问题原因比较多,主要参照这篇来分析定位下:https://blog.csdn.net/tangwenbo124/article/details/79120677

    我遇到的问题是linux内核更新了,需要装新版nvidia驱动。装nvidia驱动简单,见上面一条经验。但为什么内核版本_不知不觉的_更新了?

    1. /var/log/apt/history.txt显示,今天(重启前)更新了内核:

    Start-Data: 2019-03-16 06:45:03
    Commandline: /usr/bin/unattended-upgrade
    Install: linux-modules-4.4.0-143-generic:amd64 (4.4.0-143.169, automatic), linux-headers-4.4.0-143:amd64(4.4.0-143.169, automatic), linux-heawders-4.4.0-143->generic:amd64(4.4.0-143.169, automatic), linux-modules-extra-4.4.0-143-generic:amd64(4.4.0-143.169, automatic)

    然而我并没有手贱地手动更新内核,罪魁祸首其实是unattended-upgrade

    man一下发现,这货在每天的cron任务(/etc/cron.daily/apt-compat)重被在随机的时间点触发使用,更新了内核。

    对于服务器来说,unattended-upgrade安装了新版安全内核,好像不错;但是对于nvidia驱动(尤其是搞深度学习训练的),如果驱动没配置DKMS那么重启后就循环登录了;即使不使用图形界面,也会遇到问题,只不过问题变成了:NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.

    禁用unattended-upgrade的方法:

    sudo vim /etc/apt/apt.conf.d/10periodic
    
    APT::Periodic::Unattended-Upgrade "0";
    

    NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.

    同上一条经验。解决步骤:

    1. 卸载已有驱动,重装合适版本驱动,安装时注意勾选DKMS为yes

    2. 关掉unattended-upgrade(自动更新,会导致内核更新,导致nvidia驱动用不了),已绝后患
      (参考:http://ask.xmodulo.com/disable-automatic-updates-ubuntu.html)

    ubuntu下nvidia显卡驱动卸载

    如果是CUDA安装包里的显卡驱动,或者.run格式的驱动,安装后会提供/usr/bin/nvidia-uninstall脚本,执行它即可完成驱动卸载。

    如果是apt方式安装的,则先通过

    sudo aptitude search nvidia |grep '^'
    

    查看已经安装的nvidia显卡驱动包的名字,然后用apt卸载

    使用阿里云的CUDA源

    首先从nvdia官方下载cuda的network包,安装。
    安装好了之后,估计是/etc/apt/sources.list.d/目录下有个对应的配置文件,把里面的nvidia那边的repo地址改成阿里云的nvidia-cuda的repo地址即可:

    说明:这个方法有时候不能添加key导致无法下载;有时候需要同时配置aliyun和官方nvidia的repo否则aliyun提供的下载不完整导致下载失败。

    git clone被限速怎么办

    用ping命令查询域名 github.global.ssl.fastly.net 公网地址并添加到hosts文件。

    windows修改host文件: C:WindowsSystem32driversetchosts
    linux 修改host文件: /etc/hosts

    e.g.

    151.101.41.194 github.global.ssl.fastly.net  
    

    ls列出目录下文件,并且添加前缀

    使用场景:CMakeLists.txt中添加某个目录下的文件,需要添加部分路径前缀。

    for i in `ls -1`; do echo "src/operator/$i"; done
    
    #得到:
    src/operator/naive_convolution.c
    src/operator/naive_convolution.h
    src/operator/naive_pooling.c
    src/operator/naive_pooling.h
    src/operator/naive_relu.c
    src/operator/naive_relu.h
    

    编译链接报错说缺少.so文件,查找和安装对应的apt包

    举例:编译安装了 clang后,编译darknet的第一次commit的源码,提示说LLVMgold.so找不到。则利用apt-file查找该.so文件对应的apt包的名字,然后apt安装:

    apt-file update
    apt-file search LLVMgold.so
    

    安装qq

    先利用ppa源,安装wine:

    sudo add-apt-repository ppa:wine/wine-builds  
    sudo apt-get update
    sudo apt-get install winehq-devel
    

    然后下载wine版QQ:
    链接: https://pan.baidu.com/s/1QK5HVh23dlZNMQg9ifIEKw 提取码: f2pr 复制这段内容后打开百度网盘手机App,操作更方便哦

    tar xvf wineQQ8.9_19990.tar.xz -C ~/
    

    按Win窗键,输入qq,打开QQ。第一次启动会提示安装必要的组件。装好组件后可以登录使用。

    ref: https://www.cnblogs.com/zllwxm123/p/8512642.html

    nvidia驱动卸载安装的方法总结

    1. .run文件安装的,卸载:sudo /usr/bin/nvidia-uninstall,或找到原始的.run文件,执行sudo bash ./xxx.run --uninstall
    2. cuda安装包里的显卡驱动,卸载:sudo /usr/bin/nvidia-uninstall
    3. apt repo下载安装的:
    sudo aptitude search nvidia | grep '^i' #查看
    sudo apt remove --purge nvidia-XXX #例如我是nvidia-384
    

    设定PYTHONPATH

    先前一直以为PYTHONPATH用来找第三方module的。对,但是不完全。
    设定PYTHONPATH为分隔符(win下为分号,Linux下为冒号)开头或结尾,则运行阶段sys.path中,sys.path[1]会是“执行当前脚本时所在的目录”。
    例如运行一个开源项目,目录结构:

    • tools/test.py
    • utils/stat.py
      要执行tools/test.py,并且里面会import utils.stat模块,则因为设定了PYTHONPATH,使得test.py目录和项目根目录都在sys.path中,能够自然的包含utils目录而不是报错。

    64位ubuntu编译32位程序

    默认不支持32位编译,例如:

    (base) zz@arcsoft-03:~/work/test$  g++ -std=c++11 -mavx -m32 main2.cpp
    In file included from main2.cpp:5:0:
    /usr/include/c++/5/iostream:38:28: fatal error: bits/c++config.h: No such file or directory
    

    第一步:确认64为架构的内核

    dpkg --print-architecture
    
    输出:
    adm64
    

    第二步:确认打开了多架构支持功能

    dpkg --print-foreign-architectures
    
    输出:
    i386
    

    说明已打开,如果没有需要手动打开

    打开多架构支持

    sudo dpkg --add-architecture i386
    sudo apt-get update
    sudo apt-get dist-upgrade
    

    如此这般你就拥有了64位系统对32位的支持

    最后是安装 multilab

    sudo apt-get install build-essential gcc-multilib g++-multilib # 经测试发现和gcc-arm-gnueabihf, g++-arm-gnueabihf冲突
    
    #如下的安装方式会更加合理,可以和gcc/g++的gnueabihf编译器共存
    sudo apt install libc6:i386 libstdc++6:i386
    sudo apt install lib32ncurses5 lib32z1
    

    Linux gdbserver+gdb 调试

    Linux gdbserver+gdb 调试

    valgrind报错VEX temporary storage exhausted

    在ubuntu16.04上测试LazyNet时出现的报错。原本执行的命令:

    valgrind --tool=memcheck --leak-check=yes ./lazynet
    

    尝试过指定vex参数为25:( 参考1, 参考2 )

    valgrind --tool=memcheck --leak-check=yes ./lazynet --vex-guest-max-insns=25
    

    但报错不变。

    卸载了apt安装的valgrind,转为源码编译安装:

    sudo apt remove valgrind -y
    cd ~/work
    wget https://sourceware.org/pub/valgrind/valgrind-3.15.0.tar.bz2
    tar -jxvf valgrind-3.15.0
    cd valgrind-3.15.0
    ./autogen.sh
    ./configure --prefix=/home/zz/soft/valgrind
    make -j8
    make install
    

    给PATH环境变量首部添加(append)valgrind安装后的bin目录

    vim ~/.zshrc
    export PATH=/home/zz/soft/valgrind/bin:$PATH
    

    重开terminal,重新执行valgrind内存泄漏检测即可:

    valgrind --tool=memcheck --leak-check=yes ./lazynet
    

    aptitude命令的使用

    查看包的简介:

    aptitude show xxx
    

    apt命令的使用

    挖坑待填

    dpkg命令的使用

    挖坑待填

    ubuntu不显示调节声音的图标

    某天打开Ubuntu16.04桌面,发现Unity状态栏(桌面右上方)的声音调节图标不见了。虽然可以到设置->声音中调整,不过不方便。
    印象中新装的系统是有这个图标的,可能是之前误操作删除了一些apt的包导致的。

    解决办法

    sudo apt-get install indicator-sound -y
    gsettings set com.canonical.indicator.sound visible true
    sudo apt-get install unity-control-center
    

    然后登出(logout)当前用户,重新登录进来;或者重启系统也可以。之后就可以看到声音图标了。

    参考

    Missing sound volume icon on screen top (14.04)

    切换默认shell

    默认shell是bash,希望切换到zsh。虽然我知道oh-my-zsh这样的很棒的库可以自动帮我们配置,不过我得经验是oh-my-zsh功能太多,我不需要。我是自行配置了自己的.zshrc。
    从bash切换到zsh,不会影响到其他人。只需要:

    chsh -s /usr/bin/zsh zz
    

    然后重新登录(ssh的话重新连接)即可。

    cudnn下载慢

    需要先登录网页。交给迅雷下载仍然不到200k的速度。
    从镜像获取好了:http://file.ppwwyyxx.com/
    或者用 https://d.serctl.com/

    本地显示远程绘图

    原理是通过ssh的X11转发来做到,本地客户端的话根据操作系统不同,用的接收X11转发的工具也不一样。

    windows的话用Ximg+putty,参考 https://www.jianshu.com/p/8a612eb239b7

    debconf: unable to initialize frontend: Dialog

    按文件大小列出文件

    从大到小:du -sh * | sort -hr
    从小到大:du -sh * | sort -h

    ubuntu查看某个软件包版本

    对于已安装的软件包,用apt-show-versions:

    # 安装
    sudo apt install apt-show-versions
    
    # 使用,举例
    apt-show-versions colordiff
    

    不管是否已经安装,都可以查询版本的方法:

    sudo apt-cache madison <pkg_name>
    

    例如

    sudo apt-cache madison libopencv-dev
    

    中文乱码

    在使用某些docker镜像时,NFS挂载的磁盘上,中文目录显示为一串问号。应该是镜像本身不是中文版的缘故,配置方法:

    安装中文语言包

    apt install language-pack-zh-hans
    

    配置 locale

    apt install locales
    locale-gen zh_CN.utf8
    update-locale
    

    编辑/etc/default/locale,添加:

    LANG="zh_CN.UTF-8"
    LANGUAGE="zh_CN:zh"
    

    退出重连ssh即可显示。

    参考:
    https://askubuntu.com/questions/162391/how-do-i-fix-my-locale-issue

    排查环境变量在哪里被设定

    譬如上面“中文显示为问号”的问题,找了另一台中文显示正常的镜像,知道$LANG环境变量需要配置,但不知道在哪里配置。网上很多博客提到/etc/environment里配置,但强迫症发现,正常显示中文的ubuntu系统中并不是在/etc/environment里配置的。

    排查方法:
    如果用zsh作为登录shell,则执行:

    zsh -xl
    

    bash的话则执行:

    PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>&2
    

    这回模拟shell登录过程,显示所执行的操作。

    对于bash,也可以输出到文件,而不是屏幕,方法是把7>&2换成7> file.log

    PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7> file.log
    

    如果这样并不能显示出想排查的环境变量,则依次检查:

    • ~/.ssh/environment
    • ~/.xinitrc
    • ~/.xsession
      如果还没有,则用find来检查:
    find /etc/ -type f -exec grep -F THE_VAR {} +
    

    参考:
    https://unix.stackexchange.com/questions/813/how-to-determine-where-an-environment-variable-came-from

    ~/.pip/pip.conf不生效

    根据 pip官方文档,最新的pip默认用~/.config/pip/pip.conf来加载配置项。

    实测,如果~/.config/pip/pip.conf有配置源,则~/.pip/pip.conf不生效。

    只列出当前目录下文件/目录

    只列出当前目录下的文件:经典做法是 ls+grep正则:

    ls -al | grep '^[^d]'
    

    不过还可以不记正则,用find:

    find . -maxdepth 1 -type f
    

    类似的,只列出当前目录下的目录(只考虑一层),两种写法分别是:

    ls -al | grep '^d'
    
    find . -maxdepth 1 -type d
    

    查看当前使用的显卡驱动

    lspci -vnn | grep VGA -A 12 | grep driver
    

    例如我的是Kernel driver in use: nouveau

    ifconfig命令没找到?

    sudo apt install net-tools
    

    安装VSCodium

    # add key
    wget -qO - https://gitlab.com/paulcarroty/vscodium-deb-rpm-repo/raw/master/pub.gpg | sudo apt-key add - 
    
    # add repo
    echo 'deb https://gitlab.com/paulcarroty/vscodium-deb-rpm-repo/raw/repos/debs/ vscodium main' | sudo tee --append /etc/apt/sources.list.d/vscodium.list 
    
    # update & install
    sudo apt update && sudo apt install codium 
    

    解压.z01格式的文件

    file xxx.z01
    

    类型为:

    Zip multi-volume archive data, at least PKZIP v2.50 to extract

    1).按下面提示方法, 安装7zip

    sudo apt-get install p7zip-full
    
    1. .使用7z解压缩文件
    7z x XXXX.zip
    

    vim全局查找

    Esc
    :%s/xxx/yyy/g
    

    其中xxx是原始内容,yyy是替换后的内容

    vim查找时忽略大小写/大小写敏感

    :set ic
    

    也就是

    set ignorecase
    

    来切换

    查询Linux某命令来自哪个包

    apt-file

    安装和配置:

    sudo apt-get install -y apt-file
    apt-file update
    

    使用:apt-file search xxx,建议xxx用绝对路径。例如:

    (base) arcsoft-43% which addr2line
    /usr/bin/addr2line
    (base) arcsoft-43% apt-file search /usr/bin/addr2line
    binutils: /usr/bin/addr2line
    binutils-multiarch: /usr/bin/addr2line
    

    用aptitude查找包

    aptitude search pkgName
    

    pkgName可以有多个(空格分隔)

    安装ffmpeg

    sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-next 
    sudo apt-get update 
    sudo apt-get install ffmpeg
    

    编译安装opencv和opencv contrib 以及python接口

    罗嗦版:http://www.cnblogs.com/zjutzz/p/6714490.html

    mkdir -p ~/work/gitdown
    cd $_
    git clone https://github.com/opencv/opencv
    git clone https://github.com/opencv/opencv_contrib
    cd opencv
    mkdir build
    cd build
    cmake 
    -D CMAKE_BUILD_TYPE=Release 
    -D CMAKE_INSTALL_PREFIX=/usr/local/opencv-git-master 
    -D WITH_CUDA=OFF 
    -D WITH_VTK=OFF 
    -D WITH_MATLAB=OFF 
    -D BUILD_DOCS=ON 
    -D OPENCV_EXTRA_MODULES_PATH=/home/chris/work/gitwhat/opencv_contrib/modules 
    -D PYTHON2_EXECUTABLE=/usr/bin/python 
    -D PYTHON3_EXECUTABLE=/usr/bin/python3 
    -D PYTHON_INCLUDE_DIR=/usr/include/python2.7 
    -D PYTHON_INCLUDE_DIR2=/usr/include/x86_64-linux-gnu/python2.7 
    -D PYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython2.7.so 
    -D PYTHON2_NUMPY_INCLUDE_DIRS=/usr/lib/python2.7/dist-packages/numpy/core/include/ 
    -D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/lib/python3.5/dist-packages/numpy/core/include/ 
    ..
    

    期间容易出现ippicv等第三方包下载不下来的情况。找到对应的.cmake文件,把下载地址拼接出来自行下载,注意替换掉md5的hash值。下载的文件放到<opencv_root>/.cache目录下,例如:

    .cache
    ├── ippicv
    │   └── 1469ff5ced054be500921d2d46278ef4-ippicv_linux_20151201.tgz
    ├── protobuf
    │   └── bd5e3eed635a8d32e2b99658633815ef-protobuf-cpp-3.1.0.tar.gz
    ├── tiny_dnn
    │   └── adb1c512e09ca2c7a6faef36f9c53e59-v1.0.0a3.tar.gz
    └── xfeatures2d
        ├── boostdesc
        │   ├── 0ae0675534aa318d9668f2a179c2a052-boostdesc_lbgm.i
        │   ├── 0ea90e7a8f3f7876d450e4149c97c74f-boostdesc_bgm.i
        │   ├── 202e1b3e9fec871b04da31f7f016679f-boostdesc_binboost_064.i
        │   ├── 232c966b13651bd0e46a1497b0852191-boostdesc_bgm_bi.i
        │   ├── 324426a24fa56ad9c5b8e3e0b3e5303e-boostdesc_bgm_hd.i
        │   ├── 98ea99d399965c03d555cef3ea502a0b-boostdesc_binboost_128.i
        │   └── e6dcfa9f647779eb1ce446a8d759b6ea-boostdesc_binboost_256.i
        └── vgg
            ├── 151805e03568c9f490a5e3a872777b75-vgg_generated_120.i
            ├── 7126a5d9a8884ebca5aea5d63d677225-vgg_generated_64.i
            ├── 7cd47228edec52b6d82f46511af325c5-vgg_generated_80.i
            └── e8d0dcd54d1bcfdc29203d011a797179-vgg_generated_48.i
    
    

    新编译出来的cv2.so位于/usr/local/opencv-git-master/lib/cv2.so

    sudo apt-get remove python-opencv
    sudo ln -sf /usr/local/opencv-git-master/lib/python2.7/dist-packages/cv2.so /usr/lib/python2.7
    

    或者设定PYTHONPATH也可以

    编译安装protobuf3.2

    apt装的protobuf是2.5版本. pip装的protobuf是3.2版。 使用了python layer的网络,如果用tools/caffe.cpp编译出的工具build/caffe来执行网络,会报protobuf版本问题,需要protobuf-cpp的版本装3.2版

    编译装protobuf3.2

    卸载apt的protobub

    sudo apt-get remove --purge libprotobuf-dev
    

    如果你是ubuntu-desktop用户,那你的桌面有可能被误删。立即安装(不要重启):

    sudo apt-get install ubuntu-desktop -y
    sudo apt-get install unity -y
    sudo apt-get install compiz-gnome -y
    sudo apt-get install libcompizconfig0 -y
    

    静态编译protobuf(产生libprotobuf.a而不是.so文件,否则caffe编译会报错)

    sudo apt-get install autoconf automake libtool curl make g++ unzip
    cd ~/work/gitdown
    git clone https://github.com/google/protobuf
    git checkout -b 3.2.x origin/3.2.x
    cd protobuf
    
    vim configure
    

    修改2658行和2661行,引号里面都换成"-fPIC"

    ./autogen.sh
    ./configure --disable-shared
    make -j8
    sudo make install
    

    sudo ldconfig

    重新编译caffe

    cd ~/work/caffe-BVLC
    make clean
    make -j8
    make pycaffe
    

    android-studio

    真机调试:需要先设定udev的规则。
    参考:http://www.jianshu.com/p/958361328ae5

    exfat无法挂载?

    sudo apt-get install exfat-utils
    

    flash

    sudo apt-get install flashplugin-installer
    

    refs

    http://blog.csdn.net/linyushan11/article/details/10378419

    https://github.com/BVLC/caffe/issues/19

    压缩解压相关

    .tar.gz

    关键命令选项是"z"。不写"-",不写"z",都可以。
    解压(到当前目录下):tar -zxvf xxx.tar.gz
    解压到指定目录(应事先存在):tar -zxvf xxx.tar.gz -C /path/to/extract

    .tar.bz2

    关键命令选项是"j"。不写"-",不写"J",都可以。
    解压(到当前目录下):tar -jxvf xxx.tar.bz2
    解压到指定目录(应事先存在):tar -jxvf xxx.tar.bz2 -C /path/to/extract

    .xz

    关键命令选项是"J"。不写"-",不写"J",都可以。
    解压(到当前目录下):tar -Jxvf xxx.tar.xz
    解压到指定目录(应事先存在):tar -Jxvf xxx.tar.xz -C /path/to/extract

    .zip

    解压(到当前目录下):unzip xxx.zip
    解压到指定目录(目录不存在则自动创建):unzip xxx.zip -d /path/to/extract

    .rar

    sudo apt install rar unrar  #注意apt源配置要配置multiverse
    

    解压(到当前目录下):unrar e xxx.rar
    解压到指定目录下(应事先存在):unrar x xxx.rar /path/to/extract

    split切割文件
    有时候文件很大很多,压缩后仍然很大,传输困难(例如单个文件超过磁盘大小,单个大文件ftp传输容易失败等),可以用split命令切割,然后再合并。

    split是切割文件,不管它是压缩文件还是单个大文件。

    举例:把googletest-release-1.8.0.tar.xz(560k),以50k为单位切割,切割后的文件们,名字前缀是"gtest.tar.zx_":

    split googletest-release-1.8.0.tar.xz -b 50k gtest.tar.zx_
    

    拼接回去:用cat命令:

    cat gtest.tar.zx_* > gtest.tar.xz
    

    apt和dpkg相关命令整理

    1. 文件->包

    查询某文件属于哪个包
    例如头文件(xxx.h, 编译问题)、库文件(xxx.so, 链接问题、运行问题)。

    dpkg -S xxx, 需要包已经安装
    例如dpkg -S libSPIRV-Tools-opt.so,返回:

    spirv-tools: /usr/lib/x86_64-linux-gnu/libSPIRV-Tools-opt.so
    

    apt-file -x search xxx,不需要包已经安装

    2. 包->文件

    dpkg -L xxx,需要包xxx已经安装

    apt安装时报dpkg info错

    例如samba-common包
    dpkg:处理 samba-common (--configure)时出错: 子进程 已安装 post-installation 脚本 返回了错误号 10 dpkg:依赖关系问题使得 samba 的配置工作不能继续: samba 依赖于 samba-common (= 2:3.5.8~dfsg-1ubuntu2.3);然而: 软件包 samba-commo...

    解决思路: 把/var/lib/dpkg/info/samba*文件挪走(似乎删除也没问题),然后apt remove samba,再apt install samba即可

    如果不是samba而是其他软件包(例如apt-show-versions),则相应替换即可。

  • 相关阅读:
    关于响应式框架的定位不了元素的坑
    pychrom 中文版
    firebug定位工具很强大
    查询数据中所有表名
    java解析Json中获取Array字段值及嵌套Json对象
    mysql表操作
    集合框架(二)
    集合框架
    Java API(二)
    JDBC入门
  • 原文地址:https://www.cnblogs.com/zjutzz/p/13340409.html
Copyright © 2020-2023  润新知