使用ubuntu的一些经验总结。

目录

换源

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 cmake aptitude apt-file autoconf automake libtool exfat-utils emacs openssh-server subversion unrar tmux enca

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://mirrors.ustc.edu.cn/pypi/web/simple/
format = columns
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/\r//g' {}

或者更简单点:

find . -name '*.cpp' | xargs sed -i 's/\r//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

7)在windows上访问

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

  1. windows上清除访问凭证

    查看现有samba连接凭证:
net use

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

control userpasswords2

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

  1. 通过samba操作,解压、拷贝很慢,why?

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

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:\Windows\System32\drivers\etc\hosts

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的话重新连接)即可。

ubuntu日常使用指南的更多相关文章

  1. docker日常使用指南

    docker日常使用指南 目录 docker日常使用指南 前言 1.基础知识 1.1 docker是什么 1.2 与虚拟机(VM)的区别 1.3 镜像与容器 2.安装 2.1 在线安装 2.2 离线安 ...

  2. [转]Ubuntu桌面入门指南

    Ubuntu桌面入门指南 http://wiki.ubuntu.org.cn/Ubuntu%E6%A1%8C%E9%9D%A2%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97

  3. Ubuntu日常使用总结

    Contents 使用了将近一年的Ubuntu,感觉不用windows也可以处理日常的事务.并且我相信只要合理利用Ubuntu,一定可以取代你手中的Windows.我不是说Ubuntu有多么好,只是从 ...

  4. 卸载windows安装ubuntu的完全指南

    卸载windows安装ubuntu的完全指南 新配置了一台深度学习服务器,但是预装系统为windows10,与需求不符.于是,自己动手安装ubuntu(18.04).此文为过程记录. 主要步骤: 准备 ...

  5. Ubuntu linux背景指南:在开始之前需要知道哪些东西

    1.摘要 Ubuntu是一个新的GNU/Linux衍生操作系统,其目标是更多地以用户为本以及桌面应用. 因此,Ubuntu的目的是消除安装的困难,在很大程度上靠自动配置和自动探测硬件解决 问题,无须用 ...

  6. Ubuntu PPA 使用指南

    作者: Abhishek Prakash 译者: LCTT jlztan | 2019-01-19 11:02 一篇涵盖了在 Ubuntu 和其他 Linux 发行版中使用 PPA 的几乎所有问题的深 ...

  7. Ubuntu日常问题搜集和解决办法

    搜集了日常工作中linuxmint的使用的命令备份和遇到的问题以及解决办法.(持续更新中) 保持ssh链接超时不自动断开 用ssh链接服务端,一段时间不操作或屏幕没输出(比如复制文件)的时候,会自动断 ...

  8. Ubuntu的Mysql指南

    安装MySQL sudo apt-get install mysql-server 这个应该很简单了,而且我觉得大家在安装方面也没什么太大问题,所以也就不多说了,下面我们来讲讲配置. 配置MySQL ...

  9. 【Ubuntu日常技巧】【解决】Ubuntu 16 右上角的音量调节通知框不停地闪烁问题

    一. 先上干货 解决问题 1.1 安装工具alsa-tools-gui sudo apt-get install alsa-tools-gui 1.2 通过hdajackretask设置 直接执行命令 ...

随机推荐

  1. did not finish being created even after we waited 189 seconds or 61 attempts. And its status is downloading

    did not finish being created even after we waited 189 seconds or 61 attempts. And its status is down ...

  2. chrome主页篡改解决方法

    网上有一个超级细致的小白教学连接,但是发现很难找到,分享一下:https://arlenluo.github.io./2017/03/12/DefeatYourBrowser 还有一种情况是要打开 & ...

  3. 第三周java学习总结

    学号 20175206 <Java程序设计>第三周学习总结 教材学习内容总结 本周为第四章的学习,分为以下几个方面: 1.包与代码组织 2.String类 3.对象创建 4.包装类 经过代 ...

  4. sk-learn 决策树的超参数

    一.参数criterion:特征选择标准,[entropy, gini].默认gini,即CART算法. splitter:特征划分标准,[best, random].best在特征的所有划分点中找出 ...

  5. 树莓派安装 MySQL 时出现错误的解决方法

    今天被要求解决一个树莓派无法正常安装 MySQL 的问题.以下是解决过程记录. 我在 Mac 上利用 SSH 连接到树莓派,执行 sudo apt-get install mysql-server m ...

  6. jq常用事件(on,blur,focus,change),js/jq等待图片(页面)加载完毕事件,js读取文件

    jq常用事件(on,blur,focus,change) // 方法一(推荐) $('.box').on( "click",function() {} ) $('.box').on ...

  7. [BZOJ 4152][AMPPZ 2014]The Captain

    这道题对费用的规定是min(|x1-x2|,|y1-y2|).如果暴力枚举所有的点复杂度O(n²),n <= 200000,显然爆炸.于是我们要考虑加“有效边”,一个显然的事实是对于两个点,如果 ...

  8. react native 子组件向父组件传值

    父组件:   引入子组件:import CheckBox from  '../checkbox';   父子之间交互通信,接受子组件的值 fn(val){this.setState({roleType ...

  9. Response.Write()方法响应导致页面字体变大的解决办法

    关于ASP.NET中用Response.Write()方法响应导致页面字体变大的解决办法     最近研究了ASP.NET,发现一个问题,比方说在页面里面有个Button,要点击以后要打开新窗口,而且 ...

  10. mac air中编译安装swoole

    本机php版本, 我的7.3.0 1 下载swoole源码 https://github.com/swoole/swoole-src/releases 我下载的版本是swoole-src-4.3.3. ...