Vim 配置

打印信息

  • :echo:打印信息,但是信息不会保存
  • :echom:打印信息会保存在:messages
  • :messages:查看:echom保存的信息

设置选项

  • 设置选项方式

    • 命令行一次设置多个选项::set number numberwidth=6
    • 本地缓冲区设置::setlocal nonumber
  • 设置 bool 选项

    • :set <name>:打开选项
    • :set no<name>:关闭选项
    • :set <name>!:切换选项
    • :set <name>?:查看选项值(返回或no
  • 设置键值选项

    • :set <name>=value:设置选项值
    • :set <name>?:查看选项值
    • 键值选项支持运算:+=

statusline 状态栏设置

  • 状态栏代码通用格式:%-0{minwid}.{maxwid}{item}

    • -:左对齐
    • 0:使用”0”填充
    • %=:切换到状态栏右侧

    • %f:文件名

    • %F:完整路径文件名
    • %y:文件类型([text],[python])
    • %Y:文件类型(TEXT,PYTHON)

    • %l:当前行号

    • %L:总行数
    • %v/%V:列号
    • %c:字符列号
    • %p:文件位置百分比

    • %n:buffer number

    • %{&ff}:文件格式(DOS、UNIX)
    • %b:当前字符ACSII码
    • %B:当前字符16进制值
    • %m:modified flag([+],[-]表示不可修改)
  • 设置状态栏显式格式,既可以一行完成配置,也可以分开配置

    1
    2
    3
    4
    5
    6
    set statusline=%f\ -\ filetype:\ %y
    set statusline=%f
    set statusline+=%=
    set statusline+=%l
    set statusline+=/
    set statusline+=%L
    • 中间空格需要用“\“转义,“%%”转义“%”
  • laststatus:设置状态栏显示模式

    • 1:默认值,两个以上窗口才显示
    • 2:一直显示

折叠设置

  • foldmethod
    • manual:手动折叠选中的行(默认 zf 触发)
    • marker{{{` 到 `}}} 标记待折叠行(默认 za 触发)
    • indent:折叠缩进
    • syntax:语法折叠
  • foldlevel=<num>:设置 indent 折叠起始水平(zm 触发),即从 <num> 水平开始尝试折叠
  • foldlevelstart=<num>:设置文件打开时默认折叠水平
    • -1:初始不折叠
  • foldcolumn=<num>:用 <num> 行表示可可折叠状态

一些常用关键字

  • iskeyword=@,_,48-57,192_255:指定关键字

    • 下划线
    • ASCII 码位在 48-57 之间的字符(0-9)、192-255之间的字符
  • conceallevel=0:隐藏等级

    • 1
    • 2

键盘映射

1
:<mode>map <mark> {lhs} {rhs}
  • 注意:映射后不能跟注释,vim会认为整行都是命令

映射工作模式

  • 映射的工作模式可区分 6 种
    • normal 模式:输入命令时
    • visual 模式:可视区域高亮并输入命令时
    • select 模式:类似可视模式,但键入的字符对选择区替换
    • operator-pending 模式:操作符等待中
    • insert 模式:包括替换模式
    • command-line 模式:输入 :/ 命令时

映射命令设置

  • 映射命令设置的模式如下,对应都有如下非递归、取消命令

    • <mode>noremap[!]:非递归映射,即不会在其他映射中再次被展开
    • <mode>unmap[!]:取消映射
    • <mode>mapclear[!]

    |命令|模式| |——-|——-| |:map|normalvisualselectoperator-pending| |:nmap|normal| |:vmap|visualselect| |:smap|selection| |:xmap|visual| |:omap|operator-pending| |:map!|insertcommand-line| |:imap|insert| |:lmap|insertcommand-lineLang-Arg| |:cmap|command-line| |:tmap|终端作业|

特殊参数

  • 映射特殊参数

    • <buffer>:映射将局限于当前缓冲区
      • 优先级比全局映射高
      • 清除映射时同样需要添加参数
      • 可使用 <leader> 替代 <localleader> 可工作,但是不推荐
    • <nowait>:存在较短映射时,失效以其作为前缀的较长映射
    • <silent>:映射不在命令行上回显
    • <special>:特殊键可以使用<>记法
    • <script>:映射只使用通过以<SID>开头来定义的脚本局部映射来重映射优右值中的字符
    • <unique>:若存在相同命令、缩写则定义失败
      • 定义局部映射时,同样会检查全局映射
    • <expr>:映射的右值将被作为表达式被计算
  • 特殊参数说明

    • 特殊参数的尖括号<>是本身具有的,必须紧跟命令后面
    • 有些特殊参数在取消映射时同样需注明

omap

  • 应用方法:operator (操作) + operator-pending (移动、范围选择)
  • 预定义的 operator-pending 映射如 wawi(t,

    |按键 |操作 |移动 | |———-|———————-|———————-| |dw |删除(delete) |到下一个单词 | |ci( |修改(change) |在括号内 | |yt, |复制 |到逗号前 |

  • 自定义的 operator-pending 映射则需要

    • 选取一定范围:可同时指定开头、结尾(一般通过进入 visual 模式下选择范围)

      1
      2
      3
      4
      5
      6
      7
      " 下个括号内内容
      onoremap in( :<c-u>normal! f(vi(<cr>
      " 当前括号内容
      onoremap il( :<c-u>normal! f)vi(<cr>`
      " 选取使用 `===` 标记 markdown 标题
      onoremap ih :<c-u>execute "normal! ?^==\\+$\r:nohlsearch\rkvg_"<cr>
      onoremap ah :<c-u>execute "normal! ?^==\\+$\r:nohlsearch\rg_vk0"<cr>
    • 指定光标位置:光标当前位置为开头、指定位置为结尾

      1
      2
      " 移动至 `return` 前一行
      onoremap b /return<cr>

leaderslocalleader

leaderlocalleader:作为“前缀”的不常用的按键,后接其他字符作为整体映射

  • 用途

    • 避免覆盖太多按键原始功能
    • 约定俗成的规范,容易理解
    • 方便更改 <leader><localleader> 作为前缀设置
      • <leader>:对全局映射而设置的映射的前缀
      • <localleader>:只对某类(个)文件而设置的映射的前缀
    • <leader><localleader> 除了设置不同以外,没有太大区别,应用场合时约定规范,不是强制性的
  • <leader><localleader> 设置

    1
    2
    3
    4
    :let mapleader = "-"
    :nnoremap <leader>d dd
    :let maplocalleader = "\\"
    :nnoremap <buffer> <localleader>c I#<esc>
    • vim 会对 mapleadermaplocalleader 进行特殊的处理,不是简单的声明

Abbreviations 缩写

  • iabbrev:紧跟缩写输入非关键字后,缩写会替换为相应的完整字符串
    • 相较于映射
      • iabbrev 用于 insertreplacecommand-line 模式
      • iabbrev 会注意缩写前后的字符,只在需要的时候替换
    • iabbrev 同样支持特殊参数
      • <buffer>:仅限本地缓冲区
1
2
3
4
5
6
7
8
" 纠错
iabbrev waht what
" 简化输入
iabbrev @@ xyy15926@gmail.com
" 替换 `----` 为前个单词
iabbrev <buffer> ---- &mdash
" 替换 `return` 为 null
iabbrev <buffer> return nopenopenope
  • :set iskeyword? 即可查看关键字字符

Autocmd 自动命令

autocmd 使用

  • autocmd 注意事项

    • 同时监听多个事件,使用 , 分隔,中间不能有空格
    • 一般同时监听 bufnewfilebufread,这样打开文件时无论文件是否存在都会执行命令
    • 所有事件后面都需要注明适用场景,可用*表示全部场景,中间也不能有空格
    • autocmd 是定义命令,不是执行命令
      • 每次执行都会定义命令,而vim 不会忽略重复定义
      • 如::autocmd bufwrite * :sleep 200m,每次执行时都会重复定义命令
  • 缓冲区事件

    1
    2
    3
    4
    autocmd bufnewfile * :write
    autocmd bufnewfile *.txt :write
    autocmd bufwritepre *.html :normal gg=g
    autocdm bufnewfile,bufread *.html setlocal nowrap
  • filetype 事件(vim 设置缓冲区 filetype 时触发)

    1
    2
    3
    4
    autocmd filetype javascript nnoremap <buffer> <localleader>c i//<esc>
    autocmd filetype python nnoremap <buffer> <localleader>c i#<esc>
    autocmd filetype javascript :iabbrev <buffer> iff if ()<left>
    autocmd filetype python :iabbrev <buffer> iff if:<left>

augroup 自动命令组

  • 自动命令组

    1
    2
    3
    4
    augroup cmdgroup
    autocmd bufwrite * :echom "foo"
    autocmd bufwrite * :echom "bar"
    augroup end
  • 注意事项

    • 类似 autocmdvim 不会忽略重复定义,但是可以通过 :autocmd! 清除一个组

      :augroup cmdgroup : autocmd! : autocmd bufwrite :echom “foo” : autocmd bufwrite :echom “bar” :augroup end

Vim安装

安装选项

1
2
3
4
5
6
7
8
$ ./configure --with-features=huge\
--enable-multibyte \
--enable-python3interp \
--with-python3-config-dir=/usr/lib64/python3.4/config-3.4m/ \
--enable-pythoninterp \
--with-python-config-dir=/usr/lib64/python2.7/config/ \
--prefix=/usr/local
--enable-cscope
  • 按照以上命令配置,编译出的Vim版本中是动态支持 +python/dyn+python3/dyn

  • 此时Vim看似有python支持,但是在Vim内部 :echo has("python"):echo has("python3")都返回0

  • 之后无意中尝试去掉对python的支持,编译出来的Vim就是 可用的python3,不直到为啥

Linux介绍

Linux版本

内核版本

内核版本号由3个数字组成X.Y.Z-P

  • X:主版本号,比较稳定,短时间不会改变
  • Y:次版本号,表示版本类型
    • 偶数:稳定版
    • 奇数:测试版
  • Z:发布号,数字越大,功能越完善
  • P:patch号

Linux分区

/boot引导分区目录

该分区(目录)存放系统内核、驱动模块引导程序,需要独立 分区

  • 避免(根)文件系统损坏造成无法启动
  • 避使用lilo引导时1024柱面问题(Grub无此问题)
  • 方便管理多系统引导

/boot修复

进入grub模式后#todo

/swap分区目录

系统物理内存不足时,释放部分空间,其中数据被临时保存在 swap空间中

  • 不是所有物理内存中交换的数据都会被放在交换空间中,有部分 数据直接交换到文件系统

  • 交换空间比内存慢

  • 安装时,系统会尝试将交换分区安装到磁盘外端

  • 有多个磁盘控制器时,在每个磁盘上都建立交换空间

  • 尽量将交换空间安装在访问在频繁的数据区附近

  • 交换空间大小一般设置为内存1-2倍

  • 不推荐为交换空间划分单独分区,可以使用交换文件作为交换 空间,方便、容易扩展
交换文件
1
2
3
4
5
6
7
8
9
10
11
12
13
$ dd if=/dev/zero of=/swapfile bs=1024 count=32000
#
$ fallocate -l 32G /swapfile
# 创建有连续空间的交换文件,大小为1024*32000=32G
$ chmod 600 /swapfile
# 修改交换文件权限
$ mkswap /swapfile
# 设置交换文件

$ /usr/sbin/swapon /swapfile
# 激活上步创建的`/swapfile`交换文件
$ /usr/sbin/swapoff swapfile
# 关闭交换文件
  • 不需要交换文件时可以直接rm删除
  • 可以在fstab文件中添加交换文件,自动挂载,格式参见 config_files

/根分区目录

  • /usr:用户程序
  • /sbin:系统管理员执行程序
  • /bin:基本命令
  • /lib:基本共享库、核心模块
  • /home:用户目录
  • /etc:配置文件目录
  • /opt:附加应用程序包目录
  • /mnt:设备/文件系统挂载目录
  • /dev:设备
  • /tmp:临时文件
  • /var:可变信息区
    • file spool
    • logs
    • requests
    • mail
  • /proc:进程(映射)信息

CentOS7 常用配置

网络配置

编辑/etc/sysconfig/network-scripts/ifcfg-ens33

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
TYPE = Ethernet				# 网卡类型:以太网
PROXY_METHOD=none # 代理方式:无
BROWSER_ONLY=no # 仅浏览器:否
BOOTPROTO=dhcp # 网卡引导协议
DEFROUTE=yes # 默认路由:是
IPV4_FAILURE_FATAL=no # 开启IPV4致命错误检测:否
IPV6INIT=yes # IPV6自动初始化:是
IPV6_AUTOCONF=yes # IPV6自动配置:是
IPV6_DEFROUTE=yes # IPV6是否可为默认路由:是
IPV6_FAILURE_FATAL=no # 开启IPV6致命错误检测:否
IPV6_ADDR_GEN_MODE=stable-privacy
# IPV6地地址生成模型:stable-privacy
NAME=ens33 # 网卡物理设备名称
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# 通用唯一识别码
DEVICE=ens33 # 网卡设备名称
ONBOOT=yes # 开启启动:是
DNS1=xxx.xxx.xxx.xxx # DNS地址
IPADDR=xxx.xxx.xxx.xxx # IP地址
PREFIX=24 # 子网掩码
GATEWAY=xxx.xxx.xxx.xxx # 网关
  • UUID不能相同相同
  • ifcfg-ens33这个文件感觉像是个模板,但是不知道真正应用 配置文件在哪

常用应用源

EPEL

Extra Packages for Enterprise Linux 由Fedora社区创建、维护的RPM仓库,通常不会与官方源发生冲突 或相互替换文件,包括应用有:chromium

直接使用yum安装:$ sudo yum install epel-release

RPMFusion

提供Fedora和RedHat由于开源协议或者是禁止商业用途而无法提供 RPM安装包,包括两个仓库 和NuxDextop源有冲突,如:gstreamer,感觉上比NuxDextop更加权威 包含应用:mplayer、gstreamer-pluginsXXXX、

  • free:开源软件但是由于其他原因无法提供,安装方式 $>sudo yum localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm

  • nonfree:闭源软件,包括不能用于商业用途,安装方式 $>sudo rpm -ivh https://download1.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-7.noarch.rpm

ELRepo

包含和硬件相关的驱动程序,通过以下命令安装

$>rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
$>rpm -Uvh http://www.elrepo.org/elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

NuxDextop

包含与多媒体相关应用的RPM仓库,好像是个人作者维护,有的依赖 可能在EPEL源中,因此可能需要先安装EPEL,可能和其他源 (RPMFusion)有冲突,可以设置默认情况下不启用,即修改 /etc/yum.repos.d/nux.dextop.repo文件,设置enable=0, 开启时手动启用 $>yum --enablerepo=nux-dextop install PACKAGENAME

$>rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm

装机必备

rhytmbox-mp3

centos7的gnome默认安装rhythmbox,但无法解码mp3,需要安装 rpmfusion-free源中的

  • gstreamer-plugins-ugly.x86_64
  • gstreamer1-plugins-ugly.x86_64

chromium

  • 安装EPEL源之后直接安装

  • flash插件

    ppapi好像就是pepperapi的简称,但是两个flash插件不一样, 安装的是pkgs上下载的,fedora社区维护的

  • html5视频播放支持:ffmpeg-libs google准备不再支持h.264格式(绝大部分)的视频,所以装 了这个还需要其他设置,但firefox可播放大部分html5视频

wqy中文字体

yum源里的字体文件都是*.ttc文件,需要*ttf字体文件,有 在线解压网站可以解压

安装包常识

  • app和app-devel/app-dev:后者包括头文件、链接库,在编译 使用了app的源代码才需要

系统配置

文件目录常识

  • /usr/share/applications里*.desktop是“桌面图标”文件, centos会 菜单中的会展示的“应用”就是这些

Linux 安装后常用配置

用户设置

设置 root 密码

  • Linux 安装之初,在设置 root 密码之前无法使用 $ su 切换到 root 用户,需要先设置root用户密码

    1
    $ sudo passwd root

应用设置

Debian

配置文件

  • Debian 源配置文件:/etc/apt/source.list
  • 修改完成后运行 $ sudo apt update 更新索引
  • 163 源:https://mirrors.163.com/.help/debian.html

    1
    2
    3
    4
    5
    6
    7
    8
    deb http://mirrors.163.com/debian/ <VERSION> main non-free contrib
    deb http://mirrors.163.com/debian/ <VERSION>-updates main non-free contrib
    deb http://mirrors.163.com/debian/ <VERSION>-backports main non-free contrib
    deb-src http://mirrors.163.com/debian/ <VERSION> main non-free contrib
    deb-src http://mirrors.163.com/debian/ <VERSION>-updates main non-free contrib
    deb-src http://mirrors.163.com/debian/ <VERSION>-backports main non-free contrib
    deb http://mirrors.163.com/debian-security/ <VERSION>/updates main non-free contrib
    deb-src http://mirrors.163.com/debian-security/ <VERSION>/updates main non-free contrib
  • USTC 源:https://mirrors.ustc.edu.cn/help/debian.html

    1
    2
    3
    4
    5
    6
    7
    8
    deb http://mirrors.ustc.edu.cn/debian/ <VERSION> main contrib non-free
    deb-src http://mirrors.ustc.edu.cn/debian/ <VERSION> main contrib non-free
    deb http://mirrors.ustc.edu.cn/debian/ <VERSION>-updates main contrib non-free
    deb-src http://mirrors.ustc.edu.cn/debian/ <VERSION>-updates main contrib non-free
    deb http://mirrors.ustc.edu.cn/debian/ <VERSION>-backports main contrib non-free
    deb-src http://mirrors.ustc.edu.cn/debian/ <VERSION>-backports main contrib non-free
    deb http://mirrors.ustc.edu.cn/debian-security/ <VERSION>/updates main contrib non-free
    deb-src http://mirrors.ustc.edu.cn/debian-security/ <VERSION>/updates main contrib non-free
  • debian 的版本名,根据版本改变
  • 一般的,直接将默认配置文件中 http://deb.debian.org 修改为相应源地址即可:$ sudo sed -i 's/deb.debian.org/<mirror_addr>/g' /etc/apt/sources.list

openSUSE

  • openSUSE 使用 MirrorBrain 技术,中央服务器会按照 IP 中转下载请求到附近的镜像,所以更改软件源通常只会加快刷新软件元的速度,对下载速度影响不大

命令行

  • USTC 源:https://mirrors.ustc.edu.cn/help/opensuse.html

    1
    2
    3
    4
    5
    6
    7
    8
    # 禁用原有软件源
    $ sudo zypper mr -da
    $ sudo zypper ar -fcg https://mirrors.ustc.edu.cn/opensuse/distribution/leap/\$releasever/repo/oss USTC:OSS
    $ sudo zypper ar -fcg https://mirrors.ustc.edu.cn/opensuse/distribution/leap/\$releasever/repo/non-oss USTC:NON-OSS
    $ sudo zypper ar -fcg https://mirrors.ustc.edu.cn/opensuse/update/leap/\$releasever/oss USTC:UPDATE-OSS
    $ sudo zypper ar -fcg https://mirrors.ustc.edu.cn/opensuse/update/leap/\$releasever/non-oss USTC:UPDATE-NON-OSS
    # 15.3 或更高版本需要
    $ sudo zypper ar -fgc https://mirrors.ustc.edu.cn/opensuse/update/leap/\$releasever/sle USTC:UPDATE-SLE
  • $releaseverOpenSuSe leap 版本,若知晓可以自行替换

配置文件

  • openSUSE 源配置文件夹:/etc/zypp/repo.d
  • 配置文件格式

    1
    2
    3
    4
    5
    [<ALIAS>]			# 源别名
    enabled=1 # 默认是否启用
    autorefresh=0
    baseurl=url # 源地址
    type=rpm-md

CentOS

  • 发行版中 yum 一般自带 fast-mirrors 插件,一般无需更新官方源

三方源配置

  • Extra Packages for Enterprise Linux:由 Fedora 社区创建、维护的 RPM 仓库,通常不会与官方源发生冲突或相互替换文件

    • 安装 EPEL$ sudo yum install epel-release
    • 包括应用有
      • Chromium
  • RPMFusion:提供 FedoraRedHat 由于开源协议或者是禁止商业用途而无法提供 RPM 安装包

    • 包括两个仓库freenofree
      • free:开源软件但是由于其他原因无法提供
      • non-free:闭源软件,包括不能用于商业用途
    • 包含应用有
      • mplayer
      • gstreamer-pluginsXXXX
  • ELRepo:包含和硬件相关的驱动程序

    • 安装
      1
      2
      $ rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
      $ rpm -Uvh http://www.elrepo.org/elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
  • NuxDextop:包含与多媒体相关应用的 RPM 仓库

    • 安装
      1
      $ rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
    • 说明
      • 有的依赖在 EPEL 中,因此可能需要先安装 EPEL
      • 和其他源有(RPMFusion)冲突时
        • 可以设置默认情况下不启用,即修改 /etc/yum.repos.d/nux.dextop.repo 文件,设置 enable=0
        • 需要时手动启用:$ yum --enablerepo=nux-dextop install <PACKAGENAME>

应用安装方式

  • 包管理器

    • 安装应用比较方便
    • 但某些发行版中应用源更新缓慢
  • 自行下载二进制版本安装

    • Linux 大部分应用是 noarch,即与架构无关,无需考虑兼容问题
  • 下载源码编译安装

    • 安装流程
      • 查询文档安装编译依赖
      • ./configure配置编译选择,如:安装路径等
      • make & make install
  • 注意事项

    • 自行安装应用可以若设置安装路径不是推荐路径,记得检查环境变量 XXXX_HOME
    • 应用文件夹通常带有版本号,建议
      • 保留文件夹版本号
      • 另行创建无版本号符号链接指向所需版本文件夹

本地化

字体

  • 终端中字体需要为 monospace
    • 在多语言环境下,非 monospace 字体字符宽度不同,导致字符重叠
    • 字体名称不是字体文件名,其定义在字体文件内部定义
      • 指定未安装字体只能通过文件名
      • 指定已安装字体可直接使用字体名称

Locale

Locale:特定于某个国家、地区的编码设定

  • 代码页
  • 数字、货币、时间与日期格式

Keras 安装配置

Keras配置文件

$HOME/.keras/keras.json

1
2
3
4
5
6
7
8
9
10
{
"image_data_format": "channel_last",
# 指定Keras将要使用数据维度顺序
"epsilon": 1e-07,
# 防止除0错误数字
"flaotx": "float32",
# 浮点数精度
"backend": "tensorflow"
# 指定Keras所使用后端
}

Jupyter 常用基础

配置文件

生成配置文件

1
2
$ jupyter notebook --generate-config
# 生成配置文件,默认为`~/jupyter/jupyter-notebook-config.py`

修改配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
c.NotebookApp.password = u'sha1:xxxxxxxx'
# 配置sha1格式密文,需要自己手动生成
c.NotebookApp.ip = "*"
# 配置运行访问ip地址
c.NotebookApp.open_brower = False
# 默认启动时不开启浏览器
c.NotebookApp.port = 8888
# 监听端口,默认
c.NotebookAPp.notebook_dir = u"/path/to/dir"
# jupyter默认显示羡慕路径
c.NotebookApp.certfile = u"/path/to/ssl_cert_file"
c.NotebookAppp.keyfile = u"/path/to/ssl_keyfile"
# jupyter使用ssl证书文件
# 一般只有使用自己生成证书

生成密文

1
2
3
from notebook.auth import passwd
passwd()
# 输入密码两次,然后就会返回对应密文,写入配置文件

远程访问

jupyter必须使用https登陆、访问

  • 因此服务端必须有ssl证书,

    • 自己生成的证书默认浏览器不认可,浏览器访问会高危, 高级进入即可
      1
      openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout key_name.key -out cert_name.pem
  • 访问时也必须加上https://前缀,一般默认http://前缀 会报服务器无响应(没配置重定向,应该是)

TensorFlow 安装配置

安装

CUDA、CUDNN、CUDAtookit、NVCC

  • CUDA:compute unified device architecture,通用并行计算 平台和编程模型,方便使用GPU进行通用计算
  • cuDNN:深度学习加速库,计算设计的库、中间件
    • C++STL的thrust的实现
    • cublas:GPU版本blas
    • cuSparse:稀疏矩阵运算
    • cuFFT:快速傅里叶变换
    • cuDNN:深度学习网络加速
  • CUDA Toolkit:包括以下组件
    • 编译器nvcc:CUDA-C、CUDA-C++编译器,依赖nvvm 优化器 (nvvm本身依赖llvm编译器)
    • ·debuggersprofiler等工具
    • 科学库、实用程序库
      • cudart
      • cudadevrt
      • cupti
      • nvml
      • nvrtc
      • cublas
      • cublas_device
    • 示例
    • 驱动:

TensorBoard

TensorBoard是包括在TensorFlow中可视化组件

  • 运行启动了TB的TF项目时,操作都会输出为事件日志文件
  • TB能够把这些日志文件以可视化的方式展示出来
    • 模型图
    • 运行时行为、状态
1
$ tensorboard --logdir=/path/to/logdir --port XXXX

问题

指令集

Your CPU supports instructions that this TensorFlow binary was not cmpiled to use: SSE1.4, SSE4.2, AVX AVX2 FMA

  • 没从源代码安装以获取这些指令集的支持
    • 从源代码编译安装
    • 或者设置log级别
      1
      2
      3
      import os
      os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2"
      import tensorflow as tf

Python安装配置

Python

Python3包管理安装

  • CentOS7依赖缺失
    • zlib-devel
    • bzip2-devel
    • readline-devel
    • openssl-devel
    • sqlite(3)-devel
  • 根据包用途、名称可以确认对应的应用,缺少就是相应 -devel(-dev)

Python Implementation

名称中flag体现该发行版中python特性

  • -d:with pydebug

  • -m:with pymalloc

  • -u:with wide unicode

  • pymalloc是specialized object allocator
    • 比系统自带的allocator快,且对python项目典型内存 分配模式有更少的开销
    • 使用c的malloc函数获得更大的内存池
  • 原文:Pymalloc, a specialized object allocator written by Vladimir Marangozov, was a feature added to Python2.1. Pymalloc is intended to be faster than the system malloc() and to have less memory overhead for allocation patterns typical of Python programs. The allocator uses C’s malloc() function to get large pools of memory and then fulfills smaller memory requests from these pools.J

    注意:有时也有可能只是hard link

Python配置

Python相关环境变量

  • PYTHONPATH:python库查找路径
  • PYTHONSTARTUP:python自动执行脚本

自动补全

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import readline
import rlcompleter
# 为自动补全`rlcompleter`不能省略
import atexit
readline.parse_and_bind("tab:complete")
# 绑定`<tab>`为自动补全

try:
readline.read_history("/path/to/python_history")
# 读取上次存储的python历史
except:
pass
atexit.register(
readline.write_history_file,
"/path/to/python_history"
)
# 将函数注册为推出python环境时执行
# 将python历史输入存储在的自定以文件中
# 这部分存储、读取历史其实不必要

del readline, rlcompleter
  • 每次在python解释器中执行生效

  • 保存为文件python_startup.py,将添加到环境变量 PYTHONSTARTUP中,每次开启python自动执行

    1
    2
    3
    # .bashrc
    export PYTHONSTARTUP=pythonstartup.py
    # 这个不能像*PATH一样添加多个文件,只能由一个文件

Pip

python包、依赖管理工具

  • pip包都是源码包

    • 需要在安装时编译,因此可能在安装时因为系统原因出错
    • 现在有了wheels也可以安装二进制包

安装

  • 编译安装python一般包括pipsetuptools
  • 系统自带python无pip时,可用aptyum等工具可以直接安装
  • 虚拟python环境,无般法使用系统包管理工具安装pip,则只能 下载pip包使用setuptools安装

配置

配置文件:~/.config/pip/pip.conf

1
2
3
4
5
[global]
index-url = https:?//pypi.tuna.tsinghua.edu.cn/simple/
# pypi源地址
format = columns
# pip list输出格式(legacy,columns)

依赖管理

pip通过纯文本文件(一般命名为requirements.txt)来记录、 管理python项目依赖

  • $ pip freeze:按照package_name=version的格式输出 已安装包 $ pip install -r:可按照指定文件(默认requirements.txt) 安装依赖

Virtualenv/Venv

虚拟python环境管理器,使用pip直接安装

  • 将多个项目的python依赖隔离开,避免多个项目的包依赖、 python版本冲突
  • 包依赖可以安装在项目处,避免需要全局安装python包的权限 要求、影响

实现原理

$ virtualenv venv-dir复制python至创建虚拟环境的文件夹中, $ source venv-dir/bin/activate即激活虚拟环境,修改系统环境 变量,把python、相关的python包指向当前虚拟环境夹

Virtualenv使用

Pyenv

python版本管理器,包括各种python发行版

安装

不需要事先安装python

  • 从github获取pyenv:git://github.com/yyuu/pyenv.git

  • 将以下配置写入用户配置文件(建议是.bashrc),也可以在 shell里面直接执行以暂时使用

    1
    2
    3
    export PYENV_ROOT="$HOME/pyenv路径"
    export PATH="$PYENV_ROOT/bin:$PATH"
    eval "$(pyenv init -)"

    以上配置可参见home_config/bashrc_addon,以项目详情为准

Pyenv安装Python发行版问题

使用pyenv安装python时一般是从PYTHON_BUILD_MIRROR_URL表示 的地址下载安装文件(或者说整个系统都是从这个地址下载),缺省 是http://pypi.python.org,但国内很慢

#todo
  • 设置这个环境变量为国内的镜像站,如 http://mirrors.sohu.com/python,但这个好像没用
  • 在镜像站点下载安装包,放在pyenv/cache文件夹下(没有就 新建)

pyenv安装python时和使用一般安装应用一样,只是安装prefix不是 /usr/bin/之类的地方,而是pyenv安装目录,因此pyenv编译安装 python也需要先安装依赖

实现原理

修改$PATH环境变量

  • 用户配置文件将PYENV_ROOT/bin放至$PATH首位
  • 初始化pyenv时会将PYENV_ROOT/shims放至$PATH首位

shimsbin放在最前,优先使用pyenv中安装的命令

  • bin中包含的是pyenv自身命令(还有其他可执行文件,但是 无法直接执行?)

  • shims则包含的是所有已经安装python组件

    • 包括python、可以执行python包、无法直接执行的python包

    • 这些组件是内容相同的脚本文件,仅名称是pyenv所有安装 的python包

      • 用于截取python相关的命令
      • 并根据设置python发行版做出相应的反应
      • 因此命令行调用安装过的python包,pyenv会给提示 即使不是安装在当前python环境中

因此一般将命令放在.profile文件中,这样每次登陆都会设置好 pyenv放在.bashrc中会设置两次(没有太大关系)

使用指定Python发行版

  • $ pyenv local py-version指定是在文件夹下生成 .python-version文件,写明python版本

  • 所有的python相关的命令都被shims中的脚本文件截取

pyenv应该是逐层向上查找.python-version文件,查找到文件则 按照相应的python发行版进行执行,否则按global版本

Conda

通用包管理器

  • 管理任何语言、类型的软件

    • conda默认可以从http://repo.continuum.io安装已经 编译好二进制包

    • conda包和pip包只是部分重合,有些已安装conda包 甚至无法被pip侦测到(非python脚本包)

    • python本身也作为conda包被管理

  • 创建、管理虚拟python环境(包括python版本)

安装

  • conda在Miniconda,Anaconda发行版中默认安装

    • Miniconda是只包括conda的发行版,没有Anaconda中默认 包含的包丰富

    • 在其他的发行版中可以直接使用pip安装,但是这样安装的 conda功能不全,可能无法管理包

  • Miniconda、Anaconda安装可以自行设置安装位置,无需介怀

配置

conda配置文件为$HOME/.condarc,其中可以设置包括源在内 配置

1
2
3
4
5
channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
- defaults
show_channel_urls: true

添加国内源

conda源和pypi源不同(以下为清华源配置,当然可以直接修改 配置文件)

1
2
3
$ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
$ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
$ conda config --set show_channel_urls yes
  • conda源不是pypi源,不能混用

Win平台设置

  • 添加菜单项

    1
    2
    3
     # 可用于恢复菜单项
    $ cd /path/to/conda_root
    $ python .\Lib\_nsis.py mkmenus
  • VSCode是通过查找、执行activate.bat激活虚拟环境

    • 所以若虚拟环境中未安装conda(无activate.bat) 则虚拟环境无法自动激活

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ conda create [--clone ori_env] -n env [packages[packages]]
# 创建虚拟环境
# python也是conda包,可指定`python=x.x`
$ conda remove -n env --all
# 删除虚拟环境

$ conda info -e
$ conda env list
# 列出虚拟环境
$ conda info
# 列出conda配置

$ conda activate env
# 激活env环境
$ conda deactivate
# 退出当前环境

$ conda list -n env
# 列出env环境/当前环境安装conda包
$ conda search package
# 搜索包
$ conda install [-n env] packages
# env环境/当前环境安装conda包
$ conda update [-n env] packages
# env环境/当前环境升级conda包
$ conda remove [-n env] packages
# env环境/当前环境移除包
  • 使用conda而不是pip安装包更合适,方便管理
  • 创建新环境时,默认不安装任何包,包括pip,此时切换到 虚拟环境后,pip等命令都是默认环境的命令

Pipenv

pip、virtualenv、Pipfile(版本控制)功能的综合,事实上就 依赖于pip、virtualenv(功能封装)

  • $ pipenv sync/install替代$ pip install
  • $ pipenv shell替代$ activate
  • $ pipenv run甚至可以不用激活虚拟环境运行某些命令
  • Pipfile控制dev、release包管理,Pipfile.lock锁定包依赖

安装

  • 使用pip直接安装
  • 系统安装源里有pipenv,也可以用系统包管理工具安装

实现原理

Python版本

pipenv和virtualenv一样指定python版本也需要已经安装该python 版本

  • $PATH中的路径无法寻找到相应的python版本就需要手动 指定

  • 不是有版本转换,将当前已安装版本通过类似2to3的“中 间层”转换为目标版本

虚拟环境

pipenv会在~/.local/share/virtualenv文件夹下为所有的虚拟 python环境生成文件夹

  • 文件夹名字应该是“虚拟环境文件夹名称-文件夹全路径hash”

  • 包括已安装的python包和python解释器

  • 结构和virtualenv的内容类似,但virtualenv是放在项目目录下

  • $ python shell启动虚拟环境就是以上文件夹路径放在 $PATH最前

依赖管理

pipenv通过Pipfile管理依赖(环境)

  • 默认安装:$ pipenv install pkg

    • 作为默认包依赖安装pkg,并记录于Pipfile文件 [packages]条目下

    • 相应的$ pipenv install则会根据Pipfile文件 [packages]条目安装默认环境包依赖

  • 开发环境安装:$ pipenv install --dev pkg

    • 作为开发环境包依赖安装pkg,并记录于Pipfile 文件[dev-packages]条目下

    • 相应的$ pipenv intall --dev则会根据Pipfile 文件中[dev-packages]安装开发环境包依赖

Pipfile和Pipfile.lock

  • Pipfile中是包依赖可用(install时用户指定)版本
  • Pipfile.lock则是包依赖具体版本
    • 是pipenv安装包依赖时具体安装的版本,由安装时包源的 决定
    • Pipfile.lock中甚至还有存储包的hash值保证版本一致
    • Pipfile是用户要求,Pipfile.lock是实际情况

因此

  • $ pipenv install/sync优先依照Pipfile.lock安装具体 版本包,即使有更新版本的包也满足Pipfile的要求

  • PipfilePipfile.lock是同时更新、内容“相同”, 而不是手动锁定且手动更新Pipfile,再安装包时会默认更新 Pipfile.lock

Pipenv用法

详情https://docs.pipenv.org

创建新环境

具体查看$pipenv --help,只是记住$pipenv --site-packages 表示虚拟环境可以共享系统python包

默认环境和开发环境切换

pipenv没有像git那样的切换功能

  • 默认环境“切换”为dev环境:$ pipenv install --dev
  • dev环境“切换”为默认环境:$ pipenv uninstall --all-dev

同步

$ pipenv sync

官方是说从Pipfile.lock读取包依赖安装,但是手动修改Pipfile$ pipenv sync也会先更新Pipfile.lock,然后安装包依赖, 感觉上和$ pipenv install差不多

Pipenv特性

和Pyenv的配合

pipenv可以找到pyenv已安装的python发行版,且不是通过$PATHshims获得实际路径

  • pipenv能够找到pyenv实际安装python发行版的路径versions, 而不是脚本目录shims

  • pipenv能自行找到pyenv安装的python发行版,即使其当时没有 被设置为local或global

    • pyenv已安装Anaconda3和3.6并指定local为3.6的情况下 $ pipenv --three生成的虚拟python使用Anaconda3

    • 后系统全局安装python34,无local下pipenv --three 仍然是使用Aanconda3

    • 后注释pyenv的初始化命令重新登陆,pipenv --three就 使用python34

目前还是无法确定pipenv如何选择python解释器,但是根据以上测试 和github上的feature介绍可以确定的是和pyenv命令有关

pipenv和pyenv一起使用可以出现一些很蠢的用法,比如:pyenv指定 的local发行版中安装pipenv,然后用这pipenv可以将目录设置为 另外版本虚拟python环境(已经系统安装或者是pyenv安装)

总结

除了以上的包管理、配置工具,系统包管理工具也可以看作是python 的包管理工具

  • 事实上conda就可以看作是pip和系统包管理工具的交集
  • 系统python初始没有pip一般通过系统包管理工具安装

使用场景

优先级:pip > conda > 系统包管理工具

  • 纯python库优先使用pip安装,需要额外编译的库使用conda
  • conda源和系统源都有的二进制包,优先conda,版本比较新

2018/04/06经验

最后最合适的多版本管理是安装pipenv

  • 系统一般自带python2.7,所以用系统包管理工具安装一个 python3

  • 使用新安装的python3安装pipenv,因为系统自带的python2.7 安装的很多包版过低

  • 最后如果对python版本要求非常严格

    • 还可以再使用pyenv安装其他版本
    • 然后仅手动启用pyenv用于指示pipenv使用目标python版本

2019/02/20经验

直接全局(如/opt/miniconda)安装Miniconda也是很好的选择

  • 由conda管理虚拟环境,虚拟环境创建在用户目录下,登陆时 激活