Table of Contents

1 Top Layer

1.1 Install Emacs

1.1.1 Up to date backup

github.com 完备版本的备份需要.emacs.d and .spacemacs同时存在 并且路径如下:

.emacs.d c:/Users/Administrator/AppData/Roaming
.spacemacs c:/Users/Administrator/AppData/Roaming

!注意,git自动上传命令缺少.spacemacs,需要手动上传

1.1.2 win10安装核心解决方案

  1. !!! 需要把官网的dep库也下载下来,放到emacs/bin里面!!!用VPN下载package 这样才能有ssh等linux专用命令,才能在windows环境下连接到库
  2. 核心是init.el文件,.spacemacs需要在2个user-config位置将init.el中要求的库对应添加

1.1.3 安装注意事项:

1. 先复制.emacs.d文件夹 然后启动emacs一次
2. 删除原本的.spacemacs文件
3. 将备份库里面的.spacemacs文件复制到路径中
4. 在init.el中修改emacs版本信息
5. 安装source code pro字体
6. 用cygwin64安装C++支持dll
7. 安装gnutls dll添加ssh等连接远端服务区的命令

1.1.4 错误代码说明

Source Code Pro是一种字体 百度搜索安装即可

1.2 版本控制

1.2.1 创建不受emacs官方git管理的文件夹

  1. 生成private dean layer

    M-x configuration-layer/create-layer命令,然后回答几个问题,创建dean的private layer. dean是layers的name,我用的是yyx 需要编辑~/.spacemacs文件,添加dean layer (line 32 to add yyx layer)

  2. 文件目录

    dean目录会出现在.emacs.d/private/dean, 里面有一个package.el文件

  3. 逻辑
    1. 新建layer
    2. 将创建的layer添加到emacs的载入配置中,即添加到.spacemacs中
    3. 修改package.el进行package管理
  4. el文件提供package的逻辑
    1. 提供可载入的feature

      my-feature.el里面有代码如下

      ;; Your code goes here ...
      (provide 'my-feature)
      

      当配置文件(require 'my-feature)时,自动寻找同名.el .elc文件

    2. 将.el .elc文件所在路径加入环境变量

      (push "some/path" load-path)

    3. 启动emacs的时候的delay

      require是直接load所有package Auto-loading是当且仅当使用该package的时候才load

      (autoload 'some-function "some-file")
      
    4. use-package
      (use-package helm) ; require
      (use-package helm
        :defer t)        ; autoload
      (use-package helm
        :defer t
        :init
        ;; Code to execute before Helm is loaded
        :config
        ;; Code to execute after Helm is loaded
        )                  
      
    5. package.el写法
      <layer>-packages 比如:yyx-packages作为包的名字
      (defconst mylayer-packages
        '(
          ;; Get the package from MELPA, ELPA, etc.
          some-package
          (some-package :location elpa)
      
          ;; A local package
          (some-package :location local)
      
          ;; A package recipe
          (some-package :location (recipe
                                   :fetcher github
                                   :repo "some/repo"))
      
          ;; An excluded package
          (some-package :excluded t)
          ))      
      <layer>/init-<package>  这条语句一定要有,init package
      
    6. layer相关el载入顺序

      packages.el funcs.el config.el keybindings.el If a package is part of the end user's dotspacemacs-additional-packages, it will also be installed. 在layer层

1.3 初始化配置

1.3.1 代码管理

  1. 启动逻辑

    init.el .spacemacs

  2. 注意事项

    启动初始化包在.emacs.d文件夹里面的init.el文件中 之后需要有.spacemacs文件与.emacs.d文件在同一路径下 以github 包含在.emacs.d文件夹内的.spacemacs文件为准 并将其提出来放到文件夹外面 不要用init.el生成的.spacemacs文件作为配置 修改init.el来添加package的时候,需要手动增加.spacemacs中的pack 其位置为:最底部quoto后面

  3. install package最终结果
    1. 在init.el里面require
    2. 在.spacemacs 中layer函数中,additional—package中添加此package的名字

1.3.2 git必备包

  1. 安装git bash

    重要,这是在Windows中提供了一个cmd可用命令

  2. 安装github desktop
  3. 使用方法
    1. 涉及的package: magit/git-auto-commit
    2. magit

      C-x g 打开magit模式,可以用来查看状态

    3. git-auto-commit

      C-x p 保存文件自动commit到远端

    4. 详细流程

      功能自从更新以后不好用 打开git-auto-commit-mode之后用github desktop操作

      1. C-x p
      2. 操作完成后保存文件即可
      

1.4 必备操作集锦

1.4.1 不重启emacs直接生效配置方法

C-x C-e 光标前面的运行一条语句。立即生效。
M-x -region 选择一个 region , 
M-x load-file ~/.emacs
M-x eval-buffer

1.4.2 选中、复制、粘贴、查找

Ctrl+space (从当前光标处开始选中) 注意:需要在日期与键盘中把切换输入法的快捷键解绑
Ctrl+Shift+space (从当前光标处开始选中) 如果上一条命令不可用,临时用这个
Ctrl+w (剪切)
Alt+w (复制) 
Ctrl+y (粘贴) 
C-s 开始正向查找
C-r 开始方向查找
C-g 取消之前的按键(将会成为最常用的按键之一)
C-/ 取消之前的命令

1.4.3 光标操作

M-< 快速跳转到buffer的开头
M-> 快速跳转到buffer的结尾
C-l 把当前光标所在的行移动到屏幕的正中央
C-g g 跳转到第几行
c-x c-s 保存当前文件
c-v 上滚屏
m-v 下滚屏
c-x c-b 列出所有缓冲区/没什么用 直接用打开文件就行了
c-x h 全选
c-space 标记
c-/ 撤销命令
c-x o 切换窗口(窗口排列时切换当前窗口)
M-m TAB一键循环切换buffer
c-e M-b 先切换到行尾 然后按句子单位回退
M-e M-a 换行 到指定位置 最好用的命令 以区块为单位,切换首位
M-; 注释掉当前行
M-m 0-9 提供于windows-numbering包 作用:当有多个buffer同时打开时,一键切换当前选中buffer

1.4.4 命令主菜单

M-m spacemacs buffer管理
M-x helm-command
c-c 当前文档格式 编译菜单
c-x 文档保存 新建等管理
c-h 帮助

1.4.5 帮助主菜单

c-h 主命令
c-h a 查找关键词对应的函数
c-h f 函数
c-h v 变量
c-h k 快捷键    

1.4.6 多buffer管理:

C-x 0 数字0 关闭当前子窗口 !!!!!最好用
C-x b helm-buffer-list更好用一点
C-x C-b buffer-list
C-x o 在窗口之间切换
C-x 0 关闭当前窗口
C-x 1 只显示当前窗口
C-x 2 纵向新建窗口
C-x 3 横向新建窗口
M-m #number 跳转到第几个窗口    

存疑:是否所有mode下都可以用?
恢复上一次的窗口状态
C-c left undo 
C-c right redo

同窗口下多buffer切换(大于两个,否则可以直接M-m Tab)
M-m b 1-9 

1.4.7 根目录Roaming打开方式及三种快速目录切换

在路径中输入

Type ~/ 回车 进入Home路径/即Roaming
Type / 回车 进入盘符根路径,即C:
Type ./ 回车 进入默认路径,即在default-directory中设置的路径
SPC f r 快速打开最近文件目录

1.4.8 设置默认文件夹

;; 设置默认文件夹
(setq default-directory "c:/Users/Administrator/test/emacs")

1.4.9 补全工具选择:

ivy轻巧 极简主义

1.4.10 中文字体支持,数字加字母乱码解决方案

(set-fontset-font "fontset-default" 'gb18030 '("Microsoft YaHei" . "unicode-bmp"))

1.4.11 删除文中多行空白行

M-x flush-lines ^$
Flush lines containing match for regexp:^$    

1.4.12 SPC键位说明:

SPC = M-m    

1.4.13 recentf快速打开最近目录

SPC f r

1.4.14 不重启重载配置的方法,利用SPC=M-m

SPC f e R  只能处理.spacemacs
M-x eval-buffer 同上
M-x load-file init.el 可以重载任何文件

1.4.15 手写configuration文件,对于package installation

  1. 使用帮助菜单,查看变量功能
  2. init.el中手写配置函数

    学习package中.el的写法

    (defcustom org-download-screenshot-method "gnome-screenshot -a -f %s"   "最后一个短语限定该变量的默认值"
      "The tool to capture screenshots."
      :type '(choice
              (const :tag "gnome-screenshot" "gnome-screenshot -a -f %s")   "tag 是标签,紧跟着的是变量的实际取值"
              (const :tag "scrot" "scrot -s %s")
              (const :tag "gm" "gm import %s")
              (const :tag "imagemagick/import" "import %s")
              ;; screenshot method in ms-windows, /capture=4 stands for interactive.
              (const :tag "IrfanView" "i_view64 /capture=4 /convert=\"%s\"")
              ;; screenshot script in osx, -i stands for interactive,
              ;; press space key to toggle between selection and
              ;; window/application mode.
              (const :tag "screencapture" "screencapture -i %s")
              ;; take an image that is already on the clipboard, for Linux
              (const :tag "xclip"
                     "xclip -selection clipboard -t image/png -o > %s")
              ;; take an image that is already on the clipboard, for Windows
              (const :tag "imagemagick/convert" "convert clipboard: %s")
              (function :tag "Custom function")))     
    

1.4.16 图片显示问题 org-mode

安装缺少的.dll文件即可 首先运行C-h v image-library-alist,看看你的版本需要什么文件 在org中显示image C-c C-x C-v org-taggle-inline-images

1.4.17 终极图片处理

  1. 常规解决方案iimage-mode
    file: ./a.png 插入图片的org-mode 代码
    file:images/a.png
    M-x 运行iimage-mode可以在emacs中直接显示/隐藏图片
    #+CAPTION: 电话拨打过快过多   设置图片标题
    #+ATTR_HTML: :width 100%   设置图片尺寸:表示宽度和浏览器页面宽度相同    
    
  2. 更好的解决方案: org-download + imagemagick
    1. 配置方法
      1. 安装

        安装org-download及imagemagick cygwin版本 可以直接安装windows版本 添加环境变量

      2. imagemagick的使用方法及配置

        convert clipboard: d:/test/test.png cmd命令行将剪切板上的图片保存为test.png 需要在导入org-download的时候修改默认的org-download-screenshot配置 在init.el中添加如下语句

        (setq org-download-screenshot-method "convert clipboard: %s")
        

        则设置了org-download-screenshot-method的默认方法为imagemagick中的convert

  3. 使用方法
    M-x org-download-screenshot-methods 一键完成粘贴 剪切板中的图片,不需要保存路径
    C-S-y 绑定按键到该命令即可
    (global-set-key (kbd "C-S-y") 'org-download-screenshot)  -连接表示需要 同时按键
    或者直接将images中的文件拖动到emacs即可,需要org-download包支持    
    C-c C-x C-v 显示所插入的图片 开启org-taggle-inline-image-mode 控制开启和关闭
    
  4. 问题解决

    如果出现无法插入图片的情况,可以尝试先建立文件夹

1.4.18 正则表达式

  1. 测试

    正则表达式测试工具 https://c.runoob.com/front-end/854

    asadfjlsdjflsb sadflkjsdal sadfjl
    c.b
    
    c.d cdd
    abbcdd abb cdd      
    
  2. 使用核心思想

    []表示仅识别出现过的字符 (ab) 将括号中字符作为一个分组 {}表示出现的次数

    \ 表示转义

    m = re.findall('[(](.*?)[)]', img)
    
    '[(](.*?)[)]' 表示()内部的所有元素
    
  3. 最常用的命令集合
    "." 一个匹配除了换行符(newline)之外任何单个字符的特殊字符 a.b   任意字符
    "*" 表示某个前导表达式重复任意次 “fo*”: “f”, “fo”, “foo”     重复字符
    
    + 匹配前导表达式至少一次的出现 “ca+r”匹配串“car”和“caaaar”,不匹配“cr” 至少一次
    ? 匹配前导表达式至多一次的出现 “ca?r”仅仅匹配“car”或“cr”              至多一次
    
    ^ 仅仅匹配在文本中行首的那个空串的特殊字符。就是说,“^foo”匹配在行首的 “foo”  设定查找位置行首
    $ 和“^”相似,但仅匹配行尾的空串。因此“x+$”匹配在行尾的一个或多个“x” 的串     设定查找位置行尾
    
    [0-9]{1,2} 表示个数,数字个数为1-2的字符串
    
    最好得方法:
    精准匹配,用字符串替换的思想
    
    删除保留可选
    前瞻:
    exp1(?=exp2) 查找exp2前面的exp1
    后顾:
    (?<=exp2)exp1 查找exp2后面的exp1
    负前瞻:
    exp1(?!exp2) 查找后面不是exp2的exp1
    负后顾:
    (?<!=exp2)exp1 查找前面不是exp2的exp1
    
  4. 学习链接网站
  5. 常用命令
    Emacs的正则表达式都需要转义
    例如:/(<[/]?/(li/|ul/|div/).*?>/)
    
    C-M-s  isearch-forward-regexp向前正则匹配
    C-M-r  isearch-backward-regexp向后正则匹配
    M-x    query-replace-regexp正则查询替换(对于每一次替换都要确认)
    M-x    replace-regext正则替换(直接替换全部匹配的所有,不需要确认)
    
    M-x re-builer  手动生成正则表达式
    M-x regexp-builder 同上,手动生成正则表达式
    M-x regexp-opt  根据目标内容生成对应的正则表达式
    可以利用emacs的函数exgrep-opt自动生成一个高效的正则匹配表达式:
    
    注:在elisp代码中需要用2个反斜线\\进行转义,而在minibuffer中输入时,只需要1个\进行转义
    在重复进行正则表达式操作时,可以直接用上、下光标按键,查看正则表达式的历史匹配记录
    
  6. 正则表达式应用实例
    [a]正则搜索内容为"空格"或"<TAB>":
    按键:C-M-s: \|<tab>
    按键说明:第1个按键为空格" ",第2个按键为"\|"是或者的意思,第3个按键为<TAB>,显示为"^I"。
    Regexp I-search: \|^I
    
    [b]正则搜索内容为"回车":
    按键:C-M-s:C-q C-j,显示为^J
    Regexp I-search: ^J
    
    [c]正则搜索内容为“Tab制表符“:
    按键:C-M-s:<tab>,显示为^I
    Regexp I-search: ^I
    
    [d]查找IPv4格式的IP地址:
    按键:C-M-s:\\(\[0-9\]\\{1,3\\}\\.\\)\\{3\\}\[0-9\]\\{1,3\\}
    61\.139\.[0-9]\{1,3\}\.[0-9]\{1,3\}
    
    [e]正则替换IP地址:(将所有61.139.*.* 替换为1.2.3.4)
    按键:C-M-%:61\.139\.[0-9]\{1,3\}\.[0-9]\{1,3\}<RET>1.2.3.4
    Query replace regexp (default 61\.139\.[0-9]\{1,3\}\.[0-9]\{1,3\} -> 1.2.3.4:
    
    [f]正则替换:将多个空格或者TAB替换为1个空格
    按键:C-M-%:[ C-q<TAB>]+<RET> <RET>
    Query replacing [ ^I]+ with  : (? for help)
    按键:C-M-%:
    Query replace regexp (default [ ^I]+ ->  ): 
    
    [g]正则替换:将从eshell下执行的命令结果拷贝至记录文件中后,替换掉命令结果中的shell命令提示符( /mnt/sda5d/TDDownload/shell $  替换为 shell# )
    按键:C-M-%:^/.* \$<RET>shell#<RET>
    Query replace regexp (default ^/.* \$ -> shell#): 
    
    [h]正则搜索所有"空格+行尾"(行尾以空格结束,在vim中是/ $):
    按键:C-M-s: +$
    
    [i]正则替换:将多个空行替换为1个空行
    按键:M-x replace-regexp:^C-q C-j $<RET><RET>
    按键说明:^表示以什么开始,C-q C-j联合按键是一个回车,$表示行尾
    Replace regexp (default ^^j$ -> ):
    
    [j]正则替换:使用()()进行分组交换(将单词与冒号的组合abc:进行交换: abc)
    按键:M-x replace-regexp:\([a-z]\{1,999\}\)\(\:\)<RET>\2 \1<RET>
    按键说明:\(.....\)表示第1个分组,后面可以跟多个分组\(....\)\(.....\)在替换时分别以\1\2\3来表示之前定义的各个分组。
    
    [k]正则替换:将css文件中abc{中间加个空格abc {
    按键:M-x replace-regexp:\([a-z]+\)\({\)<RET>\1 \2<RET>
    按键说明:在\(.....\)编组之间的字符直接用字符即可,不用加上\转义
    
    [l]正则替换:将所有单词的首写字母替换为首写字母大写
    按键:M-x replace-regexp:\(\w+\)<RET>\,(capitalize \1)<RET>
    按键说明:在替换部分\,表示后面跟的不是要用来替换的东西,而是一段lisp程序
    
    [m]正则替换:将所有匹配的文字后面加上一个回车
    按键:M-x replace-regexp:\([a-z]+\)\({\)<RET>\&C-qC-j<RET>
    按键说明:在替换部分用\&表示前面匹配的所有文字
    
    [n]正则替换:将所有匹配的1 1-1 1-1-1替换为#1 #1-1 #1-1-1
    按键:M-x replace-regexp:\(\([0-9]+\-\)*[0-9]+\)<RET>#\1
    原文为:
    1
    1-1
    1-1-1
    asfa saf  232-33, 11-22-33-44
    smesf ijds  101-22-33-23
    替换后:
    #1
    #1-1
    #1-1-1
    asfa saf  #232-33, #11-22-33-44
    smesf ijds  #101-22-33-23    
    
  7. 用法总结
    "." 一个匹配除了换行符(newline)之外任何单个字符的特殊字符 a.b
    "*" 表示某个前导表达式重复任意次 “fo*”: “f”, “fo”, “foo”
    + 匹配前导表达式至少一次的出现 “ca+r”匹配串“car”和“caaaar”,不匹配“cr”
    ? 匹配前导表达式至多一次的出现 “ca?r”仅仅匹配“car”或“cr”
    “*?, +?, ??” 当有一个紧跟着的“?”,就是是非贪心的了:将尽可能少的匹配。 匹配 “abbb”时,“ab*”将匹配全部(最长有效匹配),而“ab*?”将仅仅匹配“a” (最短有效匹配)。
    /{N/} 恰好匹配了 N 次 “x/{4/}”仅仅匹配串“xxxx”
    /{N,M/} 指定重复次数在N和M之间的后缀操作符
    [ ... ] 字符集 “[]a]” 匹配“]”或“a”  想包括“-”,它要是字符集中的第一个或最后一个字符。 或者放在一个范围的后面。如“[]-]”匹配“]”和“-” 包括字符“^”,它可以在除第一个位置以外的任何地方
    [^ ... ] 补集合 一个补集合可以匹配换行符,除非换行符被指定为补集合中的一个字符
    ^ 仅仅匹配在文本中行首的那个空串的特殊字符。就是说,“^foo”匹配在行首的 “foo”
    $ 和“^”相似,但仅匹配行尾的空串。因此“x+$”匹配在行尾的一个或多个“x” 的串      
    /| 或逻辑 A/|B A 或 B
    /( ... /) 分组结构,围住“/|”的选择项,以实现别的操作
    \d [0-9]
    /D “/(.*/)/1”匹配任何有完全相同的两部分而无换行符的串 “/(.*/)” 匹配前一半,可以是任意的串,“/1”匹配后面的,但必须和前面的完全相同
    /` /' /= 匹配空串,分别对应 缓冲区开头 结尾 点(point)处
    /b 匹配空串,但仅在一个词的开始或者结尾的 例如,“/bfoo/b”匹配任何作为单 独的词出现的“foo”。“/bballs?/b”匹配作为单独的词出现的“ball”或 “balls”。
    /B 匹配空串,但不在词的开始或结尾处
    /< 匹配空串,但仅在词的开始处。仅当一个构成词的字符在缓冲区开始处时“/<” 匹配缓冲区开始处的空串。
    /> 匹配空串,但仅在词的结尾处。仅当缓冲区尾部有构成词的字符时“/>”匹配缓 冲区尾部的空串。
    /w 匹配任何构成词的字符。由语法表决定这些字符是什么。等效于[a-zA-Z0-9_-]
    /W 匹配任何非构成词的字符。
    /s 匹配空白字符,包括制表符、换行符、回车符和空格符
    \S 匹配非空白字符
    /sC 匹配任何语法是 C 的字符。这里 C 是一个指定特定语法类的字符:如“w”为词 的构成字符,“-”或“ ”为空白,“.”为普通标点符号,等等。
    /SC 匹配任何字符不属于语法 C。
    /cC 匹配任何属于种类 C 的字符。例如,/cc匹配汉字,/cg匹配希腊字符等。 如果想了解已知种类,用M-x describe-categories 。
    /CC 匹配所有不属于种类C的字符。
    在正则表达式中有3种类型的括号:方括号 [和花括号{ 。方括号"["内是需要匹配的字符,花括号"{"内是指定匹配字符的数量。圆括号( 则是用来分组的。
    注意:[0-9]{8} 与 ^[0-9]{8}$的用法,后者可以限定了子串匹配只包含0-9
    注意:可以用单个字符来精准匹配, 但是如果有多个字符需要同时匹配,则需要加上[]括号集 正则表达式一定要用[]来定义字符取值集合
    注意:只有搜索语句可以用正则表达式,替换语句必须精准
    此外:slips语言中需要加上/来转义,但是minibar中的正则替换命令不需要转义
    前瞻:
    exp1(?=exp2) 查找exp2前面的exp1
    后顾:
    (?<=exp2)exp1 查找exp2后面的exp1
    负前瞻:
    exp1(?!exp2) 查找后面不是exp2的exp1
    负后顾:
    (?<!=exp2)exp1 查找前面不是exp2的exp1
    这四个概念用来处理删除操作比较合适,即保留某个exp表达式,括号内为需要保留的内容
    
    贪婪与非贪婪模式
    .* 贪婪模式 尽可能多的匹配
    .*? 非贪婪模式,第一次匹配到就结束匹配
    

1.4.19 undo-redo undo-tree

C-x u 进入 undo-tree-visualizer-mode ,
p n   上下移动,
b f    在分支左右切换,
t 显示时间戳,选定需要的状态后,
q 退出。    

1.4.20 大小写转换

  1. 改变选定区域的大小写
    C-x C-l (downcase-region)	选定区域全部改为小写
    C-x C-u (upcase-region)	选定区域全部改为大写    
    
  2. 从光标开始,处理单词后半部分
    M-c (capitalize-word)	首字母改为大写
    M-u (upcase-word)	全部改为大写
    M-l (downcase-word)	全部改为小写
    
  3. 从光标位置开始,处理单词前半部分
    M– M-c	negtive-argument; capitalize-word
    M– M-u	negtive-argument; upcase-word
    M– M-l	negtive-argument; downcase-word
    

1.4.21 快速打开init.el文件的方法

可以再init.el中简单的配置命令,然后按F2就可以了

;; 快速打开配置文件
(defun open-init-file()
  (interactive)
  (find-file "~/.emacs.d/init.el"))
;; 这一行代码,将函数 open-init-file 绑定到 <f2> 键上
(global-set-key (kbd "<f2>") 'open-init-file)

1.4.22 设置emacs为默认全屏打开

代码

(setq initial-frame-alist (quote ((fullscreen . maximized))))

1.4.23 取消每次打开.py文件都要询问一次是否载入python layer

(add-to-list 'auto-mode-alist '("\\.py?\\'" . python-mode)) 此外,如果.py文件的开头有类似于#usr/bin/python3等代码,会设置python的默认版本,也会引发询问python layer的过程。

1.4.24 设置emacs默认的python版本,cmd输入python打开的版本

  1. emacs eshell默认python

    (setq python-python-command "d:/anaconda/python.exe")

  2. cmd默认python
    1. 如果缺少dll包

      只需要安装官网版本的python3.7即可,不用添加环境变量,用anaconda中的python.exe+官网Python的dll即可

    2. 识别python命令及设置默认python
      which python 可以查看当前python的路径和版本
      将"d:/anaconda"中的python添加到系统变量并且放到emacs/bin/python.exe的前面即可
      先后顺序决定了优先使用哪个python.exe    
      

1.4.25 设置jupyter notebook的默认启动路径

  1. 该设置完成之后只对从anaconda prompt中键入Jupyter notebook方式打开有效,windows cmd中也支持
    1. 打开cmd,首先进入到Jupyter的安装目录,我的是在D:\Python\Anaconda\Scrips中。然后,输入命令“jupyter notebook –generate-config”
    2. 找到#c.NotebookApp.notebookdir =' ',删掉开头的“#”,在‘ ’中输入你要启动的目录路径
    3. c.NotebookApp.notebookdir = 'd:/github/codetest/python'
  2. windows解决方案 直接修改快捷方式中的目标

    这是快捷方式中的原始路径 目标

    D:\anaconda\python.exe D:\anaconda\cwp.py D:\anaconda D:\anaconda\python.exe D:\anaconda\Scripts\jupyter-notebook-script.py "%USERPROFILE%/"
    把"%USERPROFILE%/"都删除即可,之后就可以用快捷方式直接打开了
    

1.4.26 reload buffer

重载当前文件,不用关闭然后在重新打开emacs

M-x revert-buffer

1.4.27 文件管理:快速打开新文件及新窗口的方法以及最近文件的方法

M-m f 文件管理最好用的profix命令
M-m f r 打开最近文件目录
M-m f o 将当前文件或路径在另外的窗口中打开
M-m f h/l 打开当前文件所在的路径以便于打开路径中的其他文件
C-x C-f 新建文件/打开同路径下的某个文件   主要用于没有打开过的本路径下的文件
C-x b 打开buffer 管理器  将scratch脚本保存成带后缀的格式即可创建新文件了  不好用
C-x 0 数字0 关闭当前子窗口

1.4.28 重命名buffer

M-x rename-buffer 重命名当前buffer    
M-x rename-file 重命名当前文件

1.4.29 Ctrl+space被搜狗输入法占用

  1. 终极解决方案(autohotkey修改第二级别mark set)
    1. 安装autohotkey
    2. 使用

      https://blog.csdn.net/ChinarCSDN/article/details/82914429

      1. 新建autohotkey.script
      2. 写入命令
      3. 将写好的脚本放入开始菜单启动路径C:\Users\17186\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
    3. 语法规范
      1. 基本按键表述
        ^ = ctrl 
        + = shift
        # = windows 
        ! = alt 
        & 组合两个按键
        < 成对的按键中左边       
        > 成对的按键中右边       
        
      2. 替换热键

        !!!左边的按键 实现 右边按键的功能

        ^space::^+2
        return       
        
      3. 删除热键
        ^space::return       
        
    4. 禁用特定窗口的热键
    5. 组合键的使用
      组合键
      
      PgDn::
      {
      send ^bn
      return
      }
      
      含义:
      按下 PgDn 实现了右边的 ^bn 的功能
      ^bn为ctrl + b + n      
      
  2. 修改注册表 已被证实无效
    1. 说明
      1. 修改注册表,因为默认的注册表键值为Ctrl+space
      2. 修改语言栏设置
    2. 注册表修改方法

      https://stackoverflow.com/questions/179119/how-to-prevent-windows-xp-from-stealing-my-input-ctrl-space-which-is-meant-for-e

      Procedure
      Go to Start > Type in regedit and start it
      Navigate to HKEY_CURRENT_USER/Control Panel/Input Method/Hot Keys
      Select the key named:
      00000070 for the Chinese (Traditional) IME - Ime/NonIme Toggle hotkey
      00000010 for the Chinese (Simplified) IME - Ime/NonIme Toggle hotkey
      In the right sub-window, there are three subkeys.
      Key Modifiers designate Alt/Ctrl/Shift/etc and is set to Ctrl (02c00000).
      Virtual Key designates the finishing key and is set to Space (20000000).
      Change the first byte in Key Modifiers from 02 to 00
      Change the first byte in Virtual Key from 20 to FF
      Log off and log back on. I don't think it's necessary to restart.
      Do not change the Hot keys for input languages in Control Panel, unless you want to do this all over again.     
      

1.4.30 鼠标指针消失

对文本进行编辑,之后移动鼠标即可重现

1.4.31 emacs中python-mode出现flycheck多种位置错误

原因:anaconda的python版本不兼容flycheck

解决方案:将python.exe在环境变量中设置为python3.8即可,将python3.8的路径上移即可

2 Emaces Usful Command

2.1 Command

2.1.1 常用命令

cmd --insecure 模式打开emacs才能有网络连接
cmd --insecure 用Texlive GUI command-line打开emacs之后默认用texlive编译.tex
c-x c-s 保存当前文件
m-x list-package 列出所有package
c-x o 切换窗口
m-> 文档底部
m-< 文档开头
c-v 上滚屏
m-v 下滚屏
c-x c-b 列出所有缓冲区/没什么用 直接用打开文件就行了
c-x h 全选
c-space 标记
c-@     标记
c-/ 撤销命令
c-_ 撤销命令
M-m 打开spacemacs主菜单
M-m TAB一键循环切换buffer
c-e M-b 先切换到行尾 然后按句子单位回退
M-e M-a 换行 到指定位置 最好用的命令
M-; 注释掉当前行
M-m 0-9 提供于windows-numbering包 作用:当有多个buffer同时打开时,一键切换当前选中buffer
M-x eshell 打开命令行工具

2.1.2 命令主菜单

M-m spacemacs buffer管理
M-x helm-command
c-c 当前文档格式 编译菜单
c-x 文档保存 新建等管理
c-h 帮助

2.1.3 帮助

c-h 主命令
c-h a 查找关键词对应的函数
c-h f 函数
c-h v 变量
c-h k 快捷键

2.2 一些解决方案

2.2.1 多buffer管理:

先分屏 后打开buffer

C-x 0 关闭当前窗口
C-x 1 只显示当前窗口
C-x 2 纵向新建窗口
C-x 3 横向新建窗口
M-m #number 跳转到第几个窗口

以上几个快捷键就够用了

2.2.2 任意文件同一个窗口打开

C-x C-f 打开文件的命令,
type ~/然后回车 直接打开根目录

2.2.3 快捷跳转行数

M-g g 跳转到第几行  需要设置显示行数功能

2.2.4 设置在左侧显示行数功能

  1. 绑定按键及配置文件
    spacemacs build in function
    C-x t 绑定按键到M-x linum-mode
    

    绑定按键的配置文件 修改init.el文件

    ;; global-set-key
    ;;
    ;; set linum-mode
    (global-set-key (kbd "C-x t") 'linum-mode)
    
  2. 特别注意需要linum-relative package的支持

    在.spaces中初始化才能startup载入

  3. 可以直接搜索变量 C-h v 然后配置变量

    好处是,可以通过UI界面来配置初始化变量

2.2.5 复制粘贴及矩形区域选择解决方案

  1. 利用expand region的快捷键
    M-m v 标记并可以调整区域
    
  2. 利用C-x C-x 瞬间交换光标的位置与开头或者结尾

    完美!解决!

2.2.6 笔记,保存及预览设置

  1. 目前最优方案

    导出为html文件

    在github上面用readme预览

  2. 注意事项

    需要刷新

2.2.7 在org mode里面插入图片,并且可以选择直接在本文文档中查看图片

首先,把图片文件放入当前路径中
接着用file:decom.png 格式在org中插入图片
#+CAPTION: 电话拨打过快过多 设置图片格式
#+ATTR_HTML: :width 100%  设置图片宽带,为当前浏览器的100% 此例中
最后可以用M-x iimage-mode 选择打开minor mode 来查看所插入的图片

2.3 Spacemacs

2.3.1 Spacemacs 配置文件 添加package cuda-mode

添加该段代码到.spacemacs.el文件中的合适位置

;; add packages 
;;
(defun dotspacemacs/layers ()
  "Configuration Layers declaration."
  (setq-default
   ;; ...
   ;; List of additional packages that will be installed wihout being
   ;; wrapped in a layer. If you need some configuration for these
   ;; packages then consider to create a layer, you can also put the
   ;; configuration in `dotspacemacs/config'.
   ;; add packages
   dotspacemacs-additional-packages '(
                                      cuda-mode
                                      company
                                      )
   ;; ...
   ))

(defun dotspacemacs/config ()
  "Configuration function.
This function is called at the very end of Spacemacs initialization after
layers configuration."
  ;; add packages
  dotspacemacs-additional-packages '(
                                     cuda-mode
                                     company
                                     )
  ;; 
  )

2.3.2 Spacemacs 配置文件 初始化init.el文件 使所有buffer默认打开company模式

;; Enable global company mode
(require 'company)
(add-hook 'after-init-hook 'global-company-mode)
(setq company-idle-delay 0.1)
(setq company-minimum-prefix-length 1)
(setq company-backends '((company-capf company-files company-elisp company-inf-ruby company-anaconda company-go company-irony company-clang company-cmake company-css company-yasnippet) (company-dabbrev company-dabbrev-code)))

2.4 Company 自动补全包 命令集

M-n M-p select
Enter: to complete 
C-s, C-r and C-o: Search through the completions with 
M-(digit) to quickly complete with one of the first 10 candidates.

2.5 Expand-region 快捷键文本选中 package

M-m v 选中当前光标所在的单词,继续按v则扩大选区 V则缩小选区 具体命令见下方说明

2.6 Magit package自动上传本地文档到github

C-x g 已通过global-set-key自定义绑定 键位 到命令magit-status

在新打开的magit窗口中(通过magit-status命令)

s 小写s表示git add命令
c 表示commit命令
但以上两个步骤已经通过git-auto-commit自动commit过了
P u 大写P表示push命令

2.7 Git-auto-commit 每次保存文件自动commit到github 需要在.spaces中初始化才能startup载入

2.7.1 配置步骤

需要两步:

  1. unsigned 需要在.spaces中初始化才能startup载入 add package
  2. gac-automatically-push-p 当变量不为0时,还可以自动push!!!! 在package里面customize这个变量即可
  3. 绑定按键 C-x p 自动commit+push
  4. 下载下来package之后, 需要运行 M-m ! 打开shell窗口配置github
  5. 显示信息: minor mode窗口会有gac标志
git config --global user.email yyang181@github.com

2.7.2 使用方法

当且仅当 处理单个文件的编译时,想要多次一键测试结果 可以开启 gac-mode,也即git-auto-commit-mode

快捷键

C-x p 打开gac模式,使得保存文件之后自动commit push

2.7.3 按键配置代码 init.el文件

;; global-set-key
(global-set-key (kbd "C-x p") 'git-auto-commit-mode)

2.8 Evil-nerd-commenter Package

2.8.1 配置步骤

unsigned 需要在.spaces中初始化才能startup载入

需要在init.el中配置默认按键

;; set up default hotkeys for evilnc
;;
;; evil-nerd-commenter
(evilnc-default-hotkeys)

设置按键

(evilnc-default-hotkeys) 使用默认按键

2.8.2 使用方法

C-u number M-; 注释从当前行开始的 number 行

2.9 Flycheck

2.9.1 配置方法

package unsigned 需要在.spacemacs中配置

To enable Flycheck add the following to your init file:

(add-hook 'after-init-hook #'global-flycheck-mode)

需要设置变量的值来激活

C-h v type flycheck-check-syntax-automatically
把这个变量的值修改即可

2.10 Git 综述

结合两个package完美一键push到github

  • git-auto-commit: 保存当前文件时自动commit
  • magit: s打开magit status界面
  • magit: P u 一键push到github
  • 前提条件是配置了git config –global
  • 大量文件跟更改可以直接用git desktop
  • 单文件修改调试可以用此文中的快捷键方法

2.11 神器:global-set-key自定义绑定 键位 到命令

2.11.1 方法一 修改init.el文件

;; global-set-key
(global-set-key (kbd "C-x g") 'magit-status)

2.11.2 方法二 可能会出现单次设置单次使用

M-x global-set-key 
type 需要绑定的键位 并按enter确认
type 需要绑定的命令 并按enter确认

2.12 重要:配置private layer:yyang181

2.12.1 优先使用.spacemacs文件,如果没有,使用init.el文件生成.spacemacs

2.12.2 只修改两个文件init.el 和.spacemacs

2.12.3 设置users layer .spacemacs

(setq-default dotspacemacs-configuration-layers
  '(
    ;; other layers
    ;; rms layer added at the end of the list
    yyang181
  ))

2.12.4 .spacemacs文件

  1. 设置users layer .spacemacs
    (setq-default dotspacemacs-configuration-layers
      '(
        ;; other layers
        ;; rms layer added at the end of the list
        yyang181
      ))
    
  2. 配置layers variables
    1. 方法一

      例子

      (defun dotspacemacs/layers ()
        ;; List of configuration layers to load.
        (setq-default dotspacemacs-configuration-layers
          '(auto-completion
            (git :variables
                 git-magit-status-fullscreen t
                 git-variable-example nil)
            smex)))
      

      代码解释

      auto-completion 是layer名称
      git 是package名称
      :variables 表示配置variables
      git-magit-status-fullscreen 等是变量名 及变量value
      
    2. 方法二
      dotspacemacs/user-init 在这个函数中配置variables
      
  3. 禁止package在其他layer的使用
    1. 代码
      (defun dotspacemacs/layers ()
        ;; List of configuration layers to load.
        (setq-default dotspacemacs-configuration-layers
          '(org git
            (auto-completion :disabled-for org git))))
      
    2. 解释

      只用看最后一行

      '(org git
            (auto-completion :disabled-for org git)))) 表示在org和git这两个layer中禁用了auto-complete
      
  4. 允许package在其他layer的使用
    1. :enabled-for 其他同上
  5. 允许或者禁用layer的package
    (defun dotspacemacs/layers ()
      ;; List of configuration layers to load.
      (setq-default dotspacemacs-configuration-layers
        '(auto-completion
          (spacemacs-ui-visual :packages (not neotree fancy-battery))))
    
    (defun dotspacemacs/layers ()
      ;; List of configuration layers to load.
      (setq-default dotspacemacs-configuration-layers
        '(auto-completion
          (spacemacs-ui-visual :packages (not neotree fancy-battery))))
    
  6. Global line numbers
    (setq-default dotspacemacs-line-numbers t)
    

2.13 Configuration Layers

2.13.1 可以检查其他人的layer里面的文件来学习使用方法

2.13.2 结构

[layer_name]
  |__ [local]
  | |__ [package 1]
  | |     ...
  | |__ [package n]
  |-- layers.el
  |__ packages.el
  |__ funcs.el
  |__ config.el
  |__ keybindings.el

[] = directory

2.13.3 layer中各种文件的作用

layers.el
The place to declare additional layers
packages.el
The list of packages and their configuration functions (init, post-init, etc…)
funcs.el
All functions defined in the layer (used in package configuration for instance)
config.el
Layer configuration (defines the layer variables default values and setup some config variables)
keybindings.el
General key bindings no tied to a specific package configuration
Packages can be:
ELPA packages installed from an ELPA compliant repository
local packages in a layer’s local folder
installed from an online source using quelpa.

2.13.4 配置packages

  1. 声明packages
    1. 官方文件的方法
      (setq <layer>-packages '(package1 package2 ...)
      
    2. 本地packages文件的方法
      (defconst yyang181-packages
        '()
        "The list of Lisp packages required by the yyang181 layer.
      
  2. 初始化packages
    1. 官方说明
      (defun <layer>/init-xxx () ...body )
      
    2. 配置例子
      (use-package color-moccur
        :commands (isearch-moccur isearch-all)
        :bind (("M-s O" . moccur)
               :map isearch-mode-map
               ("M-o" . isearch-moccur)
               ("M-O" . isearch-moccur-all))
        :init
        (setq isearch-lazy-highlight t)
        :config
        (use-package moccur-edit))
      
        :init
        (add-hook 'prog-mode-hook #'ace-jump-mode)
        (add-hook 'text-mode-hook #'ace-jump-mode))
      
        :custom
        (comint-buffer-maximum-size 20000 "Increase comint buffer size.")
        (comint-prompt-read-only t "Make the prompt read only."))
      
    3. 尽可能放到:config里面 不要放到:init里面,为了加快启动速度
    4. 自动安装到系统
      :ensure t
      
    5. 自动删除旧版更新命令
      :config
      (setq auto-package-update-delete-old-versions t)
      (setq auto-package-update-hide-results t)
      (auto-package-update-maybe)
      

2.14 终极解决方案

2.14.1 优先在init.el文件中处理包

2.14.2 步骤:在init.el文件中导入package 并且配置即可

2.14.3 例子

  1. elpy package
    1. 网址链接
    2. init.el文件中添加的源代码
      (require 'elpy)
      (setq python-shell-interpreter "jupyter"
            python-shell-interpreter-args "console --simple-prompt"
            python-shell-prompt-detect-failure-warning nil)
      (add-to-list 'python-shell-completion-native-disabled-interpreters
                   "jupyter")
      

2.15 web浏览器 w3m

2.15.1 配置

https://github.com/venmos/w3m-layer/blob/master/READMECN.org 下载cygwin 用类Unix工具将w3m安装包转为win api文件 安装w3m 配置emacs并使用

2.15.2 effective operation

按照linux安装w3m的步骤,在cygwin中操作实现 两个package需要安装,w3m和emacs-w3m

2.15.3 一定要配置w3m emacs-w3m两个package在cygwin中

cygwin中安装完成之后,windows系统中自动包含了所需的package

2.15.4 需要配合cygwin一起使用!

2.15.5 快捷键

SPC a w o	打开链接
SPC a w f	打开文件
SPC a w s	使用 Google 搜索
SPC a w b	用 helm 打开书签    

2.15.6 键位绑定

o	Ace-link
w p	使用 MPV 播放 Youtube 与 Blibli
w y	拷贝光标处链接
w f	打开文件
w o	打开链接
w O	在新标签中打开链接
w t	打开光标处链接到新标签
w T	打开新的空白标签
w s	使用 Google 搜索
w S	在新标签中搜索
w l	下一个标签页
w h	上一个标签页
w d	保存页面为文本文件
w D	保存页面为 HTML
w x	关闭标签
w a	添加到收藏夹
w b	用 helm 打开收藏夹
w B	用 w3m 收藏夹
w e	编辑收藏夹
w m	使用外部游览器打开链接
q	挂起 W3M
Q	退出 W3M
B	返回
N	前进
H	打开默认主页
R	刷新
C-f	向下移动一页
C-b	向上移动一页    

2.15.7 可用的快捷键-一定要注意大小写

C-x-k : 关闭当前标签页
U : 打开URL
V : 打开文件
G :在标签页打开一个网址
S : 用google进行搜索
B : 后退
N: 前进
H : 主页
RET : 打开连接
页面操作
  C-n   向下一行
  C-p   向上一行
  C-b   向后
  C-f   向前
  C-v   向下滚屏
  M-v   向上滚屏
  >       向右滚
  <       向左滚
  ,      向左滚一格
  .        向右滚一格
书签
  a: 添加到当前页到书签
  M-a : 添加该url到书签
  v: 显示书签
  E : 编辑书签
  C-k : 删除书签
  C-_: 撤销书签
使用百度,google搜索
  这个就是到搜索框,会提示TEXT,敲完之后,enter进行搜索
其他重要操作
  M : 用外部默认浏览器打开当前页
  ESC M : 用外部浏览器打开链接
   C-c C-c: 搜索框输入text之后 转到
  C-c C-k :停止载入

2.15.8 github上面的推荐配置:

(defun dotspacemacs/user-config ()
  (setq w3m-home-page "https://www.google.com")
  ;; W3M Home Page
  (setq w3m-default-display-inline-images t)
  (setq w3m-default-toggle-inline-images t)
  ;; W3M default display images
  (setq w3m-command-arguments '("-cookie" "-F"))
  (setq w3m-use-cookies t)
  ;; W3M use cookies
  (setq browse-url-browser-function 'w3m-browse-url)
  ;; Browse url function use w3m
  (setq w3m-view-this-url-new-session-in-background t)
  ;; W3M view url new session in background
)    

2.15.9 自用配置 有错误 备用

;;set location                            
(add-to-list 'exec-path "D:/w3m")
;; web浏览器w3m
(require 'w3m)
(require 'mime-w3m) 
;; 设置主页 
(setq w3m-home-page "http://www.baidu.com") 
;; 设置显示图片
(setq w3m-default-display-inline-images t)
(setq w3m-default-toggle-inline-images t)
;; 显示图标  
(setq w3m-show-graphic-icons-in-header-line t) 
(setq w3m-show-graphic-icons-in-mode-line t)
;; 启用cookie  
(setq w3m-use-cookies t)
;; 设定w3m运行的参数,分别为使用cookie和使用框架 
(setq w3m-command-arguments '("-cookie" "-F"))
;; Browse url function use w3m
(setq browse-url-browser-function 'w3m-browse-url)
;; W3M view url new session in background
(setq w3m-view-this-url-new-session-in-background t)

2.16 web浏览器eww Windows可用

2.16.1 配置

emacs中自带有eww库,可以用M-x eww测试 但是需要下载libxml2支持 xmlsoft官网下载win32版本的库即可 共需四个Dll 放到emacs/bin目录即可 libxml2-2.dll libiconv-2.dll liblzma-5.dl zlib1.dll 将下载下来的整个文件夹添加到环境变量中即可

2.16.2 快捷键

q	eww-quit	退出eww
g	eww-reload	重载该页面
w	eww-copy-page-url	拷贝当前URL到kill ring
d	eww-download	下载光标所在的URL,下载的目录存在变量`eww-download-directory`中,默认为~/Downloads
l	eww-back-url	回退上一个URL
r	eww-forward-url	前进到下一个URL
H	eww-list-histories	显示浏览历史
b	eww-add-bookmark	加书签
B	eww-list-bookmarks	显示书签列表
&	eww-browse-with-external-browser	使用外部浏览器打开当前浏览的URL,外部浏览器由变量`shr-external-browser`决定
v	eww-view-source	查看页面源代码
C	eww-cookie-list	列示Cookie    

原地址:https://blog.csdn.net/MathaDora/article/details/79468528

2.17 cygwin linux系统模拟

2.17.1 cygwin是什么

提供从unix到windows的应用软件移植 unix与linux的区别 gbd makefile

2.17.2 安装

需要把c:/cygwin/bin添加到环境变量

2.17.3 基本操作

DF 直接查看下本地驱动器
cd /cygdriver/d 打开D盘     
cd D: 打开D盘

2.17.4 技巧

确认这几个包是否有,对于w3m库 cvs autoconf libgc-dev libncurses5-dev

2.17.5 package installation methods

  1. 利用cygwin的setup安装包可以补充安装package

    alias cyg-get="/cygdrive/d/path/to/cygwin/setup-x8664.exe -q -P" alias cyg-get="/cygdrive/c/Users/Administrator/downloads/programs/setup-x8664"

  2. 之后可以用cyg-get + package 直接安装想要的package了

    例如 cyt-get w3m

2.17.6 package installation methods New version

  1. 更换镜像路径为:
  2. 按照教程操作
  3. 安装apt-cyg包的方法(用来安装库)
    wget https://raw.githubusercontent.com/transcode-open/apt-cyg/master/apt-cyg
    mv apt-cyg /bin/apt-cyg   then place it in a /bin folder on your path:
    chmod +x /bin/apt-cyg  and make it executable:
    
    Example use of apt-cyg:
    apt-cyg install nano
    

2.17.7 安装w3m emacs-w3m的技术细节

  1. 详尽说明网址
  2. 解决autoconf 报错: autom4te版本匹配即可

    autoconf-2.69 替换掉autoconf命令

  3. 解决make: cask: command not find问题

    安装cask包在cygwin中

    curl -fsSL https://raw.githubusercontent.com/cask/cask/master/go | python     
    
  4. ./configure -with-xwidget

    该命令是在emacs-w3m文件夹中执行的 该文件夹中有configure文件

2.18 Smex 让输入命令变得飞快

2.18.1 配置:

  1. To auto-start Smex every time you open Emacs add these lines to your .emacs file:
    (require 'smex) ; Not needed if you use package.el
    (smex-initialize) ; Can be omitted. This might cause a (minimal) delay
    ; when Smex is auto-initialized on its first run.    
    
  2. Bind some keys:
    (global-set-key (kbd "M-x") 'smex)
    (global-set-key (kbd "M-X") 'smex-major-mode-commands)
    ;; This is your old M-x.
    (global-set-key (kbd "C-c C-c M-x") 'execute-extended-command)
    
  3. 使用方法
    C-s/C-r switches to the next/previous match. Enter executes the selected command.
    M-x smex
    M-X smex-major-mode-commands  runs Smex, limited to commands that are relevant to the active major mode.
    C-h f, while Smex is active, runs describe-function on the currently selected command.
    M-. jumps to the definition of the selected command.
    C-h w shows the key bindings for the selected command. (Via where-is.)
    smex-show-unbound-commands shows frequently used commands that have no key bindings
    smex-history-length to change the number of recent commands that Smex keeps track of.
    

2.19 web浏览器Xwidget & 附带安装pdf阅读器

2.20 PDF阅读器

n*** Doc-view-mode

  1. 安装方法

    在cygwin中用apt-cyg安装Ghostscript和xpdf包,之后即可正常使用

  2. 快捷键
    p/n	上下翻页
    +/-	缩放
    C-s	搜索
    q	退出     
    
  3. 书签功能

    利用emacs自带的package Bookmarks

    C-x r m	设置书签
    C-x r b	跳转到书签
    C-x r l	列出所有书签
    M-x bookmark-delete	删除书签
    

3 Latex 编辑命令

3.1 平台搭建

3.1.1 TeXLive + Emacs + AUCTex + SumatraPDF

3.1.2 通过清华镜像安装textlive

安装成功之后包含有:xpdf/pdfTex 需要添加到环境变量,之后emacs才能在任何cmd中调用latex命令

3.1.3 通过elpa emacs package管理工具安装AUXTex

否则无法编译导出pdf文件

3.1.4 安装auctex package

  1. source code 在init.el中设置auctex
    ;; 所有关于latex导出pdf的设置
    (require 'auctex)
    (require 'cdlatex)
    ;; (load "auctex.el" nil t t)  ;; 从elpa导入的包不需要本命令
    ;; (load "preview.el" nil t t)
    (add-hook 'LaTeX-mode-hook #'LaTeX-install-toolbar)
    (add-hook 'LaTeX-mode-hook 'turn-on-reftex) ; with AUCTeX LaTeX mode
    (add-hook 'latex-mode-hook 'turn-on-reftex) ; with Emacs latex mode
    (setq TeX-auto-save t)
    (setq TeX-parse-self t)
    (setq-default Tex-master nil)
    (setq TeX-global-PDF-mode t TeX-engine 'xetex)
    ;; 设置默认编译命令
    (add-hook 'LaTeX-mode-hook
              (lambda()
                (add-to-list 'TeX-command-list '("XeLaTex" "%`xelatex%(mode)% %t" TeX-run-TeX nil t))
                (setq TeX-command-default "XeLaTex")
                ))
    ;; (add-hook 'LaTeX-mode-hook (lambda () (add-to-list 'TeX-command-list '("XeLaTeX" "%`xelatex%(mode)%' %t" TeX-run-TeX nil t)))
    ;; (add-hook 'LaTeX-mode-hook (lambda () (setq TeX-command-default "XeLaTex")))
    ;; 将cdlatex设置为AUCtex的辅模式
    (add-hook 'LaTex-mode-hook 'turn-on-cdlatex)
    
  2. 在.spacemacs中添加auctex到package中
  3. 修改elpa自动下载下来的auctex.el文件

    如果没有这一步,会报错找不到auctex feature 一般来说feature是由同名feature.el提供,并在结尾有 (provide 'feature) 因此,修改文件即可

  4. 需要修改init.el中的语句

    auctex-12.1.1库中只有preview.el文件

3.2 emacs使用总结

使用xelatex作为latex编译工具,支持中文

C-c C-c 选择xelatex编译pdf

C-c C-v 直接查看生成的pdf文件   或者C-c C-c选择view

3.3 auctex/preview使用方法

3.3.1 auctex

  1. latex编写的过程中快速插入快捷键
    1. 环境、宏插入
      C-c C-s 插入章节 
      C-c C-e 插入 LaTex 环境  例如:回车之后输入equ,则自动生成公式环境
      C-c C-j 插入列表 item 
      C-c ] 闭合 LaTeX 环境 
      C-c C-m 插入 Tex 宏      
      
    2. 字体改动
      C-c C-f C-b 插入粗体文本 
      C-c C-f C-i 插入斜体文本 
      C-c C-f C-e 插入强调文本 
      C-c C-f C-s 插入微斜体文本 
      C-c C-f C-r 插入罗马体文本 
      C-c C-f C-f 插入无衬线体文本 
      C-c C-f C-t 插入打印机体字体 
      C-c C-f C-c 插入小型大写文本 
      C-c C-f C-d 删除字体信息 
      

3.3.2 preview-latex

C-c C-p C-p  preview-at-point 对当前环境进行预览 重复命令取消 
C-c C-p C-e  preview-environment    
C-c C-p C-s  preview-section
C-c C-p C-r  preview-region
C-c C-p C-b  preview-buffer
C-c C-p C-d  preview-document
C-c C-p C-c C-p preview-clearout-at-point
...取消命令同上
C-c C-k      LaTeX/TeX Output/Kill Job

3.4 导出pdf

3.4.1 编译方法

需要先编译

C-c C-c 编译latex文件
C-c C-l 查看编译日志
如果编译通过会在原路径生成.pdf
之后打开pdf即可

3.4.2 使用XeLaTex工具导出PDF

  1. 两个工具都可以

    pdfTex XeLaTex

  2. 中文支持 此方法只在XeLeTex导出模式起效
    1. 方法一 不推荐

      需要把头文件更换为ctexart

      \documentclass{ctexart} 支持中文
      \documentclass[11pt]{article} 默认
      
    2. 方法二 推荐

      只需要添加ctex库即可,必须使用XeLaTex导出

      \usepackage[UTF8]{ctex}
      
  3. 中文支持需要针对textlive层面操作

3.4.3 可选解决方案:

  1. 使用默认编译工具:

    C-c C-c 用xelatex编译

  2. 安装latex-preview-pane

    正常安装方法 此外,默认的导出pdf方式为pdflatex 一定要在latex-preview-pane.el中把所有字符串pdflatex替换为xelatex 需要配合pdf阅读器使用,doc-view-mode

  3. 实时启动包
    M-x latex-preview-pane-mode
    (latex-preview-pane-enable) 配置init.el 全局启动该package     
    
  4. 键位绑定
    Refresh Preview (bound to M-p)
    Open in External Program (Bound to M-P)
    Disable LaTeX Preview Pane (turns the mode off, you can also use M-x latex-preview-pane-mode to toggle it off.
    Customize LaTeX Preview Pane (opens a customization buffer where you can set the command to use for generating previews)     
    

3.4.4 终极解决方案:auctex package

C-c C-c 编译生成pdf C-c C-v 直接查看生成的pdf文件 完美

3.5 中文环境包

% 中文支持包
\usepackage{ctex}
\usepackage{CJK}

 % 调用环境变量 
 \begin{CJK}{UTF8}{song}
 some content here.
 具体内容
 \end{CJK}

3.6 latex编辑公式

3.6.2 公式环境

  1. 插入公式
    $ $ 之间写公式 直接在文中加入
    \[ \] 另起一行写公式
    \begin{equation} 需要对公式进行编号
    \end{equation}  需要对公式进行编号
    
  2. 多个公式组
    \begin{align*}
    2x^5+2(y-3)(z-1) & =x^3+3(x^5-3y+3z-2)\\
    &=2x+5x^5-6y*4+5z-3\\
    &=5x^5+3y^2+z
    \end{align*}
    %可以看到,在align中像表格一样用&来区分每一列 用\\来区分每一行,注意到在align中并不需要使用将
    %公式转化为数学模式的符号$或者\[\],因为它已经默认在数学模式下编辑
    

3.6.3 公式符号

  1. 常用西文符号
  2. 上标和下标
    $$\sum_{i=1}^{n} a_i=0$$
    
  3. 公式中加上文本 \mbox{txt}
    $$\mbox{对任意的$x>0$}, \mbox{有 }f(x)>0. $$
    
  4. 标号 运算符
  5. 括号

    小括号 中括号直接用 大括号需要转译

    \{1+2\}
    {1+2}
    
  6. 空格
    \;
    
  7. 矩阵
    $$\begin{matrix}…\end{matrix}$$,使用&分隔同行元素,\\换行
    
  8. 特殊符号的写法
    1. 下面这些是保留字符,有特殊用处
    2. 转译字符为反斜杠 \
    3. 反斜杠比较特殊 \
      $\backslash$
      
    4. 两个反斜杠为换行
      双引号是特殊符号, 两个tab上面的符号为前双引,两个单引号为后双引
      
    5. 文件夹//表示打开该文件夹
      images//1.png
      
  9. 特殊符号的写法汇总整理
    1. 最重要的符号是反斜杠\
      1. 单个反斜杠\表示转译
      2. 两个反斜杠\\表示换行
      3. 要在文本中输入反斜杠\ 需要引用公式中的符号\(\backslash\)
        $\backslash$
        
    2. 斜杠符号 用于latex语言中的路径分隔 以及作为数学中的除号
      1. 路径分隔
        images//1.png
        
      2. 除号
    3. 单引号 双引号的表示 很特殊
      `需要输入的内容' 前单引号为tab上方的按键 后单引号为enter左边的按键
      ``需要输入的内容双引号'' 双引号为单引号情形的两个即可 
      
    4. 矩阵的中括号
      \left[
           中间部分为需要括起来的内容
      \right]
      
    5. 矩阵的写法
      \begin{matrix}
         1 & 2 & 3 \\
         4 & 5 & 6 \\
         7 & 8 & 9
        \end{matrix}
      
    6. 分数的写法
      \frac{分子}{分母}
      
    7. 省略号
      \cdots 水平方向省略号
      \vdots
      
    8. 不等号
      \neq
      \leqslant
      \geqslant
      
    9. 无穷大
      \infty
      

3.6.4 其他还有一些数学环境里的「要」和「不要

用 $ ... $ 而不用 \( ... \);
用 align 环境而不用 eqnarray 环境;
用 matrix, bmatrix, pmatrix, vmatrix, Vmatrix 等环境而不用 array 环境去实现矩阵;
用 \bigl, \bigr 等命令来处理定界符,而尽可能避免 \left 和 \right。
换行 优先用\\换行符,因为空一行来换行的话会出现开头自动tab的问题
空出一行 可以用 \vbox{}\\
最后一行一定不能有\\ 并且空行跟换行符\\不能同时用

3.7 latex 设置字体格式

3.7.1 设置字体大小

  1. 第一种方法
    \fontsize{字体尺寸}{行距}
    
  2. 第二种方法 从小到大
    Command     Nominal Point Size      Exact Point Size
    \tiny               5                       5
    \scriptsize         7                       7
    \footnotesize       8                       8
    \small              9                       9
    \normalsize        10                      10
    \large             12                      12
    \Large             14                   14.40
    \LARGE             18                   17.28
    \huge              20                   20.74
    \Huge              24                   24.88
    
    \tiny
    \scriptsize
    \footnotesize
    \small
    \normalsize 采用默认!
    \large
    \Large
    \LARGE
    \huge
    \Huge
    

3.7.2 设置字体颜色

\usepackage{xcolor}
\textcolor{color}{words to be in color}
\color{color}{}
\colorbox[rgb]{r,g,b}{text}  %背景颜色

3.7.3 设置字体居中

\centerline{\large{Homework 1}}

3.7.4 设置字体加粗 下划线等命令

  1. 命令汇总
    \usepackage{ulem}
    
    \uline{text}  下划线
    \uuline{text}  双下划线
    \uwave{text} 波浪线
    \sout{text} 删除线
    \xout{text} 斜删除线
    
    显示直立文本: \textup{文本}
    意大利斜体: \textit{文本}
    slanted斜体: \textsl{文本}
    显示小体大写文本:  \textsc{文本}
    中等权重: \textmd{文本}
    加粗命令: \textbf{文本}
    默认值: \textnormal{文本}
    下划线: \underline{文本}
    
    Latex的斜体命令是\emph{文字}
    Latex的下划线命令是\underline{文字}
    Latex的加粗命令是\textbf{文字}
    
  2. 用法解释
    \begin{bfseries} 
    这段我希望他能加黑啊
    \end{bfseries}
    

    或者

    {\bfseries 这段我希望他能加黑啊} 
    
  3. 多个格式混合使用 先居中 在字号 在加粗
    \centerline{\huge{\textbf{Project Abstract}}}
    emph{\textbf{blablablabla}}
    

3.8 latex设置段落格式

3.8.1 首行缩进

\noindent 设置不缩进
\indent 设置缩进

3.8.2 空行

\vbox{}\\ 要再最后加\\
\vspace{12pt} 不要再最后加\\

3.9 latex 插入图片

3.9.1 一定要注意!!!!!!谁他妈说的,草,不确定

  1. \begin{figure}同一个环境中只能放一个!!!!
  2. 要想同时使用多个图片,只能用tabular

3.9.2 图片路径设置格式

\includegraphics{images//1.png}

3.9.3 一般需要包含的宏包

\usepackage{epsfig}
\usepackage{graphicx}
\usepackage{subfigure}

3.9.4 神器:图片处理,超链接处理

  1. 自动编号图片源码
    1. 步骤分析
      • 先在头文件区域建立newcommand模型来处理图片
      • 在文件区域通过文件名引用图片,并且自动编号
      • 特别注意,引用的时候的label是文件名!而不是标题名
      • 引用命令 \ref{}
    2. newcommand源码
      \newcommand{\scalefig}[3]{
        \begin{figure}[ht!]
          % Requires \usepackage{graphicx}
          \centering
          \includegraphics[width=#2\columnwidth]{#1}
          %%% I think \captionwidth (see above) can go away as long as
          %%% \centering is above
          %\captionwidth{#2\columnwidth}%
          \caption{#3}
          \label{#1}
        \end{figure}}
      
    3. newcommand源码解释
      • 输入三个参数 文件路径 图片宽度 标题
      • 文件路径即文件的label(由此,我最好是吧图片放到同一路径里面方便使用)
      • 图片宽度:归一化列宽,0.5即50%
    4. 正文中图片源码
      \scalefig{homework_example_fig}{0.5}{Figure Generated By
      Listing~\ref{homework_example}}
      
  2. 图片超链接设置
    1. 需要配置usepackage包
      \usepackage[dvipdfm,  %pdflatex,pdftex这里决定运行文件的方式不同
                  pdfstartview=FitH,
                  CJKbookmarks=true,
                  bookmarksnumbered=true,
                  bookmarksopen=true,
                  colorlinks, %注释掉此项则交叉引用为彩色边框(将colorlinks和pdfborder同时注释掉)
                  pdfborder=001,   %注释掉此项则交叉引用为彩色边框
                  linkcolor=blue,
                  anchorcolor=green,
                  citecolor=green
                  ]{hyperref}  
      
    2. 在正文中插入超链接的命令
      \href{URL}{text}
      \url{URL}
      \nolinkurl{URL}
      \hyperbaseurl{URL}
      \hyperimage{imageURL}{text}
      \hyperdef{category}{name}{text}
      \hyperref{URL}{category}{name}{text}
      \hyperref[label]{text}
      \hyperlink{name}{text}
      \hypertarget{name}{text}
      \phantomsection
      \cleardoublepage
      \phantomsection
      \addcontentsline{toc}{chapter}{\indexname}
      \printindex
      \autoref{label}
      
    3. 最常用的插入超链接的命令
      \hyperref[result1.png]{Fig.\ref{result1.png}}
      

      其中,[]里面的是label {}里面的是隐式链接

  3. 网址超链接
    \href{https://github.com/yyang181/ee243/blob/master/nips_2017/nips_2017.tex}{github}
    

3.9.5 nips图片格式

\begin{figure}[h]
  \centering
  \fbox{\rule[-.5cm]{0cm}{4cm} \rule[-.5cm]{4cm}{0cm}}
  \caption{Sample figure caption.}
\end{figure}

3.9.6 博客图片格式

\begin{figure}
  \begin{center}
    \includegraphics[width=0.32\linewidth]{lena.eps}
    \caption{An image of Lena.}
    \label{Fig:1}
  \end{center}
  \vspace{-0.5em}
\end{figure}

3.9.7 多个图片排列 tabular

\begin{figure}
  \centering
  \begin{tabular}{ccc}
    \includegraphics[width=0.32\linewidth]{lena.eps}  & 
    \includegraphics[width=0.32\linewidth]{lena.eps}  & 
    \includegraphics[width=0.32\linewidth]{lena.eps} \\ 
    (a) & (b) & (c)\\
  \end{tabular}
  \caption{Three images of Lena. }
  \label{Fig:4}
  \vspace{-0.5em}
\end{figure}

3.10 latex 新建页

\clearpage 优先用这个
\newpage

3.11 latex 脚注

\footnotemark[num] 添加脚注
\footnotetext[num]{text} 标注出脚注内容,必须放在正文里面
\thanks{text} 直接脚注

3.12 latex 交叉引用 \label \ref

3.12.1 用法解释

图片的Figure.1这类编号是自动生成的,并且随着图片数量的变化而变化。

为了能够随时使用特定图片,可以给该图片一个label,这个label也是自动编号的。

使用的时候直接\ref这个label即可的到图片的编号。

3.13 latex 中新建environment

3.14 latex 中分栏

3.14.2 双栏模式进入和退出

\twocolumn 
\onecolumn

3.14.3 分栏的中间间距和竖线

  1. 中间间距
    \setlength\columnsep{5pt}
    
  2. 分栏线默认宽度为0,即不可见,可以通过
    \setlength\columnseprule{0.4pt}
    
  3. 多栏显示
    \usepackage{multicol}
    ...
    \begin{multicols}{3}
    \end{multicols}
    

3.15 latex 中语法高亮

3.15.1 以c语言为例

\documentclass{ctexart}  
\usepackage{listings}  
\usepackage{xcolor}  
\lstset{  
    columns=fixed,         
    numbers=left,                                        % 在左侧显示行号  
    frame=none,                                          % 不显示背景边框  
    backgroundcolor=\color[RGB]{245,245,244},            % 设定背景颜色  
    keywordstyle=\color[RGB]{40,40,255},                 % 设定关键字颜色  
    numberstyle=\footnotesize\color{darkgray},           % 设定行号格式  
    commentstyle=\it\color[RGB]{0,96,96},                % 设置代码注释的格式  
    stringstyle=\rmfamily\slshape\color[RGB]{128,0,0},   % 设置字符串格式  
    showstringspaces=false,                              % 不显示字符串中的空格  
    language=c++,                                        % 设置语言  
}  
\begin{document}       
{\setmainfont{Courier New Bold}                          % 设置代码字体                     
\begin{lstlisting}  
#include <iostream>  
int main()  
{  
    std::cout << "Hello, World!" << std::endl;  
}    
\end{lstlisting}} 

3.15.2 更全面的代码参数设置见网址https://blog.csdn.net/lydyangliu/article/details/9208635

\usepackage{graphicx}  
\usepackage{xcolor}  
\usepackage{listings}  
\lstset{%  
alsolanguage=Java,  
%language={[ISO]C++},       %language为,还有{[Visual]C++}  
%alsolanguage=[ANSI]C,      %可以添加很多个alsolanguage,如alsolanguage=matlab,alsolanguage=VHDL等  
%alsolanguage= tcl,  
alsolanguage= XML,  
tabsize=4, %  
  frame=shadowbox, %把代码用带有阴影的框圈起来  
  commentstyle=\color{red!50!green!50!blue!50},%浅灰色的注释  
  rulesepcolor=\color{red!20!green!20!blue!20},%代码块边框为淡青色  
  keywordstyle=\color{blue!90}\bfseries, %代码关键字的颜色为蓝色,粗体  
  showstringspaces=false,%不显示代码字符串中间的空格标记  
  stringstyle=\ttfamily, % 代码字符串的特殊格式  
  keepspaces=true, %  
  breakindent=22pt, %  
  numbers=left,%左侧显示行号 往左靠,还可以为right,或none,即不加行号  
  stepnumber=1,%若设置为2,则显示行号为1,3,5,即stepnumber为公差,默认stepnumber=1  
  %numberstyle=\tiny, %行号字体用小号  
  numberstyle={\color[RGB]{0,192,192}\tiny} ,%设置行号的大小,大小有tiny,scriptsize,footnotesize,small,normalsize,large等  
  numbersep=8pt,  %设置行号与代码的距离,默认是5pt  
  basicstyle=\footnotesize, % 这句设置代码的大小  
  showspaces=false, %  
  flexiblecolumns=true, %  
  breaklines=true, %对过长的代码自动换行  
  breakautoindent=true,%  
  breakindent=4em, %  
  escapebegin=
\begin{CJK*}{GBK}{hei},escapeend=\end{CJK*}
\begin{CJK*}{GBK}{hei},escapeend=\end{CJK*}
,  
  aboveskip=1em, %代码块边框  
  tabsize=2,  
  showstringspaces=false, %不显示字符串中的空格  
  backgroundcolor=\color[RGB]{245,245,244},   %代码背景色  
  %backgroundcolor=\color[rgb]{0.91,0.91,0.91}    %添加背景色  
  escapeinside=``,  %在``里显示中文  
  %% added by http://bbs.ctex.org/viewthread.php?tid=53451  
  fontadjust,  
  captionpos=t,  
  framextopmargin=2pt,framexbottommargin=2pt,abovecaptionskip=-3pt,belowcaptionskip=3pt,  
  xleftmargin=4em,xrightmargin=4em, % 设定listing左右的空白  
  texcl=true,  
  % 设定中文冲突,断行,列模式,数学环境输入,listing数字的样式  
  extendedchars=false,columns=flexible,mathescape=true  
  % numbersep=-1em  
}  
\begin{document}  

3.16 latex 中页边距设置

\usepackage{geometry}
\geometry{a4paper,scale=0.8}
上面命令设置了纸张为a4 纸,并且版心占页面长度的比例为80%;scale也可以改为ratio,表示版面边距占页面长度的比例。该宏包还可以设置页面的上下左右边距,例如
\geometry{a4paper,left=2cm,right=2cm,top=1cm,bottom=1cm}

3.17 latex + bibtex生成参考文献

3.17.1 latex书写

  1. 环境包定义

    该段代码需要放到.tex文件正文中

    \bibliographystyle{preference_template}   //参考文献的模板的文件名(不加后缀)
    \bibliography{BibTeX file}             //参考文件源文件的文件名(不加后缀)
    
  2. 引用.bib中的内容
    \cite{von2003captcha}     
    

3.17.2 同路径下文件

  1. 添加 preferencetemplate

    最常用 ieee.bst

  2. 添加 .bib

    把bibtex格式输入.txt之后修改后缀为.bib即可

3.17.3 生成参考文献列表 1 2 1 1

(1)点击“LaTex"编译,模板文件夹中会生成*.aux文件、*.dvi文件、*.log文件以及*.gz文件;

(2)点击“BibTex“编译,模板文件中会生成*.blg文件和*.bbl文件;

(3)点击“LaTex"编译,获得新的*.aux文件、*.dvi文件、*.log文件以及*.gz文件;

(4)再次点击“Latex”编译,即可查看生成结果。

3.17.4 最终代码示例

\bibliographystyle{ieee}      
\bibliography{ref}       
\cite{paszke2016enet}

4 Org mode

4.1 配置

需要安装web-mode详情见html语言中的配置。

4.2 Useful Command

4.2.1 编译

c-c c-e 编译生成html网站格式
c-c c-e 可选生成latex pdf

4.2.2 标题

  1. 命令汇总
     TAB 切换标题(只针对当前选中主标题)
     s-TAB 切换标题(对整个文本内容)
     m-left/right 升降级标题
     m-enter 插入一个同级标题
    RET 表示回车键
    M-LEFT/RIGHT
    升级/降级当前标题,不允许有子标题的存在
    M-S-LEFT/RIGHT
    升级/降级标题树,即标题树内的各级标题相应升/降级
    M-UP/DOWN
    在同级标题间上/下移标题树,不能跨级别移动
    M-RET
    在当前标题后插入同级标题符号(即换行符和星号)
    C-RET
    在当前标题树后插入同级标题符号
    M-S-RET
    在当前标题后插入同级TODO标题
    C-S-RET
    在当前标题树后插入同级TODO标题
    C-c *
    把光标所在行转成标题
    C-c -
    把光标所在行转成列表
    
    C-c C-n 
    跳转到下一个同级标题
    C-c C-p
    跳转到上一个同级标题
    
  2. 常用命令
    M-S-LEFT/RIGHT 升级/降级标题树,即标题树内的各级标题相应升/降级
    M-RET 在当前标题后插入同级标题符号(即换行符和星号)
    C-RET 在当前标题树后插入同级标题符号
    M-S-RET 在当前标题后插入同级TODO标题
    C-S-RET 在当前标题树后插入同级TODO标题
    C-c * 把光标所在行转成标题
    C-c - 把光标所在行转成列表
    
  3. 命令解析
    C- 带有Ctrl的表示对子树进行操作
    M- 带有alt的表示对标题进行操作
    -S- 带有shift的表示TODO类型
    

4.2.3 块标签

 <s TAB 快速插入一个 源代码块标签
 <e TAB 快速插入一个 example块标签
org9.2版本已经取消掉了本功能 需要在init.el中require
(require 'org-tempo)
 s    #+begin_src ... #+end_src   
 e    #+begin_example ... #+end_example  : 单行的例子以冒号开头  
 q    #+begin_quote ... #+end_quote      通常用于引用,与默认格式相比左右都会留出缩进  
 v    #+begin_verse ... #+end_verse      默认内容不换行,需要留出空行才能换行  
 c    #+begin_center ... #+end_center   
 l    #+begin_latex ... #+end_latex   
 L    #+latex:   
 h    #+begin_html ... #+end_html   
 H    #+html:   
 a    #+begin_ascii ... #+end_ascii   
 A    #+ascii:   
 i    #+index: line   
 I    #+include: line 

4.2.4 排版段落格式

  • 单纯文字编辑 空一行即可
  • 可以用- 来表示要点提示的项目符号
  • 可以用上述块标签来表示源代码等

4.2.5 设置默认在org mode下面使用缩进格式

M-x org-intend-mode 打开缩进模式即可
org-startup-indented 设置该变量令所有文件都打开org-intend-mode

4.3 产生时间戳

快捷命令
动作
C-c .
通过日历选择计划日期,如果在一个时间戳后面使用将产生一个日期段
C-c !
同上,但产生非激活日期
C-u C c .
产生计划时间或时间段
C-u C c !
同上,但产生非激活日期
C-c C-c
在时间戳上使用该命令将对该时间戳进行格式补全和校对
C-c <
插入Emacs日历中光标所在处的日期(或当前日期)作为时间戳
C-c >
访问Emacs日历上当前日期;如果光标处有时间戳就访问该日期
C-c C-o
在日程表上访问光标时间戳表示的日期/时间
S-UP/DOWN/LEFT/RIGHT
前/后移日期或时间(小时/分),具体情况由光标所在位置而定

4.4 待办事项功能

4.4.1 使用方法

M-S enter 产生一个同级 to do 标题
C-S enter 产生一个同级子树 to do标题    

4.4.2 命令:

M-S enter 产生一个同级 to do 标题
C-S enter 产生一个同级子树 to do标题
S-UP/DOWN 为任务设定优先级
C-c C-c 将光标放在这些内容上,输入  可以直接生效
C-c C-t 变换TODO的状态 先配置TODO类型在配置TODO的状态
C-c / t 以树的形式展示所有的 TODO 作用:快速浏览TODO任务

4.4.3 自定义TODO标签的格式

#+TYP_TODO: 工作(w!) 学习(s!) 休闲(l!) |
#+SEQ_TODO: PENDING(p!) TODO(t!) | DONE(d!) ABORT(a@/!)

4.4.4 自定义标签括号里面附加选项

可以在()中定义附加选项,包括: 
字符:该状态的快捷键
!:切换到该状态时会自动增加时间戳
@ :切换到该状态时要求输入文字说明
如果同时设定@和!,使用“@/!”

4.4.5 对所有org文档配置默认

(setq org-todo-keywords
    '((sequence "REPORT(r)" "BUG(b)" "KNOWNCAUSE(k)" "|" "FIXED(f)")
      (sequence "TODO(T!)" "|" "DONE(D@)3" "CANCELED(C@/!)")
     ))    

4.4.6 设置任务优先级

为任务设定优先级是通过 快捷键 S-UP/DOWN

4.4.7 步骤

  • 在头文件添加配置,见自定义TODO标签格式
  • 将光标放在这些内容上,输入 C-c C-c 可以直接生效
  • C-c C-t 变换TODO的状态 先配置TODO类型在配置TODO的状态
  • C-c / t 以树的形式展示所有的 TODO

4.5 超链接文件或者图片

4.5.1 常规解决方案iimage-mode

file: ./a.png 插入图片的org-mode 代码
file:images/a.png
M-x 运行iimage-mode可以在emacs中直接显示/隐藏图片
#+CAPTION: 电话拨打过快过多   设置图片标题
#+ATTR_HTML: :width 100%   设置图片尺寸:表示宽度和浏览器页面宽度相同    

4.5.2 锚点

定义锚点位置:
<<定位1>>

假如想要返回到“定位1”的位置,即可定义如下连接:
[[定位1][返回定位1]]
来自 <https://www.cnblogs.com/halberd-lee/p/10614222.html> 

4.5.3 更好的解决方案: org-download + imagemagick

  1. 配置方法
    1. 安装

      安装org-download及imagemagick cygwin版本 添加环境变量

    2. imagemagick的使用方法及配置

      convert clipboard: d:/test/test.png cmd命令行将剪切板上的图片保存为test.png 需要在导入org-download的时候修改默认的org-download-screenshot配置 在init.el中添加如下语句

      (setq org-download-screenshot-method "convert clipboard: %s")
      

      则设置了org-download-screenshot-method的默认方法为imagemagick中的convert

4.5.4 使用方法

M-x org-download-screenshot-methods 一键完成粘贴 剪切板中的图片,不需要保存路径
C-S-y 绑定按键到该命令即可
(global-set-key (kbd "C-S-y") 'org-download-screenshot)  -连接表示需要 同时按键
或者直接将images中的文件拖动到emacs即可,需要org-download包支持    
C-c C-x C-v 显示所插入的图片 开启org-taggle-inline-image-mode 控制开启和关闭

4.6 表格和图片增加标签和说明,并交叉引用

4.6.1 命令

对于表格和图片,可以在前面增加标题和标签的说明,以方便交叉引用。比如在表格的前面添加: 
#+CAPTION: This is the caption for the next table (or link)
则在需要的地方可以通过 
\ref{table1}

4.7 表格的输入

4.7.1 插入表格

Table 1: 表格的标题
1 one
2 two
3 This is a long chunk of text
4 four

4.7.2 限制所在列的长度

1 one
2 two
3 This=>
4 four

4.7.3 美化表格

1 one
2 two
3 This=>
4 four

4.7.4 操作说明

  1. 表格的基本操作
    C-c |	 	生成表格,在buffer区域会提示输入N*M,代表N列M行的表格
    |- TAB	 	生成一行 |—+----| 结构
    C-c C-c	org-table-align	表格对齐
    TAB	 	从左到右,光标从前一个字段跳到下一个字段
    S+TAB	 	从右到左,光标从后一个字段跳到前一个字段
    RET	 	光标移动到下一行。如果下一行还没有表格结构,则新增一行     
    
  2. column and row editing
    C-c space	org-table-blank-field	清空当前格
    M-a	org-table-beginning-of-field	移动到当前表格的第一个格,或者移动前到一个格
    M-e	org-table-end-of-field	光标移动到当前格的尾部或者移到下一格的尾部。
    M-left	org-table-move-column-left	向左移动当前列,如果快捷键效果不对,可以使用前面的命令
    M-right	org-table-move-column-right	向右移动当前列,如果快捷键效果不对,可以使用前面的命令
    M-S-left	org-table-delete-column	删除光标所在列。如果快捷键效果不对,可使用前面命令
    M-S-rigth	org-table-delete-column	在光标所在位置插入一列,如果快捷键效果不对,可使用命令
    M-up	org-table-move-row-up	将光标所在行向上移一列。即与上一行替换位置
    M-down	org-table-move-row-down	将光标所在行与下一行互换位置。
    M-S-up	org-table-kill-row	删除当前行
    M-S-down	org-table-insert-row	插入一行
    C-c -	org-table-insert-hline	在下一行插入 |---------| 结构,导出时,会转换为一条直线
    CC	 	 
    C-c RET	org-table-hline-and-move	添加一行 |–+--\vert结构 并新增一行表格
    C-c ^	org-table-sort-lines	将最近的两条横线之间的区域进行排序,或者是整张表。如果光标在第一
        个格之前,则会提示输入要排序的列。命令方式,会提示排序方式:
        alphabetically,numberically,or by time.可以升序或者降序排列,也可
        以按照自己想要的规则,比如提供给org一个处理函数。大小写严格区分     
    
  3. regions
    C-c C-x M-w	org-table-copy-region	复制一个长方形区域至Emacs剪切版。长方形的范围由光标和mark标记来确定
    C-c C-x C-w	org-table-cute-region	剪切一个长方形区域至Emacs剪切版。
    C-c C-x C-y	org-table-paste-rectangle	按原有的列数与行数粘贴一个长方形区域至表中。此操作,忽略横向分隔线。
        如果表格行列数不足,则自动补充     
    
  4. 表格格式化

    设置字符位置 字段中字符的位置有偏左,偏右,居中。 在表示一个表格的两个'|' 之间使用<c|r|l> 来表示,其中c 代表center,r 代表right,l代表left 示例:

    居中 居左 居右

    设置单个表格宽度 宽度指的是字符数,表格中的一列中单行显示最大字符数。比如<4>代表该列,每行最多显示4个字符,如果超过4个字符会 被隐藏。

         
  5. 表格的计算

    1: | 数量 | 单价 | 总价 | 2: | <c> | <c> | <c> | 3: |-------------–—| 4: | 6 | 18 | | 5: | 5 | 19 | | 6: | 4 | 20 | | 7: | 3 | 21 | | 8: | 2 | 22 | | 9: | 1 | 23 | | 10: #+TBLFM: $3=$1*$2::@6$3=$2-$1::@4$3=$1+\(2 数值的计算,需要在表格下方使用标签 #+TBLFM: ,标签后写说明方法: '\)' 代表列 '@' 代表行 '::' 当有多个表达式时,使用两个冒号进行分隔 将表达式应用到表格中,使用快捷键: C-ucc . 结果如下:

4.8 Org 一键导出latex之后转pdf的方法

4.8.1 方案对比md tex

对于普通的文档编写,优先选用org-md-pdf路径,版式好看,语法相对简单

对于风格固定、只专注于文字的情况,优先选用org-tex-pdf路径,使用固定模板

4.8.2 目前暂时没有比较好的中文解决方案

4.8.3 英文处理直接编译然后用pdftex输出所需要的pdf 中文只能暂时用html格式将就一下了

4.8.4 配置.spacemacs文件来添加中文支持包

 ;;windows setenv PATH
  (setenv "PATH" "C:/ProgramData/Oracle/Java/javapath;%SystemRoot%/system32;%SystemRoot%;%SystemRoot%/System32/Wbem;%SYSTEMROOT%/System32/WindowsPowerShell/v1.0/;C:/Program Files (x86)/ATI Technologies/ATI.ACE/Core-Static;e:/Program Files/Git/cmd;e:/Program Files/Git/mingw64/bin;e:/Program Files/Git/usr/bin;C:/Program Files/Git/cmd;C:/Program Files (x86)/AMD/ATI.ACE/Core-Static;d:/CTEX/UserData/miktex/bin;d:/CTEX/MiKTeX/miktex/bin;d:/CTEX/CTeX/ctex/bin;d:/CTEX/CTeX/cct/bin;d:/CTEX/CTeX/ty/bin;d:/CTEX/Ghostscript/gs9.05/bin;d:/CTEX/GSview/gsview;d:/CTEX/WinEdt")

  ;; 中文字体的设置,同时解决中英文字体宽度不一致的问题(org-mode的表格可以中英文对齐)。
  ;; 而且解决了中文字体导致emacs卡的现象。
  (dolist (charset '(kana han cjk-misc bopomofo))
    (set-fontset-font (frame-parameter nil 'font) charset
                      (font-spec :family "微软雅黑" :size 16)))
  ;;重新定义pdfviewer,我设定为了SumatraPDF。
  (setq TeX-command-default "XeLaTeX")
  (setq TeX-save-query  nil )
  (setq TeX-show-compilation t)
  (setq TeX-view-program-list '(("SumatraPDF" "SumatraPDF %o")))
  (setq TeX-view-program-selection '((output-pdf "SumatraPDF")))
   (add-hook 'LaTeX-mode-hook (lambda()
                               (add-to-list 'TeX-command-list '("XeLaTeX" "%`xelatex%(mode)%' %t" TeX-run-TeX nil t))
                               (setq TeX-global-PDF-mode t TeX-engine 'xelatex)
                                ))

(require 'ox-latex)
(add-to-list 'org-latex-classes
             '("org-article"
               "
\\documentclass{ctexart}
\\usepackage[colorlinks,linkcolor=black,anchorcolor=black,citecolor=black,CJKbookmarks=True]{hyperref}
\\usepackage{graphicx}
\\usepackage{xcolor}
\\usepackage{xeCJK}
\\usepackage{fixltx2e}
\\usepackage{longtable}
\\usepackage{float}        
\\usepackage{tikz}         
\\usepackage{wrapfig}      
\\usepackage{latexsym,amssymb,amsmath}
\\usepackage{textcomp}
\\usepackage{listings}     
\\usepackage{marvosym}     
\\usepackage{textcomp}     
\\usepackage{latexsym}     
\\usepackage{natbib}       
\\usepackage{geometry}     
\\usepackage{epstopdf}
\\usepackage{epsfig}
\\usepackage{times}
\\geometry{a4paper,centering,scale=0.8}
\\CTEXsetup[format={\\Large\\bfseries}]{section}
\\usepackage{tocbibind}
[NO-DEFAULT-PACKAGES]      
[PACKAGES]                 
[EXTRA]"
  ("\\section{%s}" . "\\section*{%s}")
  ("\\subsection{%s}" . "\\subsection*{%s}")
  ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
  ("\\paragraph{%s}" . "\\paragraph*{%s}")
  ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))

4.9 Org mode配置latex环境及常用宏包

中文宏包配置

#+LATEX_HEADER: \usepackage[colorlinks=true,linkcolor=red]{hyperref}

其它可选命令小结

#+LATEX_HEADER: \usepackage[colorlinks=true,linkcolor=red]{hyperref}
#+LATEX_CLASS: org-article
#+TITLE: Org to \LaTeX
#+AUTHOR: Yixin Yang
#+OPTIONS: toc:nil

4.10 Org mode 处理代码块

4.10.1 设置语言环境

在BEGIN_SRC 后面加上语言名字例如python

4.10.2 配置init.el文件

(require 'ob-python)
(require 'ob-clojure)
(require 'ob-perl)
(require 'ob-dot)
(require 'ob-R)
(require 'ob-gnuplot)
(require 'ob-lisp)
(require 'ob-org)
(require 'ob-screen)
(require 'ob-calc)
(require 'ob-js)
(require 'ob-latex)
(require 'ob-plantuml)
(require 'ob-sh)
(require 'ob-ditaa)
(require 'ob-awk)
(require 'ob-octave)
(require 'ob-sed)
(require 'ob-sql)
(require 'ob-sqlite)

(org-babel-do-load-languages
 'org-babel-load-languages
 '( (perl . t)
    (dot . t)
    (R . t)
    (gnuplot . t)
    (clojure . t)
;;    (graphviz . t)
    (lisp . t)
;;    (stan . t)
    (org . t)
    (screen . t)
    (calc . t)
    (js . t)
    (latex . t)
    (plantuml . t)
    (ruby . t)
    (sh . t)
    (python . t)
    (emacs-lisp . t)
    (ditaa . t)
    (awk . t)
    (octave . t)
    (sed . t)
    (sql . t)
    (sqlite . t)
    ))

4.10.3 命令快捷键

<s + TAB直接生成代码块 <s + TAB在代码块中加上行数 -n -r

C-c 编译主菜单
C-c ' 分号 新建一个buffer来写语言,如果保存则回写当前buffer
C-c C-c 编译当前代码块并输出结果

4.10.4 例子

(+ 1 2 3 4)

4.10.5 测试matlab代码块

print(100+200)

4.10.6 注意事项

详情见网页https://emacs.stackexchange.com/questions/28441/org-mode-9-unable-to-eval-code-blocks

由于默认的编译格式.elc文件是老版本的,需要全部删除重新编译

直接删掉,然后重新启动emacs即可使用C-c C-c了

4.11 Org-page package创建个人主页

4.11.1 .emacs 文件源代码 手动添加package 注意:目前好像不能用

;;; the following is only needed if you install org-page manually
(add-to-list 'load-path "path/to/org-page")
(require 'org-page)
(setq op/repository-directory "path/to/your/org/repository")
(setq op/site-domain "http://your.personal.site.com/")
;;; for commenting, you can choose either disqus, duoshuo or hashover
(setq op/personal-disqus-shortname "your_disqus_shortname")
(setq op/personal-duoshuo-shortname "your_duoshuo_shortname")
(setq op/hashover-comments t)
;;; the configuration below are optional
(setq op/personal-google-analytics-id "your_google_analytics_id")

4.12 orgmode中使用思维导图

4.12.1 软件安装

  1. 直接用C-c C-e f o即可输出.mm思维导图文件
  2. 下载软件freemind
  3. 安装Java环境

4.12.2 使用步骤

  1. 用orgmode输出.mm思维导图文件C-c C-e
  2. 用freemind软件打开.mm文件,并保存为.png即可

4.13 org-markdown

4.13.1 emacs配置

(with-eval-after-load 'org
  (add-to-list 'org-export-backends 'md))    

4.13.2 去掉table of contents

#+TITLE: org 导出 md
#+AUTHOR: me
#+OPTIONS: toc:nil

4.14 org-babel代码运行

4.14.1 配置

原文链接:https://blog.csdn.net/sinat_41104353/article/details/84642149

注意:大写的C包含了c cpp语言

(org-babel-do-load-languages
      'org-babel-load-languages
      '((emacs-lisp . t)
        (C . t)
        (java . t)
        (js . t)
        (ruby . t)
        (ditaa . t)
        (python . t)
        (shell . t)
        (latex . t)
        (plantuml . t)
        (R . t)))

4.14.2

4.15 org-latex

4.15.1 使用细则

  1. orm-mode中C-c C-e l l 生成tex文件
  2. 删除tex文件第一行时间信息,并且同时打开.tex .org文件
  3. 使用latex编译生成pdf的步骤对pdf进行修改,C-c C-c编译 C-c C-v修改

org-mode和latex的书写规范一样,空一行代表换行

4.15.2 步骤

  1. pdf文件生成
    1. C-c C-e l l 生成latex
    2. C-c C-e l p 生成pdf文件
  2. 用生成的latex对pdf进行微调,得到最终想要的输出
    1. 在org-mode 头部添加org-article的模板输出格式声明
    2. C-c C-c编译 并生成pdf文件
    3. C-c C-c再运行一次可以直接打开pdf文件 用view命令替代xelatex

4.15.3 可以顺利运行中文的package设置

下面的代码添加到int.el即可,注意要在.org的开头添加Label-class: org-article

(with-eval-after-load 'ox-latex
  (add-to-list 'org-latex-classes
               '("org-article"
                 "\\documentclass{article}
                 \\usepackage{amsmath,amsfonts,amsthm,amssymb}
                 \\usepackage{setspace}
                 \\usepackage{fancyhdr}
                 \\usepackage{lastpage}
                 \\usepackage{extramarks}
                 \\usepackage{chngpage}
                 \\usepackage{soul}
                 \\usepackage[usenames,dvipsnames]{color}
                 \\usepackage{graphicx,float,wrapfig}
                 \\usepackage{ifthen}
                 \\usepackage{listings}
                 \\usepackage{courier}
                 \\usepackage[colorlinks,
                              linkcolor=blue,
                              anchorcolor=green,
                              citecolor=green
                              ]{hyperref}  
                 \\usepackage{xcolor}
                 \\usepackage{xeCJK}
                 [NO-DEFAULT-PACKAGES]      
                 [PACKAGES]                 
                 [EXTRA]"
                 ("\\section{%s}" . "\\section*{%s}")
                 ("\\subsection{%s}" . "\\subsection*{%s}")
                 ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
                 ("\\paragraph{%s}" . "\\paragraph*{%s}")
                 ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))))

4.15.4 设置org-mode的默认pdf导出模板

  1. 在init.el中添加latex模板

    https://blog.csdn.net/rogeryu1234/article/details/53266947

    [NO-DEFAULT-PACKAGES] . 其含义的是不加载org默认的宏包

    xeCJK 是对中文的支持, tikz 是LaTeX下的绘图包, listings 是对代码的支持.

    ;; 所有关于org-导出latex模板的设置,包括自定义模板
    ;;org-export latex
    (with-eval-after-load 'ox-latex
      (add-to-list 'org-latex-classes
                   '("org-article"
                     "\\documentclass{article}
                     \\usepackage{amsmath,amsfonts,amsthm,amssymb}
                     \\usepackage{setspace}
                     \\usepackage{fancyhdr}
                     \\usepackage{lastpage}
                     \\usepackage{extramarks}
                     \\usepackage{chngpage}
                     \\usepackage{soul}
                     \\usepackage[usenames,dvipsnames]{color}
                     \\usepackage{graphicx,float,wrapfig}
                     \\usepackage{ifthen}
                     \\usepackage{listings}
                     \\usepackage{courier}
                     \\usepackage[colorlinks,
                                  linkcolor=blue,
                                  anchorcolor=green,
                                  citecolor=green
                                  ]{hyperref}  
                     \\usepackage{xcolor}
                     \\usepackage{xeCJK}
                     [NO-DEFAULT-PACKAGES]      
                     [PACKAGES]                 
                     [EXTRA]"
                     ("\\section{%s}" . "\\section*{%s}")
                     ("\\subsection{%s}" . "\\subsection*{%s}")
                     ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
                     ("\\paragraph{%s}" . "\\paragraph*{%s}")
                     ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))))
    
  2. 在org-mode中添加导出latex的配置
    #+LATEX_CLASS: org-article
    #+TITLE: Org to \LaTeX     
    #+AUTHOR: Yixin Yang
    #+OPTIONS: toc:nil
    
  3. 在org-mode中添加新的packages
    #+LATEX_HEADER: \usepackage[colorlinks=true,linkcolor=red]{hyperref}     
    
  4. 设置默认org-latex引擎
    (setq org-latex-pdf-process '("xelatex -interaction nonstopmode %f"
                                  "xelatex -interaction nonstopmode %f"))    
    

4.15.5 修改生成的latex文件中图片尺寸

\includegraphics[width=.5\linewidth]
修改width即可    

4.15.6 公式

org mode中公式的用法和latex完全一致 https://blog.csdn.net/csfreebird/article/details/43636615

C-c C-x C-l 预览输入的公式

优先使用的符号
\(   \)  插入行内公式
\[    \] 插入行间公式

可能有问题,plain tex符号
$ $ 插入行内公式
$$    $$ 插入行间公式

4.16 必备操作集锦

4.16.1 org mode文档开头配置汇总说明

最优的可视化方式 org模式转换方式为 org markdown

#+LATEX_HEADER: \usepackage[colorlinks=true,linkcolor=red]{hyperref}
#+LATEX_CLASS: org-article
#+TITLE: Org to \LaTeX
#+AUTHOR: Yixin Yang
#+OPTIONS: toc:nil
#+OPTIONS: ^:{}         

4.16.2 org mode编写导出为md pdf时出现下划线转义字符问题

  1. 单org文件解决方案

    在org文件开头加入下列代码

    #+OPTIONS: ^:{}     
    
    a_{b}时,_ 后被 {} 括起来的内容就会被转义
    a_b 时,就按普通的方式来显示
    
  2. 全局org mode,通过修改elisp语言

    https://blog.csdn.net/weixin_34234823/article/details/92663464 在init.el文件中添加如下代码,未经过测试

    (setq org-export-with-sub-superscripts '{})     
    

4.16.3 修改org-mode插入图片,图片的默认保存路径

变量名:org-download-image-dir

  1. 方案一:在org-mode开头添加代码 可以做到实时对应org文件名作为文件夹的名称

    可以在插入图片时,将图片放入与.org同名的文件夹下

    # -*- eval: (setq org-download-image-dir (file-name-sans-extension (buffer-name))); -*-     
    
  2. 方案二:在init.el中添加默认的路径信息 固定路径

    可将路径修改到assets文件夹下

    (setq-default org-download-image-dir "./assets")      
    
  3. 方案三:在init.el中添加默认的路径信息 文件名作为路径

    测试未通过

    (setq-default org-download-image-dir (file-name-sans-extension (buffer-name)))
    

4.16.4 文本加粗的方式

*abc* 将abc加粗    

4.16.5 emacs内容元数据

<s tab 代码块
<e tab 例子    

5 Python 语言

5.1 系列软件安装指南

5.1.1 稳定版本

tensorflow 1.15.0 cudn 10 cudnn 7.6.4

更换cuda版本只需要更改环境变量的顺序即可

5.1.2 anaconda

一定记住添加环境变量 dll文件只在anaconda cmd中可以找到,在windows环境中需要设置环境变量才可以 路径:

"d:/anaconda/python.exe" 默认python路径
"d:/anaconda/Scripts" 默认ipython jupyter Spyder等高级程序路径
Anaconda3
Anaconda3\Scripts         这是前两个环境变量
Anaconda3\Library\bin     这是新加的环境变量

5.1.3 TensorFlow

  1. 安装指南
    1. 必须安装Microsoft的visual studio
    2. 下载安装cuda9.0版本+cudnn for cuda9.0 cuda与cudnn的版本号一定要对应!!!!!比如10.0 10.0
    3. 设置环境变量 bin libnvvp extras\CUPTI\libx64
    4. Python3.6 3.5均可用 3.7有问题? 3.7可用
    5. 安装命令不能简单的用pip install tensorflow 可以参考:pip install –upgrade –ignore-installed tensorflow
    6. scikit-image package包含了很多image相关的库,需要安装
  2. conda虚拟环境(anaconda虚拟环境后续不支持)
    conda create -n tensorflow python=3.7     
    conda activate tensorflow 
    conda deactivate 
    
    安装额外的包
    conda install -n your_env_name [package]
    
    删除环境/包
    conda remove -n your_env_name(虚拟环境名称) --all
    conda remove --name your_env_name  package_name  # 删除环境中的某个包
    
    安装指定版本的python
    conda install python=3.6.5
    

5.1.4 常见问题解决

  1. 版本信息查询工具
    1. cuda版本查询命令

      nvcc -V

    2. tensorflow是否用gpu进行计算

      可以直接在任务管理器中查看cpu gpu使用量

      python
      import tensorflow as tf
      sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))       
      
      import tensorflow as tf
      a = tf.constant(1)
      b = tf.constant(1)
      c = a + b
      sess = tf.Session(config =tf.ConfigProto(log_device_placement = True))
      print(sess.run(c))
      
  2. 更换cuda版本及cudnn版本之后

    注意事项:

    1. 删除环境变量中的舍弃版本
    2. 重装tensorflow
  3. tensorflow==1.15安装命令

    cpu-gpu打包安装命令

    pip install --pre "tensorflow==1.15.*"
    
  4. pip install 安装package超时

    解决方案在前面设置超时时间

    pip --default-timeout=100 install gevent
    
  5. 通过setup.py安装模块

    解压文件 cmd切换到文件setup.py的目录下 先执行 python setup.py build 再执行python setup.py install

  6. 通过whl安装库

    pip install whl

  7. 更改python版本从3.7-3.6之后出现cv2无法import问题

    只需要在cv2的site-package文件夹中将cv2.cp37-winamd64 替换为cv2.cp36-winamd64即可

5.1.5 pytorch

  1. 安装方式

    从官网找命令,一定是pip来安装package,conda只用来创建虚拟环境!!!

  2. 安装环境

    一定要是python3.6.7

    vs2017 对应cuda 10.0

    vs2019 对应cuda 10.1

  3. 如何判断cuda工具包是否可用
    import torch
    torch.cuda.is_available()     
    
    TensorFlow是否用gpu进行计算
    import tensorflow as tf
    sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
    

5.1.6 Jupyter notebook

  1. EIN:在emacs中使用jupyter notebook
    1. onc for all
      1. 最常用的快捷键

        input cell之间移动 Crtl + 上下键控制 Mate + 上下键控制 上下移动当前cell C-c C-n ein:worksheet-goto-next-input C-c C-p ein:worksheet-goto-prev-input C-c <down> ein:worksheet-move-cell-down C-c <up> ein:worksheet-move-cell-up

        执行当前cell C-c C-c ein:worksheet-execute-cell M-RET ein:worksheet-execute-cell-and-goto-next <M-S-return> ein:worksheet-execute-cell-and-insert-below

        C-x C-s ein:notebook-save-notebook-command C-x C-w ein:notebook-rename-command

        历史记录 M-n ein:worksheet-next-input-history M-p ein:worksheet-previous-input-history

        插入cell C-c C-a ein:worksheet-insert-cell-above C-c C-b ein:worksheet-insert-cell-below

        打开文件 C-c C-f ein:file-open

        删除cell C-c C-k ein:worksheet-kill-cell

        清除输出cell C-c C-l ein:worksheet-clear-output

        复制粘贴cell C-c C-w ein:worksheet-copy-cell C-c C-y ein:worksheet-yank-cell

        打断kernel进程 C-c C-z ein:notebook-kernel-interupte-command

      2. .ipynb可以直接执行.py文件

        load foo.py 载入文件 run foo.py 运行文件

      3. .ipynb与.py文件的用法区别

        .ipynb用来写python文件,用于初始调试,最终成功以后可以导出为.py文件 .ipynb可以用来写测试代码,没有赋值的语句运行直接显示结果

      4. .ipynb如果引用.py文件,想要实时更新.py的修改内容,必须在ein中打开.py 此时connect to buffer
    2. 基本配置
      1. 在emacs中打开ein

        首次打开需要登录 M-x ein:notebooklist-login 需要先在浏览器中打开一个jupyter notebook 然后输入该网页的url

      2. 如何获取notebook的密码

        在cmd中输入 jupyter notebook list 来查询当前的url及密码,例如 http://localhost:8888/?token=b09b8e943762452bd443e04ce6814ac536316368b2a1b6ae token前面的是url 后面的即是密码,输入即可

      3. windows环境下重要配置python shell需要跟anaconda的路径匹配,否则无法使用ipython
        (setq python-shell-interpreter "d:/anaconda/python.exe"
              python-shell-interpreter-args
              "-i d:/anaconda/Scripts/ipython-script.py")     
        
      4. 如何安装EIN package
        1. 重点谈一下ein包
          1. ein unsigned需要在.spacemacs文件中添加package 用来调用jupyter notebook虚拟环境
          2. 配置两个变量 ein:jupyter-default-server-command ein:jupyter-default-notebook-directory
            ein:jupyter-default-server-command and set the value to the path you determined above.
            ein:jupyter-default-notebook-directory and set it to the path where you are keeping your jupyter notebooks.
            
          3. 使用方法
            1. 说明

              EIN提供的是一个在emacs中复现jupyter notebook的功能,即在emacs中打开 然后通过jupyter notebook打开文件,注意文件名:后面有jupyter的标识 然后即可通过C-c C-c来编译了

            2. jupyter notebook buffer的控制快捷键
              TAB widget-forward   widget是小部件
              C-M-i widget-backward
              <S-tab> widget-backward
              <backtab> widget-backward
              C-c C-r ein:notebooklist-reload
              Reload current Notebook list.
              
              g ein:notebooklist-reload
              Reload current Notebook list.
              
              p ein:notebooklist-prev-item
              n ein:notebooklist-next-item
              q bury-buffer     
              
            3. ein:中jupyter notebook命令集
              key             binding
              ---             -------
              
              C-c             Prefix Command
              C-x             Prefix Command
              ESC             Prefix Command
              .               ein:notebook-complete-dot
              C-:             ein:shared-output-eval-string
              <C-down>        ein:worksheet-goto-next-input
              <C-up>          ein:worksheet-goto-prev-input
              <M-S-return>    ein:worksheet-execute-cell-and-insert-below
              <M-down>        ein:worksheet-move-cell-down
              <M-up>          ein:worksheet-move-cell-up
              
              C-x C-s         ein:notebook-save-notebook-command
              C-x C-w         ein:notebook-rename-command
              
              M-RET           ein:worksheet-execute-cell-and-goto-next
              M-,             ein:pytools-jump-back-command
              M-.             ein:pytools-jump-to-source-command
              M-n             ein:worksheet-next-input-history
              M-p             ein:worksheet-previous-input-history
              
              C-c C-a         ein:worksheet-insert-cell-above
              C-c C-b         ein:worksheet-insert-cell-below
              C-c C-c         ein:worksheet-execute-cell
              C-c C-e         ein:worksheet-toggle-output
              C-c C-f         ein:pytools-request-tooltip-or-help
              C-c TAB         ein:completer-complete
              C-c C-k         ein:worksheet-kill-cell
              C-c C-l         ein:worksheet-clear-output
              C-c RET         ein:worksheet-merge-cell
              C-c C-n         ein:worksheet-goto-next-input
              C-c C-o         ein:console-open
              C-c C-p         ein:worksheet-goto-prev-input
              C-c C-q         ein:notebook-kill-kernel-then-close-command
              C-c C-r         ein:notebook-restart-kernel-command
              C-c C-s         ein:worksheet-split-cell-at-point
              C-c C-t         ein:worksheet-toggle-cell-type
              C-c C-u         ein:worksheet-change-cell-type
              C-c C-v         ein:worksheet-set-output-visibility-all
              C-c C-w         ein:worksheet-copy-cell
              C-c C-x         ein:tb-show
              C-c C-y         ein:worksheet-yank-cell
              C-c C-z         ein:notebook-kernel-interrupt-command
              C-c ESC         Prefix Command
              C-c !           ein:worksheet-rename-sheet
              C-c +           ein:notebook-worksheet-insert-next
              C-c -           ein:notebook-worksheet-delete
              C-c 1           ein:notebook-worksheet-open-1th
              C-c 2           ein:notebook-worksheet-open-2th
              C-c 3           ein:notebook-worksheet-open-3th
              C-c 4           ein:notebook-worksheet-open-4th
              C-c 5           ein:notebook-worksheet-open-5th
              C-c 6           ein:notebook-worksheet-open-6th
              C-c 7           ein:notebook-worksheet-open-7th
              C-c 8           ein:notebook-worksheet-open-8th
              C-c 9           ein:notebook-worksheet-open-last
              C-c {           ein:notebook-worksheet-open-prev-or-last
              C-c }           ein:notebook-worksheet-open-next-or-first
              C-c C-S-l       ein:worksheet-clear-all-output
              C-c C-#         ein:notebook-close
              C-c C-'         ein:worksheet-turn-on-autoexec
              C-c C-,         ein:pytools-jump-back-command
              C-c C-.         ein:pytools-jump-to-source-command
              C-c C-/         ein:notebook-scratchsheet-open
              C-c C-;         ein:shared-output-show-code-cell-at-point
              C-c <down>      ein:worksheet-move-cell-down
              C-c <up>        ein:worksheet-move-cell-up
              
              C-c M-+         ein:notebook-worksheet-insert-prev
              C-c M-w         ein:worksheet-copy-cell
              C-c M-{         ein:notebook-worksheet-move-prev
              C-c M-}         ein:notebook-worksheet-move-next
              
            4. 打开jupyter notebook的url http://localhost:8892/tree
            5. windows cmd简单命令打开jupyter的原理

              因为最初安装的时候只在anaconda里面装了jupyter,所以Windows的cmd并不能直接运行Jupyter

              cmd能直接运行python的原因是吧python的路径添加到了环境path

              所以同理,我们吧anaconda安装目录中包含有.exe执行文件 jupyter.exe所在的路径加入环境path即可在 Windows的cmd中直接输入jupyter notebook 打开浏览器中相关内容了

            6. 旧版本测试安装两个package
              1. elpy unsigned需要在.spacemacs文件中添加package 用来支持Python mode
              2. pyvenv unsigned需要在.spacemacs文件中添加package 用来调用jupyter notebook虚拟环境
              3. pyvenv package已经被证实不好用,用ein官方包代替
            7. .py文件的控制快捷键
              key             binding
              ---             -------
              
              C-c          Prefix Command
              C-x          Prefix Command
              ESC          Prefix Command
              C-:          ein:shared-output-eval-string
              <C-down>     ein:worksheet-goto-next-input
              <C-up>               ein:worksheet-goto-prev-input
              <M-S-return> ein:worksheet-execute-cell-and-insert-below
              <M-down>     ein:worksheet-move-cell-down
              <M-up>               ein:worksheet-move-cell-up
              
              C-x C-s              ein:notebook-save-notebook-command
              C-x C-w              ein:notebook-rename-command
              
              M-RET                ein:worksheet-execute-cell-and-goto-next
              M-,          ein:pytools-jump-back-command
              M-.          ein:pytools-jump-to-source-command
              M-n          ein:worksheet-next-input-history
              M-p          ein:worksheet-previous-input-history
              
              C-c C-a              ein:worksheet-insert-cell-above
              C-c C-b              ein:worksheet-insert-cell-below
              C-c C-c              ein:worksheet-execute-cell
              C-c C-e              ein:worksheet-toggle-output
              C-c C-f              ein:file-open
              C-c C-h              ein:pytools-request-tooltip-or-help
              C-c TAB              ein:completer-complete
              C-c C-k              ein:worksheet-kill-cell
              C-c C-l              ein:worksheet-clear-output
              C-c RET              ein:worksheet-merge-cell
              C-c C-n              ein:worksheet-goto-next-input
              C-c C-o              ein:notebook-open
              C-c C-p              ein:worksheet-goto-prev-input
              C-c C-q              ein:notebook-kill-kernel-then-close-command
              C-c C-r              ein:notebook-reconnect-session-command
              C-c C-s              ein:worksheet-split-cell-at-point
              C-c C-t              ein:worksheet-toggle-cell-type
              C-c C-u              ein:worksheet-change-cell-type
              C-c C-v              ein:worksheet-set-output-visibility-all
              C-c C-w              ein:worksheet-copy-cell
              C-c C-x              Prefix Command
              C-c C-y              ein:worksheet-yank-cell
              C-c C-z              ein:notebook-kernel-interrupt-command
              C-c ESC              Prefix Command
              C-c !                ein:worksheet-rename-sheet
              C-c '                ein:edit-cell-contents
              C-c +                ein:notebook-worksheet-insert-next
              C-c -                ein:notebook-worksheet-delete
              C-c 1                ein:notebook-worksheet-open-1th
              C-c 2                ein:notebook-worksheet-open-2th
              C-c 3                ein:notebook-worksheet-open-3th
              C-c 4                ein:notebook-worksheet-open-4th
              C-c 5                ein:notebook-worksheet-open-5th
              C-c 6                ein:notebook-worksheet-open-6th
              C-c 7                ein:notebook-worksheet-open-7th
              C-c 8                ein:notebook-worksheet-open-8th
              C-c 9                ein:notebook-worksheet-open-last
              C-c S                ein:worksheet-toggle-slide-type
              C-c i                ein:inspect-object
              C-c {                ein:notebook-worksheet-open-prev-or-last
              C-c }                ein:notebook-worksheet-open-next-or-first
              C-c C-S-l    ein:worksheet-clear-all-output
              C-c C-#              ein:notebook-close
              C-c C-$              ein:tb-show
              C-c C-'              ein:worksheet-turn-on-autoexec
              C-c C-,              ein:pytools-jump-back-command
              C-c C-.              ein:pytools-jump-to-source-command
              C-c C-/              ein:notebook-scratchsheet-open
              C-c C-;              ein:shared-output-show-code-cell-at-point
              C-c <down>   ein:worksheet-move-cell-down
              C-c <up>     ein:worksheet-move-cell-up
              
              C-c C-x C-l  ein:notebook-toggle-latex-fragment
              C-c C-x C-r  ein:notebook-restart-session-command
              
              C-c M-+              ein:notebook-worksheet-insert-prev
              C-c M-w              ein:worksheet-copy-cell
              C-c M-{              ein:notebook-worksheet-move-prev
              C-c M-}              ein:notebook-worksheet-move-next
              
            8. old version 无效命令
              1. emacs命令:
                M-x ein:notebook=login
                
              2. jupyter服务器密码设置

                网址:https://blog.csdn.net/clifnich/article/details/53912611

                from notebook.auth import passwd
                alt + enter 来执行这个命令并进入下一行;在下一行里面输入:
                passwd()
                
              3. 我的密码

                qaz111

  2. 浏览器版本jupyter使用方法
    1. 常用命令
      1. 快捷键汇总
        1. 命令模式 (按键 Esc 开启)
          Enter : 转入编辑模式
          Shift-Enter : 运行本单元,选中下个单元
          Ctrl-Enter : 运行本单元
          Alt-Enter : 运行本单元,在其下插入新单元
          Y : 单元转入代码状态
          M :单元转入markdown状态
          R : 单元转入raw状态
          1 : 设定 1 级标题
          2 : 设定 2 级标题
          3 : 设定 3 级标题
          4 : 设定 4 级标题
          5 : 设定 5 级标题
          6 : 设定 6 级标题
          Up : 选中上方单元
          K : 选中上方单元
          Down : 选中下方单元
          J : 选中下方单元
          Shift-K : 扩大选中上方单元
          Shift-J : 扩大选中下方单元
          A : 在上方插入新单元
          B : 在下方插入新单元
          X : 剪切选中的单元
          C : 复制选中的单元
          Shift-V : 粘贴到上方单元
          V : 粘贴到下方单元
          Z : 恢复删除的最后一个单元
          D,D : 删除选中的单元
          Shift-M : 合并选中的单元
          Ctrl-S : 文件存盘
          S : 文件存盘
          L : 转换行号
          O : 转换输出
          Shift-O : 转换输出滚动
          Esc : 关闭页面
          Q : 关闭页面
          H : 显示快捷键帮助
          I,I : 中断Notebook内核
          0,0 : 重启Notebook内核
          Shift : 忽略
          Shift-Space : 向上滚动
          Space : 向下滚动
          
        2. 编辑模式 ( Enter 键启动)
          Tab : 代码补全或缩进
          Shift-Tab : 提示
          Ctrl-] : 缩进
          Ctrl-[ : 解除缩进
          Ctrl-A : 全选
          Ctrl-Z : 复原
          Ctrl-Shift-Z : 再做
          Ctrl-Y : 再做
          Ctrl-Home : 跳到单元开头
          Ctrl-Up : 跳到单元开头
          Ctrl-End : 跳到单元末尾
          Ctrl-Down : 跳到单元末尾
          Ctrl-Left : 跳到左边一个字首
          Ctrl-Right : 跳到右边一个字首
          Ctrl-Backspace : 删除前面一个字
          Ctrl-Delete : 删除后面一个字
          Esc : 进入命令模式
          Ctrl-M : 进入命令模式
          Shift-Enter : 运行本单元,选中下一单元
          Ctrl-Enter : 运行本单元
          Alt-Enter : 运行本单元,在下面插入一单元
          Ctrl-Shift-- : 分割单元
          Ctrl-Shift-Subtract : 分割单元
          Ctrl-S : 文件存盘
          Shift : 忽略
          Up : 光标上移或转入上一单元
          Down :光标下移或转入下一单元
          
      2. 常用命令
              执行当前cell,并自动跳到下一个cell:Shift Enter
              执行当前cell,执行后不自动调转到下一个cell:Ctrl-Enter
              是当前的cell进入编辑模式:Enter
              退出当前cell的编辑模式:Esc
              删除当前的cell:双D
              为当前的cell加入line number:单L
              将当前的cell转化为具有一级标题的maskdown:单1
              将当前的cell转化为具有二级标题的maskdown:单2
              将当前的cell转化为具有三级标题的maskdown:单3
              为一行或者多行添加/取消注释:Crtl /
              撤销对某个cell的删除:z
              浏览器的各个Tab之间切换:Crtl PgUp和Crtl PgDn
              快速跳转到首个cell:Crtl Home
              快速跳转到最后一个cell:Crtl End
        
    2. 文件导入
      1. 如何将本地的.py文件load到jupyter的一个cell里面
        %load test.py #test.py是当前路径下的一个python文件
        
      2. 如何将网络中的.py文件load到jupyter的一个cell里面
               在cell中输入%load http://.....,然后运行该cell,就会将load后面所对应地址的代码load到当前的cell中;
        
      3. 利用cell运行.py文件
        %run file.py
        

5.1.7 必备操作集锦

  1. ubuntu查看cuda版本号和cudnn
    cuda
    cat /usr/local/cuda/version.txt
    
    cudnn
    cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
    
  2. pytorch 0.4.1 安装方法
    1. conda直接安装,网速可能较慢

      https://pytorch.org/get-started/previous-versions/

      Installing with CUDA 9
      
      conda install pytorch=0.4.1 cuda90 -c pytorch
      
      or
      
      conda install pytorch=0.4.1 cuda92 -c pytorch
      
      Installing with CUDA 8
      
      conda install pytorch=0.4.1 cuda80 -c pytorch
      
      Installing with CUDA 7.5
      
      conda install pytorch=0.4.1 cuda75 -c pytorch
      
      Installing without CUDA
      
      conda install pytorch=0.4.1 -c pytorch     
      
    2. 下载安装包,用pip安装
      pip conda速度很慢,并且无法用镜像解决 whl包安装 https://download.pytorch.org/whl/cu90/torch_stable.html
      pip install torch-0.4.1-cp37-cp37m-linux_x86_64.whl      
      
    3. torchvision版本匹配
      torch 0.4.0 == torchvision 0.2.0
      torch 0.4.1 == torchvision 0.2.1
      torch 1.1.0 == torchvision 0.3.0
      
    4. 如果pytorch版本较新,cuda版本较老,比如cuda 8.0

      处理方法:

      1. 先用低版本pytorch的正确安装方式安装cuda工具包和pytorch
      2. 将pytorch用pip install torch==1.1.0直接更新即可
    5. cudatoolkit一定要匹配
      标准方法,首先匹配cudatoolkit,之后用 pip install torch==1.5.0等方式更新torch版本即可
      conda install pytorch torchvision cudatoolkit=10.0 -c pytorch      
      
  3. 终极pytorch cuda版本解决方案
    1. 卸载所有pytorch
    pip uninstall pytorch
    conda uninstall pytorch
    
    2.确保nvcc cuda版本
    nvcc -V 
    
    确认当前torch下的cuda版本
    import torch
    torch.version.cuda
    
    cuda
    cat /usr/local/cuda/version.txt
    
    cudnn
    cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
    
    3. 安装pytorch
    # cuda100可根据需要修改
    conda install -c pytorch magma-cuda100 
    conda install pytorch torchvision cudatoolkit=10.0 -c pytorch
    
    4. 确认GPU可用
    import torch
    torch.cuda.is_available()  
    

5.2 EIN中的使用方法

5.2.1 打开浏览器的jupyter notebook

5.2.2 在emacs中用M-x ein:notebooklist-login登陆

如何获取notebook的密码 在cmd中输入 jupyter notebook list 来查询当前的url及密码,例如 http://localhost:8888/?token=b09b8e943762452bd443e04ce6814ac536316368b2a1b6ae token前面的是url 后面的即是密码,输入即可

5.2.3 EIN中的文件管理

TAB 小部件跳转
n 下一行
p 上一行
g 重载当前notebook list    

5.2.4 EIN:jupyter notebook编辑环境

  1. 窗口管理
    C-x b 打开当前所有的buffer
    M-m 1/2 左右窗口切换
    C-x 1   只显示当前窗口
    M-m Tab 切换最近的buffer
    
  2. .py文件载入
    %load test.py #test.py是当前路径下的一个python文件    
    
  3. 编辑环境:cell快捷键
    1. 文件保存
      C-x C-s         ein:notebook-save-notebook-command
      C-x C-w         ein:notebook-rename-command      
      
    2. Prefix command
      C-c             Prefix Command
      C-x             Prefix Command
      ESC             Prefix Command      ESC = M-n
      
    3. cell 插入与删除
      C-c C-a         ein:worksheet-insert-cell-above
      C-c C-b         ein:worksheet-insert-cell-below
      C-c C-k         ein:worksheet-kill-cell
      C-c C-l         ein:worksheet-clear-output      
      
    4. cell 跳转
      <C-down>        ein:worksheet-goto-next-input
      <C-up>          ein:worksheet-goto-prev-input      
      C-c C-n         ein:worksheet-goto-next-input
      C-c C-p         ein:worksheet-goto-prev-input
      
    5. cell 移动

      <M-down> ein:worksheet-move-cell-down <M-up> ein:worksheet-move-cell-up

    6. cell 执行
      C-c C-c         ein:worksheet-execute-cell
      M-RET           ein:worksheet-execute-cell-and-goto-next
      <M-S-return>    ein:worksheet-execute-cell-and-insert-below      
      M-,             ein:pytools-jump-back-command
      M-.             ein:pytools-jump-to-source-command
      M-n             ein:worksheet-next-input-history
      M-p             ein:worksheet-previous-input-history
      
    7. 历史记录:输入输出
      M-n          ein:worksheet-next-input-history
      M-p          ein:worksheet-previous-input-history
      
      C-c C-e              ein:worksheet-toggle-output      
      C-c C-v              ein:worksheet-set-output-visibility-all
      
    8. kernel中断
      C-c C-r       最好用,直接重连kernel
      C-c C-z         ein:notebook-kernel-interrupt-command
      C-c C-q         ein:notebook-kill-kernel-then-close-command
      C-c C-r         ein:notebook-restart-kernel-command      
      

5.3 jupyter notebook魔法技巧

5.3.1 魔法函数

前缀说明
%:	行魔法函数,只对本行代码生效。 
%%:	Cell魔法函数,在整个Cell中生效,必须放于Cell首行。

%pwd  显示当前的工作路径
%hist  显示当前Jupyter中,所有运行过的历史代码
%who  该魔法函数用于显示当前Jupyter环境中的所有变量或名称。
%reset 该魔法函数用于删除当前Jupyter环境中的所有变量或名称。
%load  该魔法函数用于加载本地Python文件或者网络中的Python文件,例如本地脚本文件的加载:%load xxx.py
%run  该魔法函数用于运行本地或网络中的Python文件,例如本地脚本文件的运行:%run xxx.py。    
%lsmagic 列出当前可用的 magic 函数
%ls?  魔法命令后面加上? 显示魔法命令的说明

5.3.2 spyder风格模仿

  1. 核心magic函数 所有变量查看

    %whos 查看所有变量名称及值 %who 查看所有变量名

  2. 单个变量打印

    把变量名称或没有定义输出结果的语句放在cell的最后一行,无需print语句,Jupyter也会显示变量值

    如果想不显示最后一行的输出结果,只需要在最后一行加上;即可

  3. 查看函数/方法的帮助

    ?func/class即可

5.3.3 创建新的.py文件并内容如下

%%writefile test_peace.py
import numpy as np
print(np.random.randint(1,5))    

5.3.4 画图

  1. plt.plot只能画2D图
    %matplotlib inline
    import matplotlib.pyplot as plt
    import numpy as np
    plt.plot()    
    
  2. plt.imshow可以画任何图形
    %matplotlib inline
    import matplotlib.pyplot as plt
    import numpy as np
    plt.plot()         
    
  3. 多个图像同时显示的方法
    1. 调试验证 画图

      用plot.subplot或者直接画两个图即可 最优的画图选择 示例代码

      plt.figure(figsize=(20,10))
      plt.imshow(image)
      plt.savefig(photo_dir+"/image_" + str(i))
      
      plt.figure(figsize=(20,10))
      plt.imshow(mask)      
      plt.savefig(photo_dir+"/image_" + str(i))
      
    2. subplot 优点,维度可扩展 写法复杂
      %matplotlib inline
      import matplotlib.pyplot as plt
      import numpy as np
      plt.subplot(1,2,1)
      plt.imshow(im)
      plt.subplot(1,2,2)
      plt.imshow(book)      
      plt.savefig(photo_dir+"/image_" + str(i))
      
    3. np.concatenate 固定axis,只能横向或者纵向扩展,优点在于写法简单
      vis = np.concatenate((im, book), 0) # axis 默认为0标识纵向排列 
      vis = np.concatenate((im, book), 1) # axis = 1 标识横向排列 
      cv2.imwrite('vis.jpg', vis)      
      
  4. cv2读取文件格式为BRG需要先转换为RBG之后才能正确显示

    代码为

    import cv2
    import numpy as np
    
    img = cv2.imread("1 (1).jpg")
    
    # BRG转换为RBG
    image = image[...,::-1]
    
    hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)#HSV空间
    

5.3.5 jupyter notebook实时调整参数输出结果

必须在浏览器版本的jupyter中可用,emacs版本中的EIN不行

  1. 函数调用

    详情见advanced-line-detection项目

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    from perspective_regionofint_main import *
    from thresholding_main import *
    from ipywidgets import interactive, interact, fixed
    
    #used in interactive thresholding operation
    writeup = 1
    #used in interactive thresholding operation
    verbose_threshold = 1
    
    img = cv2.imread("1 (9).jpg")
    imshape = img.shape
    img = img[...,::-1]
    
    hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)#HSV空间
    
    vertices = np.array([[(.55*imshape[1], 0.6*imshape[0]), (imshape[1],imshape[0]),
                          (0,imshape[0]),(.45*imshape[1], 0.6*imshape[0])]], dtype=np.int32)
    
    dst1 = region_of_interest(dst, vertices)
    
    #Threshold operation for debuggin only
    s_thl = 0
    s_thh = 50
    v_thl = 80
    v_thh = 110
    if writeup == 1:
        if verbose_threshold == 1:
            interact (thresholding_interative, img=fixed(img), adp_thr = (0,255), k_size = (1,31,2), grad_thx_min =(0,255), 
                      grad_thx_max =(0,255),
                      grad_thy_min =(0,255), grad_thy_max = (0,255), mag_th_min = (0,255),
                      mag_th_max = (0,255), dir_th_min  = (0,2,0.1), dir_th_max = (0,2,.1), 
                      s_threshold_min = (s_thl,s_thh), 
                      s_threshold_max = (s_thl,s_thh), v_threshold_min = (v_thl,v_thh), v_threshold_max = (v_thl,v_thh));    
    
  2. 需要调参的函数内容
    def thresholding_interative(img, grad_thx_min =211, grad_thx_max =255,grad_thy_min =0, grad_thy_max = 25, mag_th_min = 150,mag_th_max = 255, dir_th_min  = 0.7, dir_th_max = 1.3, s_threshold_min = 113, s_threshold_max = 255, v_threshold_min = 234, v_threshold_max = 255,  k_size = 15, adp_thr = 250):
        # Convert to HSV color space and separate the V channel
        imshape = img.shape
    
        #vertices = np.array([[(.65*imshape[1], 0.65*imshape[0]), (imshape[1],imshape[0]),
        #                    (0,imshape[0]),(.35*imshape[1], 0.65*imshape[0])]], dtype=np.int32)
        #img = region_of_interest(img, vertices)
        hls = cv2.cvtColor(img, cv2.COLOR_RGB2HLS).astype(np.float)
        s_channel = hls[:,:,2].astype(np.uint8)
        #l_channel = hls[:,:,1].astype(np.uint8)
        hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV).astype(np.float)
        v_channel = hls[:,:,2].astype(np.uint8)
        #threshold grad
        ksize = k_size # Choose a larger odd number to smooth gradient measurements
        gradx = abs_sobel_thresh(v_channel, orient='x', sobel_kernel=ksize, thresh=(grad_thx_min,grad_thx_max))
        grady = abs_sobel_thresh(v_channel, orient='y', sobel_kernel=ksize, thresh=(grad_thy_min, grad_thy_max))
        mag_binary = mag_thresh(v_channel, sobel_kernel=ksize, mag_thresh=(mag_th_min, mag_th_max))
        dir_binary = dir_threshold(v_channel, sobel_kernel=ksize, thresh=(dir_th_min, dir_th_max))
        combined = np.zeros_like(gradx)
        combined[((gradx == 1) & (grady == 1)) | ((mag_binary == 1) & (dir_binary == 1))] = 1
    
        # Threshold color channel
        s_binary = color_thr(s_channel, v_channel, s_threshold=(s_threshold_min,s_threshold_max), v_threshold= (v_threshold_min,v_threshold_max)).astype(np.uint8)
    
        gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY).astype(np.uint8)
        adp = adp_thresh_grayscale(gray, adp_thr)/255
        #plt.imshow(adp, cmap = 'gray')
        #plt.show()
        # Stack each channel
        # Note color_binary[:, :, 0] is all 0s, effectively an all black image. It might
        # be beneficial to replace this channel with something else.
        #color_binary = np.dstack(( np.zeros_like(s_binary),combined, s_binary))
        color_binary = np.zeros_like(gradx)
        color_binary[(combined == 1) | (s_binary == 1) | (adp == 1)] = 1
        color_binary = np.dstack(( color_binary,color_binary,color_binary)).astype(np.float32)
        vertices = np.array([[(.55*imshape[1], 0.6*imshape[0]), (imshape[1],imshape[0]),
                            (0,imshape[0]),(.45*imshape[1], 0.6*imshape[0])]], dtype=np.int32)
        color_binary = region_of_interest(color_binary.astype(np.uint8), vertices)
        plt.imshow(color_binary*255, cmap = "gray")
        #return color_binary.astype(np.float32), combined, s_binary     
    

5.3.6 module 自动重新加载

两行命令在开头执行一次即可
cell1: %load_ext autoreload
cell2: %autoreload 2    

5.4 emacs中测试.py文件

5.4.1 将.py中的代码导入ipython块中

%load test.py #test.py是当前路径下的一个python文件    

5.4.2 直接编辑测试.py文件

init.el中已经配置好了anaconda中的ipython core 直接C-c C-p即可打开ipython运行窗口

5.5 代码测试的基本流程

5.5.1 依托工具 jupyter notebook

5.5.2 流程 封装的最高级别是class类而不是def函数

  1. 在EIN中写代码
  2. 跑通之后封装
  3. 封装之后调用函数或者类
  4. 组合模块

5.6 帮助命令

type() 查询数据类型
dir() 查询一个类或者对象所有属性 更好用!            用来查看类中包含的所有函数
help() 查询模块、类型、对象、方法、属性的详细信息     详细查看函数的功能

5.7 异常处理——try语句

5.7.1 基本知识

try:
    <语句> #运行别的代码
except <名字>: 
    <语句> #如果在try部份引发了'name'异常
except <名字>,<数据>:
    <语句> #如果引发了'name'异常,获得附加的数据
else:
    <语句> #如果没有异常发生
try:
    <语句>
finally:
    <语句> #退出try时总会执行finally语句    

5.7.2 用法说明

当你想无论是否发生异常都确保执行某些代码时,try/finally是有用的。 try语句用来放可能会出错的代码,except语句保证即使try中语句出错,try结构体退出,后面的代码继续运行 finally语句则为依然报错,但是之前会执行finally中的语句

5.7.3 代码示例

a=10
b=0
try:
    c = b/ a
    print c
except (IOError ,ZeroDivisionError),x:
    print x
else:
    print "no error"
print "done"    

except Exception as e:
    print(e)

5.8 爬虫

5.8.1 最优网页路径选择

根据网址的命名规则

5.8.2 最优标签ID name 特征爬取选择

  1. html源码包含最科学最有效的数据框架
  2. 先考虑格式,再考虑命名规范,最后考虑正则表达式
  3. div[2] 表示第二个div标签 //*[@id="Profile-following"]/div[2]/div[1]/div/div/div[2]/h2/a

5.8.3 获取html信息:request库

  1. 获取string类型的html信息的python代码
    import requests
    url = "http://www.baidu.com"
    header = {
            'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
               }
    wb_data = requests.get(url, headers=header)
    wb_data.encoding = 'utf-8' # 编码方式设置为:utf-8
    wb_data = wb_data.text     # 获取string形式
    
  2. 获取response对象的语句
    requests.get(url, headers=header) # 这里返回的是一个response对象
    
  3. response对象的属性
    r.status_code http请求的返回状态,200成功,404失败
    r.text http响应的字符串形式
    r.encoding 从http header中猜测的响应内容编码方式
    r.content http响应内容的二进制形式     
    

5.8.4 使用python中的selenium库快速定位html中标签的位置

  1. 最快 浏览器检查功能

    在浏览器右键该元素,然后检查 右击复制xpath路径即可

  2. 浏览器检查功能 技巧

    同类标签,用[]来区分第几个

    核心技巧:用ID识别,之后区分第几个

    //*[@id="Profile-following"]/div[2]/div[1]/div/div/div[2]/h2/a
    div[2] 表示第二个div标签
    
  3. 用python code实现
    # This file is used to search between html 
    # quickly find the tags you need 
    
    import requests
    from lxml import etree
    
    url = "http://www.baidu.com"
    header = {
            'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
               }
    wb_data = requests.get(url, headers=header)
    wb_data.encoding = 'utf-8' # set encoding
    wb_data = wb_data.text     # get string html
    
    html = etree.HTML(wb_data)
    
    #html_data = html.xpath('//input[@type="submit"]')
    html_data = html.xpath('//input[@type="submit"]')
    print(html)
    
    for i in html_data:
        print(i.text) # 查询标签中的文本
    #    print(i.values()) # 查询标签中所有属性的值
        print(i.items())  # 查询标签所有内容    
    

5.8.5 Selenium知识体系

  1. 学习网站
  2. 官方文档
  3. 常用的模拟工具
          元素.click()这是模拟网页的某个控件的点击事件
          元素.clear() 清除元素的值
          元素.send_keys(username) 给元素赋值    
    
  4. 常用的查找元素的python命令
    find_element_by_name
    find_element_by_id
    find_element_by_xpath
    find_element_by_link_text
    find_element_by_partial_link_text
    find_element_by_tag_name
    find_element_by_class_name
    find_element_by_css_selector    
    
  5. selenium查找元素的方法
    1. 解析html
      from lxml import etree
      html = etree.HTML(wb_data)
      print(html)
      result = etree.tostring(html)
      print(result.decode("utf-8"))    
      

        从下面的结果来看,我们打印机html其实就是一个python对象,etree.tostring(html)则是不全里html的基本写法,补全了缺胳膊少腿的标签。

    2. 获取某标签的所有内容
      html = etree.HTML(wb_data)
      html_data = html.xpath('/html/body/div/ul/li/a')     # 写法一
      html_data = html.xpath('/html/body/div/ul/li/a/text()')  # 写法二
      
    3. 查找标签、属性、ID的方法
      html_data = html.xpath('/html/body/div/ul/li/a/@href')
      html_data = html.xpath('/html/body/div/ul/li/a[@href="link2.html"]/text()')     
      
       [@]表示标签下面的属性 绝对路径方法
      //a/@herf 表示标签下的属性  相对路径方法
       test() 表示标签里面的内容     
       / 表示绝对路径,从根开始查找
       // 表示相对路径,查找所有符合条件的标签
       [last()-1]跟在标签后面,表示查找的是倒数第二个标签 例如:html_data = html.xpath('//li[last()-1]/a/text()')
       //*[@id="kw"]  解释:使用相对路径查找所有的标签,属性id等于kw的标签
      //div/li[text()="{}"] 解释:查找特定内容的标签
      //div[2] 表示查找第二个div标签 如果有多个非嵌套的div存在,一定要注明你查找的是第几个,否则会有多个返回值
      contains 表示包含 
      //a[contains(@href, 'logout')] 查找href属性中包含有logout的所有的a标签 
      //*[contains(text(), '退出' 
      starts-with 开头 ends-with 结尾
      //a[starts-with(@class, 'a')]
      driver.find_element_by_xpath("//a").get_attribute("href") 获取标签的属性
      重要: contains start-with只能爬取第一个出现的标签 如果想要全部标签,最好用绝对路径重复例如
      #//*[@id="ContentPlaceHolder1_gvNewsList"]/tbody/tr[1]/td[1] tr重复排列列表
      那么#//*[@id="ContentPlaceHolder1_gvNewsList"]/tbody/tr 即可
      以上全是扯淡 差别就在于一个是element 一个是elements
      
  6. 模拟基本操作
    driver.maximize_window() #窗口最大化
    driver.find_element_by_xpath().click()   xpath中的标签是button 模拟单击
    driver.find_element_by_xpath().send_keys(password)   xpath中的标签是input 填入数据
    driver.quit() 退出浏览器
    time.sleep(5) # 睡眠5秒 免得被识别为爬虫
    driver.implicitly_wait(10)    #让程序休眠10秒,在这期间,弹出登录界面之后,你就可以使用你的手机扫码登录淘宝了
    driver.forward()  #前进
    driver.back()     # 后退
    clear() 清除文本,如果是一个文件输入框
    send_keys(*value) 在元素上模拟按键输入
    click() 单击元素
    
  7. ActionChains 类提供的鼠标操作的常用方法
    1. 鼠标操作
      1. 命令
        perform() 执行所有ActionChains 中存储的行为
        click_and_hold(element)左键点击
        context_click(elem) 右击
        double_click(elem) 双击
        drag_and_drop(source,target) 拖动
        move_to_element(elem) 鼠标悬停     
        
      2. 代码示例
        from selenium import webdriver
        #引入ActionChains 类
        from selenium.webdriver.common.action_chains import ActionChains
        driver = webdriver.Firefox()
        driver.get("http://yunpan.360.cn")
        #定位到要右击的元素
        right_click =driver.find_element_by_id("xx")
        #对定位到的元素执行鼠标右键操作
        ActionChains(driver).context_click(right_click).perform()      
        
      3. 代码说明

        from selenium.webdriver import ActionChains 对于ActionChains 类下面的方法,在使用之前需要先将模块导入。 ActionChains(driver) 调用ActionChains()方法,在使用将浏览器驱动driver 作为参数传入。 contextclick(rightclick) contextclick()方法用于模拟鼠标右键事件,在调用时需要传入右键的元素。 perform() 执行所有ActionChains 中存储的行为,可以理解成是对整个操作事件的提交动作。

    2. 鼠标悬浮操作:
      1. 解决方案一:获取当前焦点元素 有效
        driver.switch_to.active_element.find_element_by_xpath('//*[@id="Popover%s-content"]/div/div/div[3]/div[2]/button'%str).click()       
        
      2. 解决方案二:需要多线程处理并发threading 部分有效
        ActionChains(driver).move_to_element(driver.find_element_by_link_text("设置")).perform()
        Tread.sleep(2)
        driver.find_element_by_link_text("高级搜索").click()
        
      3. 解决方案三:连贯的鼠标操作 待检验
        1. # ActionChains can be used in a chain pattern:链式写法
          menu = driver.find_element_by_css_selector(".nav")
          hidden_submenu = driver.find_element_by_css_selector(".nav #submenu1")
          
        2. # Or actions can be queued up one by one, then performed.:分步写法
          menu = driver.find_element_by_css_selector(".nav")
          hidden_submenu = driver.find_element_by_css_selector(".nav #submenu1")
          
          actions = ActionChains(driver)
          actions.move_to_element(menu)
          actions.click(hidden_submenu)
          actions.perform()
          
    3. 键盘操作
      1. 键盘操作命令

        sendkeys(Keys.BACKSPACE) 删除键(BackSpace) sendkeys(Keys.SPACE) 空格键(Space) sendkeys(Keys.TAB) 制表键(Tab) sendkeys(Keys.ESCAPE) 回退键(Esc) sendkeys(Keys.ENTER) 回车键(Enter) sendkeys(Keys.CONTROL,'a') 全选(Ctrl+A) sendkeys(Keys.CONTROL,'c') 复制(Ctrl+C) sendkeys(Keys.CONTROL,'x') 剪切(Ctrl+X) sendkeys(Keys.CONTROL,'v') 粘贴(Ctrl+V) sendkeys(Keys.F1) 键盘F1 sendkeys(Keys.F12) 键盘F12

      2. 代码示例
        #coding=utf-8
        from selenium import webdriver
        #引入Keys 模块
        from selenium.webdriver.common.keys import Keys
        driver = webdriver.Firefox()
        driver.get("http://www.baidu.com")
        #输入框输入内容
        driver.find_element_by_id("kw").send_keys("seleniumm")
        #删除多输入的一个m
        driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
        #输入空格键+“教程”
        driver.find_element_by_id("kw").send_keys(Keys.SPACE)
        driver.find_element_by_id("kw").send_keys(u"教程")
        #ctrl+a 全选输入框内容
        driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
        #ctrl+x 剪切输入框内容
        driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
        #ctrl+v 粘贴内容到输入框
        driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'v')
        #通过回车键盘来代替点击操作
        driver.find_element_by_id("su").send_keys(Keys.ENTER)
        driver.quit()
        
    4. 通用的元素查找

      nav=driver.findElement(By.xpath("/html/body/div[1]/div/div[1]/div[2]/div/ul/li/a/span")) nav=driver.findElement(By.id("/html/body/div[1]/div/div[1]/div[2]/div/ul/li/a/span")) driver.findelementbyid() driver.findElement(By.id())

    5. 显示等待、隐式等待、多表单嵌套、多窗口切换
  8. 关闭并切换标签
    1. 关闭标签页

      ActionChains(browser).keydown(Keys.CONTROL).sendkeys("w").keyup(Keys.CONTROL).perform()

    2. 关闭当前标签页(从标签页A打开新的标签页B,关闭标签页A)

      driver.close()

  9. 显示等待:某条件达成之后继续进行
    1. 代码示例:
      from selenium import webdriver
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
      
      driver = webdriver.Firefox()
      driver.get("http://somedomain/url_that_delays_loading")
      try:
        element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "myDynamicElement")))
      finally:
        driver.quit()
      
    2. 使用说明

      代码很清晰了,需要跟try结合一起用比较好 善用异常处理和显示等待,可以极大的提高代码运行的效率

  10. 快速获取某标签出现的个数

    很简单,直接用len()函数计算即可 print(len(driver.findelementsbyxpath('//div[@tabindex="0"]')))

  11. 所有你想要的,这里都有
    # 知乎 关注的专栏
    from selenium import webdriver
    import time
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.common.action_chains import ActionChains
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    def list_all(no_err_num, listnum):
        # get link and text
        link = driver.find_element_by_xpath('//*[@id="Profile-following"]/div[2]/div[%s]/div/div/div[2]/h2/a'%listnum).get_attribute('href')
        name = driver.find_element_by_xpath('//*[@id="Profile-following"]/div[2]/div[%s]/div/div/div[2]/h2/a'%listnum).text
    
        # click 
        driver.get(link)
    
        # web wait until get botton
        try:
            ele = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.XPATH, '//*[@id="root"]/div/main/div/header/div/div[2]/button[1]')))
        except Exception as f:
    #            print(f)
            print('超时错误:找不到关注专栏对应的元素')
        else:
            # check if this wenti is followed 
            check_str = driver.find_element_by_xpath('//*[@id="root"]/div/main/div/header/div/div[2]/button[1]').text
            if check_str == '关注专栏':
                # click this botton
                print('当前状态:未关注     执行:单击关注专栏')
                driver.find_element_by_xpath('//*[@id="root"]/div/main/div/header/div/div[2]/button[1]').click()      
                time.sleep(1)
            else:
                print('当前状态:已关注     不执行任何操作')
    
        # debug code 
        debug_check_str = driver.find_element_by_xpath('//*[@id="root"]/div/main/div/header/div/div[2]/button[1]').text
        if debug_check_str == '关注专栏':
            print('错误!!!!!专栏仍未被关注')
        else:
             no_err_num += 1
             print('成功关注此专栏: ',name)
    
        return no_err_num
    
    chrome_options = Options()
    chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
    chrome_driver = "D:\chrome_driver\chromedriver.exe"
    driver = webdriver.Chrome(chrome_driver, chrome_options=chrome_options)
    print(driver.title)
    
    print('Successfully logged in')
    
    num = 0
    page = 2  
    no_err_num = 0 
    #for i in range(1,12):
    for i in range(1, page+1):
        driver.get('https://www.zhihu.com/people/yang-yi-xin-12-38/following/columns?page=%s' %i)
        add = len(driver.find_elements_by_xpath('//div[@tabindex="0"]'))
        for j in range(1,add + 1):
            driver.get('https://www.zhihu.com/people/yang-yi-xin-12-38/following/columns?page=%s' %i)
            # add is the number of lists
            time.sleep(1)
            no_err_num = list_all(no_err_num,j)
    
            str += 1
            num = num + 1
            print('No error number: ', no_err_num)
            print('Total solving number: ', num)
    

5.9

5.9.1 threading

  1. 命令
    import threading 
    mthread = threading.Thread(target=function_name, args=(function_parameter1, function_parameterN,)) #传入参数为元组,要在末尾加逗号
    mthread.start() # 启动刚刚创建的线程 
    threading.activeCount()  #返回当前thread的个数
    threading.enumerate()    #此方法返回当前运行中的Thread对象列表     
    time.sleep(2) # 主线程不会等子线程,要么延长主线程,要么t.join()使主线程等待子线程
    t.join 必须放到.start的循环体的外面,必须先启动线程之后,才能判断线程是否结束,主线程等待子线程结束
    
  2. 简单的计数器代码
    import threading 
    import time
    
    def worker():
        print ("worker")
        time.sleep(1)
        return
    
    for i in range(5):
        t = threading.Thread(target=worker)
        t.start()
    for i in range(5):
        t.join()
    print(threading.activeCount())     
    

5.9.2 pandas数据处理库

5.10 python环境迁移/虚拟环境创建 conda创建环境 pip安装packages

5.10.1 打包所有已安装的package

pip freeze                   //查看所有已安装的package
pip freeze > packages.txt    //把所有已安装的包放入.txt文件
pip install -r packages.txt  //批量安装package

5.10.2 虚拟环境建立 conda

conda create -n my_env python=3.6
conda activate  my_env
conda deactivate my_env    
conda env remove -n test_env 
conda info -e
conda remove -n rcnn

5.10.3 conda设置国内服务器镜像

# 查看源:
conda config --show-sources

# 添加Anaconda的TUNA镜像
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
# TUNA的help中镜像地址加有引号,需要去掉

# 设置搜索时显示通道地址
conda config --set show_channel_urls yes    

5.10.4 虚拟环境建立 pip

安装特定版本
pip install django==1.1.5   #=在python中代表赋值的作用,只有==才是等于的意思    

导出python环境
pip freeze > requestment.txt #可以获取到当前环境下的所有安装包的版本,有助于以后布置别台电脑,可以避免bug,从而导入跟现在一样的环境。

从导出的python环境中安装所需要的包
pip install –r requestment.txt

卸载导出的python环境中的包
pip uinstall –r requestment.txt

5.10.5 pip设置国内服务器镜像

  1. windows系统
    1. 单次安装package
      更换国内pypi镜像(推荐临时使用这些源)
      pip install <包名> -i http://pypi.v2ex.com/simple 
      阿里:https://mirrors.aliyun.com/pypi/simple 
      豆瓣:http://pypi.douban.com/simple 
      中国科学技术大学:http://pypi.mirrors.ustc.edu.cn/simple/     
      
    2. 设置全局镜像
      指定全局安装源 (不想每一次加 -i)
      在linux和macos,配置文件为:$HOME/.pip/pip.conf 
      
      在windows上,配置文件为:%HOME%\pip\pip.ini
      
      (1):在windows文件管理器中,输入 %APPDATA%
      
      (2):会定位到一个新的目录下,在该目录下新建pip文件夹,然后到pip文件夹里面去新建个pip.ini文件
      
      (3):在新建的pip.ini文件中输入以下内容,搞定文件路径:"C:\Users\Administrator\AppData\Roaming\pip\pip.ini"
      
      [global] 
      
      timeout = 6000 
      
      index-url = https://pypi.tuna.tsinghua.edu.cn/simple
      
  2. linux系统
    1. 设置全局镜像
       指定全局安装源 (不想每一次加 -i)
       在linux和macos,配置文件为:$HOME/.pip/pip.conf 
      
       在linux上,配置文件为:~/.pip/pip.conf
      
      1. 创建文件夹.pip 和 pip.conf文件
      mkdir ~/.pip/
      emacs ~/.pip/pip.conf
      
      2. 在创建的文件夹键入一下内容
      [global]
      
      index-url = https://pypi.tuna.tsinghua.edu.cn/simple
      trusted-host = pypi.tuna.tsinghua.edu.cn
      
      timeout = 6000
      

5.10.6 常见问题 setup egginfo

解决方案

pip install --upgrade  pip --user
pip install setuptools

5.11 基线模型

5.11.1 语法

  1. from model import *

    *表示导入了模块的整个类,可以直接使用类,不需要句点表示法,不推荐使用,容易引发难以发现的问题

    import numpy
    a = numpy.array([1,1])
    
    from numpy import * 
    a=array([1,1])     
    
  2. tf.app.flags

    支持接收命令行传递参数,相当于接受argv

    代码实例中,–strname表示flag的名字,后面紧跟为flag的值

    [root@AliHPC-G41-211 test]# python tt.py
    def_v_1
    10
    False
    [root@AliHPC-G41-211 test]# python tt.py --str_name test_str --int_name 99 --bool_name True
    test_str
    99
    True
    
  3. 全局变量的设置
    1. 声明法
            ‘global 变量名’,一旦运行过声明语句了,以后遇到这个名字的变量,就都认为是全局变量了      
      
    2. 模块化
      #gl.py  全局变量模块定义
      
      GL_A=‘hello’
      
      GL_B=’world’
      
      #test.py 全局变量引用模块
      
      import gl
      
      def hello_world()
          print(gl. GL_A, gl. GL_B)
      
      hello_world()
      a = gl. GL_A
      
  4. tf.contrib.slim.argscope
    1. 说明

      slim.argscope常用于为tensorflow里的layer函数提供默认值以使构建模型的代码更加紧凑苗条(slim):

      并不是所有的方法都能用argscope设置默认参数, 只有用@slim.addargscope修饰过的方法才能使用argscope

    2. 使用步骤
      1. 使用@slim.addargscope修饰目标函数
      2. 用with slim.argscope()为目标函数设置默认参数.
      3. with slim.argscope([fun1],a=10): fun1为需要设置默认参数的目标函数,a = 10为设置的参数
    3. 代码示例
      import tensorflow as tf
      slim = tf.contrib.slim
      with slim.arg_scope(
              [layers.conv2d], 
              padding='SAME',         
              initializer= xavier_initializer(),
              regularizer= l2_regularizer(0.05)):  
          net = slim.conv2d(net, 256, [5, 5])
      
      @slim.add_arg_scope
      def fn(a, b, c=3):
          d = c + b
          print("a={}, b={}".format(a, b))
          return d
      
      with slim.arg_scope([fn], a = 1):
          fn(b = 2) 
      
  5. tf.train.saver/tf.train.supervisor
    1. tf.train.supervisor完全可以替代tf.train.saver的功能
            从上面代码可以看出,Supervisor帮助我们处理一些事情
            (1)自动去checkpoint加载数据或初始化数据
            (2)自身有一个Saver,可以用来保存checkpoint
            (3)有一个summary_computed用来保存Summary
            所以,我们就不需要:
            (1)手动初始化或从checkpoint中加载数据
            (2)不需要创建Saver,使用sv内部的就可以
            (3)不需要创建summary writer      
      
    2. 常规用法,用tf.train.saver()保存,并restore显示载入模型
       # Before starting, initialize the variables.  We will 'run' this first.
       saver = tf.train.Saver()
       init = tf.global_variables_initializer()     
      
      # Launch the graph.
      sess = tf.Session()
      sess.run(init)
      
      if len(os.listdir(log_path)) != 0:  # 已经有模型直接读取
          saver.restore(sess, os.path.join(log_path, log_name))
      for step in range(201):
          sess.run(train)
          if step % 20 == 0:
              print(step, sess.run(W), sess.run(b))
      saver.save(sess, os.path.join(log_path, log_name))
      
    3. tf.train.supervisor

      如果模型已经存在,就先读取模型接着训练.tf.train.Supervisor可以简化这个步骤

      import tensorflow as tf
      import numpy as np
      import os
      log_path = r"D:\Source\model\supervisor"
      log_name = "linear.ckpt"
      x_data = np.random.rand(100).astype(np.float32)
      y_data = x_data * 0.1 + 0.3
      
      W = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
      b = tf.Variable(tf.zeros([1]))
      y = W * x_data + b
      
      loss = tf.reduce_mean(tf.square(y - y_data))
      optimizer = tf.train.GradientDescentOptimizer(0.5)
      train = optimizer.minimize(loss)
      
      saver = tf.train.Saver()
      init = tf.global_variables_initializer()
      
      sv = tf.train.Supervisor(logdir=log_path, init_op=init)  # logdir用来保存checkpoint和summary
      saver = sv.saver  # 创建saver
      with sv.managed_session() as sess:  # 会自动去logdir中去找checkpoint,如果没有的话,自动执行初始化
          for i in range(201):
              sess.run(train)
              if i % 20 == 0:
                  print(i, sess.run(W), sess.run(b))
          saver.save(sess, os.path.join(log_path, log_name))
      
  6. slim.learning.createtrainop()
    1. 说明

      用来确保计算totallosses的时候,更新了updateops are done and the gradient updates are computed

    2. 使用方法:优先选择第二种方法
             train_op = slim.learning.create_train_op(total_loss, optimizer)      
      
      第一种方法:
      # Actually runs training.
        slim.learning.train(train_op, train_log_dir)
      
      第二种方法:sess.run
      total_loss, global_step_count, accuracy_val, mean_IOU_val, _ = sess.run([train_op, global_step, accuracy, mean_IOU, metrics_op])
      
  7. argparse 命令行输入工具
    import argparse
    parser = argparse.ArgumentParser(description='GSCNN')
    parser.add_argument("echo",help="echo the string")
    parser.add_argument('--rescale', type=float, default=1.0,
                        help='Rescaled LR Rate')
    
    #获取参数
    args = parser.parse_args()
    #定位参数
    args.echo
    args.rescale
    
    # 命令行使用
    python model_lgb.py --type 开飞机 --Tag 1
    
    # --rescale 是可选参数 echo 是定位参数必选
    

5.12 Docker部署

5.12.1 准备工作

  1. requirements.txt

    通过pip freeze 生成

    pip freeze > requirements.txt
    
  2. Dockerfile
    #基于的基础镜像
    FROM python:3.7
    
    #代码添加到code文件夹
    ADD ./EF_NFCS /code
    
    # 设置code文件夹是工作目录
    WORKDIR /code
    
    # 安装支持
    RUN pip install -r requirements.txt     
    

5.13 pytorch

5.13.1 神经网络基本结构

  1. 张量维度计算 & nn.Conv2D
    默认参数:
    torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)
    
    张量维度:
    x = [batch_size, channels, height, width]                   [2, 1, 7, 3]
    Conv2D = [channels, output, kernal_height, kernal_width]    [1, 8, 2, 3]
    res = [batch_size, output, output_height, output_width]     [2, 8, 6, 1]
    output_height = height - kernal_height + 1 + 2*padding = 7 - 2 + 1 + 2*0 = 6
    output_width = width - kernal_width + 1 + 2*padding = 3 - 3 + 1 + 2*0 = 1
    计算公式
    W2=(W1-F+2*P)/S+1,W1是卷积前的图像大小,W2为卷积后,F为卷积核大小,P为填充,S为步长 其中 向下取整
    
    计算示例:
    x = inputs=torch.Tensor([[[[1,2,3],          # [1, 1, 3, ,3]
              [4,5,6],
              [7,8,9]]]])
    conv1=nn.Conv2d(1,2,kernel_size=3,padding=1)
    conv2=nn.Conv2d(1,2,kernel_size=3)
    
    x = [1, 1, 3, 3]
    output1 = [1, 2, 3, 3]
    output2 = [1, 2, 1, 1]
    
    代码示例:
    import torch
    
    x = torch.randn(2,1,7,3)
    conv = torch.nn.Conv2d(1,8,(2,3))
    res = conv(x)
    
    print(res.shape)    # shape = (2, 8, 6, 1)    
    
  2. 其他常用函数
    上采样:
    torch.nn.PixleShuffle(upscale_factor)     
    

5.14 必备操作集锦

5.14.1 正则表达式

  1. 规则描述详见

    1.4.18 第三条


  2. import re

  3. 函数

    re.match 说明:从字符串的第一个位置开始匹配,匹配到返回,m =re.match("正则表达式",字符串)) re.search 说明:在整个字符串中匹配到第一个正则后返回数据,返回一个正则表达是对象(object) re.findall 说明:返回字符串中满足正则表达式的所有字符串。返回结果是一个列表[] re.compile 说明:将经常使用的正则表达式编译成一个正则表达式对象,使用更方便 re.sub 说明:将匹配到正则的所有字符串替换为另一个字符串,返回结果是一个字符串 re.split 说明:按照正则进行分割,返回一个列表(列表内容不包含分隔符) re.S 说明:是一个参数,多行匹配。如果不用re.S则在单行中进行匹配,如果用了re.S则在整体中进行字符匹配 re.M 说明:是一个参数,^$标志将会匹配每一行。默认情况下是只匹配符合正则的第一行和最后一行

  4. python中用法说明
    1. re.sub
      re.sub(pattern, repl, string, count=0, flags=0)
      
      a = re.sub(r‘hello‘, ‘i love the‘, ‘hello world‘)     
      
    2. re.split
             re.split(pattern, string, maxsplit=0)
      
            通过正则表达式将字符串分离。如果用括号将正则表达式括起来,那么匹配的字符串也会被列入到list中返回。maxsplit是分离的次数,maxsplit=1分离一次,默认为0,不限制次数。      
      
    3. re.findall
      a = re.findall(pattern, string, flags=0)
      

5.14.2 文件夹-字符串合并、替换、分割、查找

  1. 合并字符串
    1. 直接相加
    2. 用join命令
    parts = ['Is', 'Chicago', 'Not', 'Chicago?']
    ''.join(parts)
    
  2. 替换字符串

    返回字符串中的 old(旧字符串) 替换成 new(新字符串)后生成的新字符串,如果指定第三个参数max,则替换不超过 max 次。

    str = "this is string example....wow!!! this is really string";
    print str.replace("is", "was");
    print str.replace("is", "was", 3);
    
    注意事项:
    str.replace()为浅复制,如果想使用赋值后的值,需要
    str2 = str.replace()
    或者
    return str.replace()
    
  3. 分割字符串
    只显示文件名,不包含上级路径
    name_images_in = img.split('\\')[1]      
    name = img.split('-')
    
    将文件名替换为
    des_file = fname.replace('images', r'images\0')
    # print(des_file)
    copyfile(fname, des_file)
    
  4. 查找字符串
    正则表达式精准识别所需要的字符
    import re
    
    m = re.findall('[(](.*?)[)]', img)
    '[(](.*?)[)]' 表示()内部的所有元素     
    

5.14.3 文件名按名称进行排序(list + numpy)方法

list版本:核心函数 sorted, 使用key参数 numpy版本可以又list转换而来

  1. 示例一
    i表示传入参数 :后面表示以某种形式进行排序
    
    i = [['社旗9场生长场', '8', '保育', '2', '10', '00', 'jpg'],
    ''.join([i[4], i[5]]  表示组合 [10], [00]为[1000], 即以[1000]作为排序标准
    
    result = sorted(tem, key=lambda i:int(''.join([i[4], i[5]])))    
    
  2. 示例二
    list01=[[‘1’, 508], [‘1’, 281], [‘7’, 429], [‘9’, 696], [‘9’, 576], [‘g’, 79], [‘f’, 314]]
    out_data = sorted(list01, key = lambda x:x[1])     
    
  3. numpy方法
    import numpy as np
    data = np.array([[1,2],[5,3],[4,6],[7,5],[9,0]])
    data = data[np.argsort(data[:,0])] # 表示按照第一列排序
    print(data)     
    

5.14.4 list与string互转 list与numpy互转

  1. list转string
    list1 = ['1', '2', '3']
    str1 = ''.join(list1)
    
    list1 = [1, 2, 3]
    str1 = ''.join(str(e) for e in list1)
    
  2. list与numpy互转
    List转numpy.array:
    temp = np.array(list) 
    
    numpy.array转List:
    arr = temp.tolist()      
    

5.14.5 获取html内容的python写法

import requests
from lxml import etree 

url = "https://www.cnblogs.com/mvc/blog/news.aspx?blogApp=yoyoketang"
header = {
        'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36'
           }
html = requests.get(url, headers=header).text    

5.14.6 为python模拟浏览器登陆添加header

  1. 目标格式
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36'}     
    
  2. 获取当前浏览器header步骤
    1. 打开任意浏览器某一页面(要联网),按f12,然后点network,之后再按f5,然后就会看到“name”这里,我们点击name里面的任意文件即可。
    2. 之后右边有一个headers,点击headers找到request headers,这个就是浏览器的请求报头了。
    3. 然后复制其中的user-agent,其他的cookie还有Accept可以要也可以不要,主要是伪装成浏览器,所以我就用了user-agent

5.14.7 快速获取某元素xpath的方法

在浏览器右键该元素,然后检查 右击复制xpath路径即可

5.14.8 接管已打开的浏览器方法:解决反爬虫

  1. 学习网址
  2. 步骤:
    1. 将chrome添加到环境变量,路径为:

    C:\Program Files (x86)\Google\Chrome\Application

    1. cmd运行命令,远程控制:

    chrome.exe –remote-debugging-port=9222 –user-data-dir="D:\selenum\AutomationProfile"

    1. 修改python代码:
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    chrome_options = Options()
    chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
    chrome_driver = "D:\chrome_driver\chromedriver.exe"
    driver = webdriver.Chrome(chrome_driver, chrome_options=chrome_options)
    print(driver.title)
    
    1. driver.maximizewindow()这个方法貌似不能用
  3. 删除掉用来识别webdriver的特征值:解决反爬虫
    1. 安装

      mitmproxy电脑版 python mitmproxy库 VS C++ 14

    2. 通过浏览器控制台console/network分析发爬虫js
      1. 查看当前浏览器启动驱动程序

        在浏览器控制台的console中输入:navigator.webdriver

      2. 查找发爬虫js

        在浏览器控制台network选项卡界面下,查找403的名称

5.14.9 python中的模型保存与转换

  1. ckpt模型的保存

    https://www.cnblogs.com/zerotoinfinity/p/10242849.html checkpoint是检查点的文件,文件保存了一个目录下所有的模型文件列表

    model.ckpt.meta文件保存了Tensorflow计算图结构,可以理解为神经网络的网络结构,

    ckpt.data是保存模型中每个变量的取值

    model.ckpt.index保存了所有变量名

  2. ckpt转换为pb 已测试可用
    1. 模型数据说明

      https://blog.csdn.net/guyuealian/article/details/82218092

      通过传入 CKPT 模型的路径得到模型的图和变量数据 通过 importmetagraph 导入模型中的图 通过 saver.restore 从模型中恢复图中各个变量的数据 通过 graphutil.convertvariablestoconstants 将模型持久化 原文链接:https://blog.csdn.net/guyuealian/article/details/82218092

      tf.train.Saver()保存模型,然后得到多个文件,一般长这个样子

      1. DATA
      2. META
      3. INDEX
      4. checkpoint文件
    2. 最后一层结点名字

      input:0”是张量的名称,而"input"表示的是节点的名称。

      PS:注意节点名称,应包含namescope 和 variablescope命名空间,并用“/”隔开,如"InceptionV3/Logits/SpatialSqueeze"

    3. 示例代码
      import tensorflow as tf
      from tensorflow.python.framework import graph_util
      '''
      :param input_checkpoint:
      :param output_graph: PB模型保存路径
      :return:
      '''
      # 指定输出的节点名称,该节点名称必须是原模型中存在的节点
      # 直接用最后输出的节点,可以在tensorboard中查找到,tensorboard只能在linux中使用
      input_checkpoint = './ckpt'
      input_meta_graph = './ckpt/model.ckpt-0.meta'
      output_node_names = "total_loss"
      output_graph = './pb_model/model.pb'
      
      saver = tf.train.import_meta_graph(input_meta_graph)
      # saver = tf.train.import_meta_graph(input_checkpoint + '.meta', clear_devices=True)
      graph = tf.get_default_graph() # 获得默认的图
      input_graph_def = graph.as_graph_def()  # 返回一个序列化的图代表当前的图
      
      with tf.Session() as sess:
          saver.restore(sess, tf.train.latest_checkpoint(input_checkpoint)) #恢复图并得到数据
          output_graph_def = graph_util.convert_variables_to_constants(  # 模型持久化,将变量值固定
              sess=sess,
              input_graph_def=input_graph_def,# 等于:sess.graph_def
              output_node_names=output_node_names.split(","))# 如果有多个输出节点,以逗号隔开
      
          with tf.gfile.GFile(output_graph, "wb") as f: #保存模型
              f.write(output_graph_def.SerializeToString()) #序列化输出
          print("%d ops in the final graph." % len(output_graph_def.node)) #得到当前图有几个操作节点
      
  3. pb模型的保存于导入

5.14.10 Tensorboard保存与查看

  1. 将模型保存

    https://www.cnblogs.com/hejunlin1992/p/7840864.html Enet模型中有详细的tensorboard保存方法

    关键函数为tf.summary.FileWrite

  2. 导出tensorboard图形显示界面
    1. 源文件

      路径一般为log 文件名字一般为:event

    2. 在windows cmd中打开命令
      cd F:\github\code_test\python\muyuan\enet\Muyuan_Version_TensorFlow-ENet\log
      tensorboard --logdir=original       
      
    3. 之后把网址复制到浏览器即可生成
    4. 浏览器链接打不开的解决方案
      tensorboard --logdir logs --host=127.0.0.1 把链接载入主机上即可
      tensorboard --logdir=logs --host=127.0.0.1 把链接载入主机上即可
      http://127.0.0.1:6006/      
      

5.14.11 将列表转换为二维数组,以方便排序和查看最大元素

  1. 唯一的办法就是新建一个二位数字,然后把值添加进去
    a = np.ones([len(alphas), 4])
    for i in range(len(alphas)):
        a[i,:] = sort_lines[i]     
    
  2. 以下方法不可行,不能改变list这种存储方式
    a = [[i for i in line] for line in sort_lines]       
    

5.14.12 emacs中代码块批量缩进

C-c > 向右缩进代码块
C-c < 向左缩进代码块    

5.14.13 批量化 封装化处理图片,脚本的模板

  1. 同时处理多种格式的文件的方法
    1. 方法示例 只能用于当前文件夹,不包括子文件夹
      方法一
      import glob
      for jpg_file in glob.glob("./*[.jpg, .png]"):
          jpg2pgm( jpg_file , "/test" )
      
      方法二
      # load all excel files
      dir_input = './'
      allxls = sorted([os.path.join(dir_input, file) for file in os.listdir(dir_input) if file.endswith('.xlsx')])    
      
    2. os.walk可以对所有子文件夹有效
      包含子目录中的内容
      os.walk(top, topdown=True, onerror=None, followlinks=False)
      参数:
      top 是你所要遍历的目录的地址
      topdown 为真,则优先遍历top目录,否则优先遍历top的子目录 (默认为True)
      onerror 需要一个 callable 对象,当walk需要异常时,会调用
      followlinks 如果为真,则会遍历目录下的快捷方式(linux 下是 symbolic link)实际所指的目录 (默认为False)
      
      sourceDir="/home/llp/caffe/d/train/apple"
      targetDir="/home/llp/caffe/d/train"
      for root, dirs, files in os.walk(sourceDir):
          for file in files:
              print(os.path.join(root,file).decode(‘gbk’)) #支持显示中文名称
              shutil.copy(os.path.join(root,file),targetDir) #执行复制操作      
      
  2. 批量处理流程
    import cv2
    import numpy as np
    import os 
    import json
    
    def generate(image_files, dir_output1_images, dir_output2_images):
        num = 0
    
        size_windows = 5
    
        min_canny = 5
        max_canny = 150
        apertureSize = 3
    
        for image in image_files:
            num += 1
            img = cv2.imread(image, 0)
    
            dst = cv2.GaussianBlur(img, (size_windows, size_windows), 0)
    
            edges = cv2.Canny(dst, min_canny, max_canny, apertureSize)
    
            name_images_in = image.split('\\')[1]
    
            lines = cv2.HoughLinesP(edges, 1, np.pi / 360, threshod, minLineLength, maxLineGap)
    
            # save edge images
            cv2.imwrite(dir_output1_images + '/' + name_images_in, dst)
    
            # save hough lines images
            cv2.imwrite(dir_output2_images + '/' + name_images_in, edges)
    
    flag_jpg = True
    
    dir_input_images = 'input'
    dir_output1_images = 'blur'
    dir_output2_images = 'edge'
    
    if flag_jpg == True:
        tpye_input_images = '.jpg'
    else:
        tpye_input_images = '.png'
        tpye_output_images = '.png'
    
    image_files = sorted([os.path.join(dir_input_images, file) for file in os.listdir(dir_input_images) if file.endswith(tpye_input_images, 'png')])
    generate(image_files, dir_output1_images, dir_output2_images)
    

5.14.14 init封装.py格式

if __name__ == '__main__':
    run()

5.14.15 TensorFlow使用的GPU

import tensorflow as tf
device_name = tf.test.gpu_device_name()
if not tf.test.is_gpu_available():
  raise SystemError('GPU device not found')
print('Found GPU at: {}'.format(device_name))    

5.14.16 tensorboard中graph图使用说明

  1. 整体结构

    左侧为main graph 右侧为auxiliary graph 流向为down-top conceptual graph是用来显示Keras保存的模型


5.14.17 python中的class类

  1. 优先级:类>函数 类不用写return
  2. 类的声明
    class Config(object):    
    
  3. 类的引用

    可以对Config这个类中的默认值进行修改。未修改的保持默认值

    class PigConfig(Config):
        # Mask RCNN 模型训练参数,每个参数的具体意义见Config父类
        NAME = "Pig"
    
        IMAGES_PER_GPU = 2
    
        NUM_CLASSES = 2
    
        # 每个训练/验证epoch的step数量
        STEPS_PER_EPOCH = 200 # 500
        VALIDATION_STEPS = 100 # 200     
    

5.14.18 assert

assert condition 判断条件是否满足,如果为false则raise an error 用法示例

assert '.' not in source, 'Source name can not contain a dot'

5.14.19 TensorFlow将模型保存为pb模型

  1. 典型示例
    import tensorflow as tf
    import os
    from tensorflow.python.framework import graph_util
    
    pb_file_path = os.getcwd()
    
    with tf.Session(graph=tf.Graph()) as sess:
        x = tf.placeholder(tf.int32, name='x')
        y = tf.placeholder(tf.int32, name='y')
        b = tf.Variable(1, name='b')
        xy = tf.multiply(x, y)
        # 这里的输出需要加上name属性
        op = tf.add(xy, b, name='op_to_store')
    
        sess.run(tf.global_variables_initializer())
    
        # convert_variables_to_constants 需要指定output_node_names,list(),可以多个
        constant_graph = graph_util.convert_variables_to_constants(sess, sess.graph_def, ['op_to_store'])
    
        # 测试 OP
        feed_dict = {x: 10, y: 3}
        print(sess.run(op, feed_dict))
    
        # 写入序列化的 PB 文件
        with tf.gfile.FastGFile(pb_file_path+'model.pb', mode='wb') as f:
            f.write(constant_graph.SerializeToString())
    
        # 输出
        # INFO:tensorflow:Froze 1 variables.
        # Converted 1 variables to const ops.
        # 31     
    
  2. 核心代码

    在原有模型上进行微调

    from tensorflow.python.framework import graph_util 
        sess.run(tf.global_variables_initializer())
    
        # convert_variables_to_constants 需要指定output_node_names,list(),可以多个】
        graph_def = tf.get_default_graph().as_graph_def()
        constant_graph = graph_util.convert_variables_to_constants(sess, sess.graph_def, ['op_to_store'])
    
        # 测试 OP
        feed_dict = {x: 10, y: 3}
        print(sess.run(op, feed_dict))
    
        # 写入序列化的 PB 文件
        with tf.gfile.FastGFile(pb_file_path+'model.pb', mode='wb') as f:
            f.write(constant_graph.SerializeToString())    
    
  3. 问题解决
    1. 最后一层note的写法,即对应的op的名称

      “add:0”是张量的名称而"add"表示的是节点的名称

  4. 显示graph中的所有tensor
    print([n.name for n in graph.as_graph_def().node])     
    

5.14.20 测试目录是否testdir存在,如果不存在,它将为您创建目录

  1. 精简版本
    import os
    
    def exists_or_mkdir(path, verbose=True):
        try:
            if not os.path.exists(path):
                if verbose:
                    print("creates %s ..."%path)  
                os.makedirs(path)
                return False
            else:
                if verbose:
                    print("%s exists ..."%path)  
                return True     
         except Exception as e:
             print(e)
    
  2. 旧版本
    import os  
    
    # direction check 
    def direction_check(CheckDir):
        try:
            if not os.path.exists(CheckDir):  # os.path.join() for making a full path safely
                print("creates %s ..."%CheckDir)  
                os.makedirs(CheckDir)  # If not create the directory, inside their home directory
            else:
                print("%s exists ..."%CheckDir)  
        except Exception as e:
            print(e)
    

5.14.21 如何确认库中有没有某个特定的module

import scipy.misc
dir(scipy.misc)    

5.14.22 scipy.misc 找不到imread解决方案

  1. 最优解,使用更新的库替换
    scipy.imageio.imread    替换scipy.misc.imread
    
  2. 库版本
    pip install Pillow
    pip install scipy==1.1.0
    pip install mkl numpy
    

5.14.23 import future

在old版本的python中使用新版本的python特性,可以用

from __future__ import division

5.14.24 init.py文件的作用

init.py文件的作用是将文件夹变为一个Python模块,并且批量导入所需要的模块 init的py文件是一个module的指示器。如果一个文件夹里面有这个py文件,那么它就可以被视为一个包,通过import引入,如果没有,则无法引入

  1. 基本使用方法
    # package 
    # __init__.py a.py b.py
    import a
    import b
    
    # unit.py 
    import package 
    print(package.a package.b)     
    
  2. 用all方法
    # __init__.py a.py b.py
    __all__ = ['a', 'b']
    
    # c.py
    from utils import *
    unitls.a unitls.b
    
  3. 常见问题解决方案
    1. 综合整理
      报错Subprocess.CalledProcessError:Command ‘[‘ninja’,’-v’]’ returned non-zero exit status 1.
      参考:https://zhuanlan.zhihu.com/p/53418563
      解决方法是:修改…Anaconda3/Lib/site-packages/torch/utils/cpp_extension.py文件
      将[‘ninja’,’-v’]改成[‘ninja’,’–v’]
      
      subprocess.CalledProcessError: Command ‘[‘where’, ‘cl’]’ returned non-zero exit status 1.
      这个问题是因为电脑安装的VS2017,没有将编译器路径加入环境变量。解决方法参考链接为https://blog.csdn.net/qing666888/article/details/83246992
      
      
      
      
    2. 找不到cl.exe

      添加下述路径到环境变量 该路径含有cl.exe

      C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\bin\Hostx64\x64       
      
    3. ninja -v 返回值异常

      将对应位置的代码 -v修改为 –version

      修改Anaconda3/Lib/site-packages/torch/utils/cpp_extension.py文件
      

5.14.25 求解线性、非线性方程组

  1. sympy模块
    rom sympy import solve
    from sympy.abc import x
    print(solve(x * 3 - 9, x))     
    
  2. scipy模块
    from scipy.optimize import fsolve
    def func(i):
        x, y, z = i[0], i[1], i[2]
        return [
               x + 2 * y + 3 * z - 6,
               5 * (x ** 2) + 6 * (y ** 2) + 7 * (z ** 2) - 18,
               9 * (x ** 3) + 10 * (y ** 3) + 11 * (z ** 3) - 30
               ]
    
    r = fsolve(func,[0, 0, 0])
    print(r)
    
    

5.14.26 判断变量是否已经被定义,是否存在

  1. names定义域
    方法一
    user_name 是变量名,需要在外面加上分号
    if isset('user_name'): 
      print 'user_name is defined'
    else
      print 'user_name is not defined'
    
    方法二
    a是变量名,需要加上分号
    'a' in vars()     
    输出结果为TRUE、FALSE
    
  2. 类中的函数、方法
    如果为类中的函数/方法,要用hasattr
    var = 'upscale_factor1'
    hasattr(opt, var) 判断是否存在
    
    获取函数或者方法
    invert_op = getattr(self, "invert_op", None)     
    

5.14.27 在图片上添加文字、直线、和点(圆)以及cv2.imshow方法快速展示图形结果(便于debug)

  1. 画图方法
    添加文字
    cv2.putText(img, '%s'%i, (50,150), cv2.FONT_HERSHEY_COMPLEX, 5, (0, 255, 0), 12)    
                  图像,文字内容, 坐标 ,字体,大小,颜色,字体厚度
    
    画点、圆
    cv.circle(img, (160, 160), 60, (0, 255, 255), -1)
              图像、圆心 半径 颜色 实心圆-1 0-5空心圆的线宽
    
    画直线
    cv2.line(image, (min_line_left[0], min_line_left[1]), (min_line_left[2], min_line_left[3]), (0, 255, 255), line_width)
             图像   (x1, y1)           (x2, y2), 颜色 线宽
    
  2. cv2.imshow使用方法
    import cv2 
    
    cv2.imshow('p_transform', dst)
    cv2.waitKey() # 里面可以加上等待时间,50表示50ms
    cv2.destroyAllWindows()     
    

5.14.28 平方和平方根的计算 以及直线斜率及度数的计算公式

  1. 方法一
    num * 0.5 平方
    num ** 0.5 平方根     
    
  2. 方法二
    import math
    
    math.pow(12, 2) # 144
    math.sqrt(144)  # 12
    
  3. 方法三

    import math

    pow(12, 2) # 144 sqrt(144) # 12

  4. floor 与 //
    import math
    
    print(math.floor(3.5))
    print(7 // 2)
    
    print(math.floor(-3.5))
    print(-7 // 2)
    
    print(math.floor(4.2))
    print(8.4 // 2)
    
    print(math.floor(-4.2))
    print(-8.4 // 2)     
    
  5. 直线与水平线的夹角度数
    import numpy as np
    angle = np.rad2deg(np.arctan2(y[-1] - y[0], x[-1] - x[0]))     
    
  6. 直线的斜率
    k = (y2-y1) / (x2-x1 + 0.00001)     
    b = y1 - k * x1
    
  7. 点到直线的距离
    k 为斜率 b为截距
    import math
    dis = math.fabs(k * point1_x - point1_y + b) / math.pow(k * k + 1, 0.5)     
    

5.14.29 numpy 库

  1. 创建数组
    创建数组
    ones() zeros() eye() identity() diag()     
    import numpy as np
    A = np.ones((4,4))   # 单位矩阵 ,参数:元组 A.shape -> (4,4)
    B = np.zeros((4,4))  # 零矩阵
    C = np.eye(4,k = 0,dtype=int)    # 主对角线为全为1的对角矩阵
    D = np.identity(4)   #4维单位矩阵
    E = np.diag(np.arange(1,5))# [1,2,3,4]主对角线矩阵
    F = np.diag([3,2,1],k = 1)# 右上角第1条为[3,2,1] 4维对角线矩阵
    print('右上角第1条为[3,2,1] 4维对角线矩阵 \n%s'%F)	
    
    查看数组维度
    np.shape(a)
    a = np.ones((4, 2))
    shape = np.shape(a)
    (4, 2)
    
    维度变更
    resize会直接修改原始数组的数据,而返回None; reshape方法不会修改原始数组的数据,而返回一个新的数组
    np.resize 如果新数组比原数组大,则将会copy原数组中的值对新数组进行填充
    >>> a=np.array([[0,1],[2,3]])
    >>> np.resize(a,(2,3))
    array([[0, 1, 2],
          [3, 0, 1]])
    >>> np.resize(a,(1,4))
    array([[0, 1, 2, 3]])
    >>> np.resize(a,(2,4))
    array([[0, 1, 2, 3],
          [0, 1, 2, 3]])
    
    np.reshape 在不改变原数组数据的情况下,将它reshape成一个新的维度
    如果给定的数组数据和需要reshape的形状不符合时,将会报错。
    a = np.array([[1,2,3],[4,5,6],[7,8,9]]) 
    a.reshape((1,9)) 
    
  2. 添加、删除元素
    # 添加元素
    p_arr = np.concatenate((p_arr,[p_])) # 先将p_变成list形式进行拼接,注意输入为一个tuple
    p_arr = np.append(p_arr,p_) #直接向p_arr里添加p_     
    
    # 删除元素
    a = np.arrar([1, 2, 3, 4])
    np.delete(a, 0)  删除a中位置为0的元素
    
  3. 只保留矩阵某些行
    a[1:]#取第二行之后地所有行
    a[0:2] #取第一行和第二行
    a[:,0:2] #取第一列和第二列
    a[1:,2:] #取第二行和第三行的第三列
    a[0:2] #取第一行和第二行     
    
  4. 对数组中的每一个元素进行操作
    示例一
    a[0:3] = a[0:3] + 100 
    
    a = np.abs(a)     
    a = np.floor(a)     
    
    示例二
    pts2[:,0] = pts2[:,0] + 360
    pts2[pts2 > 1] = 0 
    
  5. reshape
    reshape:在不改变原数组数据的情况下,将它reshape成一个新的维度。
    
    与resize的区别在于,如果维度不匹配reshape会报错
    来自 <https://blog.csdn.net/orangefly0214/article/details/83243912>      
    
  6. 矩阵对应元素concatenate
    np.ravel() 把矩阵变平,类似于flatten,但是方式为按位依次
    
    import numpy as np
    
    m = np.array([[1, 2], [3, 4]])
    n = np.array([[5, 6], [7, 8]])
    p = np.ravel([m, n], 'F')
    
    q = np.ravel([m.flatten(), n.flatten()], 'F')
    q, np.reshape(q, (2, 4))     
    
  7. 对数组中的每一个元素进行操作!! 多条件版本
    方法一:
    M[(M > 2) & (M < 7)] = -1
    将M数组中2<M<7的元素设置为-1
    
    方法二:
    >>> A = np.array((1,7,3,8,4,9,1))
    >>> np.where(A>4,1,A)
    array([1, 1, 3, 1, 4, 1, 1])
    
  8. 获取重复元素的数目和位置
    np.unique
    c,s=np.unique(b,return_index=True)      
    

5.14.30 os库

  1. 路径分割符号
          os.sep 在Ubuntu系统上为/ 在Windows系统上为\\    
    
          os.path.join(path1, path2, path3)
          一定要使用os.path.join来书写文件路径,否则会出现unix与Windows系统不通用的问题
    
         解决办法1 可全部使用‘/’表示
    
         解决办法2 我们可以使用os.sep方法,他是一个变量,在Windows下,他等于‘\\’,在Linux下,他等于‘/’。
    
         解决方法3 os.path.join()方法是自带os.sep的。
    
  2. 获取当前工作路径
    import os
    print("1111")
    print (os.getcwd())#获得当前目录 注意,结尾不带/
    print (os.path.abspath('.'))#获得当前工作目录
    print (os.path.abspath('..'))#获得当前工作目录的父目录  注意,结尾不带/
    print (os.path.abspath(os.curdir))#获得当前工作目录
    
  3. 获取绝对路径
    适用条件:必须是用os.listdir()或者其他相关函数获取的不完整路径名
    os.path.abspath()     
    
  4. 获取上级目录
    获取上级目录
    os.path.abspath(os.path.dirname('f:\\github\\code_test\\python\\sensetime'))
    
    os.path.dirname可以获取指定路径的上一级目录
    abspath获取绝对路径     
    
  5. 分离文件名、路径名、后缀名
    import os
    file_path = "D:/test/test.py"
    (filepath,tempfilename) = os.path.split(file_path)
    (filename,extension) = os.path.splitext(tempfilename)
    
    其中:
    
    filepath为文件的目录,即D:/test
    filename为文件的名字,即test
    extension为文件的扩展名,即.py     
    
  6. 索引路径下的所有文件
    不包含子目录中的内容
    os.listdir(path)   只能返回当前path路径下的文件和文件夹,不包含子目录中的内容
    
    包含子目录中的内容
    os.walk(top, topdown=True, onerror=None, followlinks=False)
    参数:
    top 是你所要遍历的目录的地址
    topdown 为真,则优先遍历top目录,否则优先遍历top的子目录 (默认为True)
    onerror 需要一个 callable 对象,当walk需要异常时,会调用
    followlinks 如果为真,则会遍历目录下的快捷方式(linux 下是 symbolic link)实际所指的目录 (默认为False)
    
    sourceDir="/home/llp/caffe/d/train/apple"
    targetDir="/home/llp/caffe/d/train"
    for root, dirs, files in os.walk(sourceDir):
        for file in files:
            print(os.path.join(root,file).decode(‘gbk’)) #支持显示中文名称
            shutil.copy(os.path.join(root,file),targetDir) #执行复制操作
    
  7. os.path.join方法
    os.path.join(path1, path2, path3)
    
    a=['1','2','3','4','5']
    '-'.jion(a)
    1-2-3-4-5
    
  8. 检查路径中文件是否存在
    os.path.exists(path)     
    
  9. os.system类cmd执行命令
    1. cmd命令执行MATLAB脚本
      os.system('matlab -nosplash -nodesktop -r yourmfile')
      -nosplash 不显示splash界面 -nodesktop 不启动MATLAB客户端 
      -r matlabcommand 执行matlab命令 不用带.m符号
      
      技巧:m文件需要给输入参数
      matlab -nosplash -nodesktop -r "test('D:/', 'D:/test')"
      
      字符串中,"不要转义,直接写即可,'需要转义写为\'
      
      示例:
      cmd直接执行命令: && 表示同时执行   exit;表示执行完毕退出
      cd cali_code && matlab -nosplash -nodesktop -r "one_Iso_fit('64', '833', '993', '12', '23', './vivo1962_0116/packed/master/iso100', 'gbbr', '4000', '3000');exit;"
      
      python字符串版本:需要转义
      run_code = 'cd cali_code && matlab -nosplash -nodesktop -r "one_Iso_fit(\'64\', \'833\', \'\', \'12\', \'23\', \'./vivo1962_0116/packed/master/iso100\', \'gbbr\', \'4000\', \'3000\');exit;"'
      
    2. cmd命令执行.cmd文件
      windows 环境下
      start 60gray.cmd 
      
  10. os.rename

    重命名文件或者文件夹

    import os
    os.rename("D:\\demo\\a.txt","D:\\demo\\b.txt")
    

5.14.31 带有索引的enumerate枚举方法

for i, element in enumerate(seq):

5.14.32 .gitignore 文件编写 和通过github进行版本控制的方法

  1. 编写语法
    1. 基本规则

      编写gitignore规则的时候一定要注意,如果是非直接上下级路径,一定要添加两个星号表示

      bin/: 忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件
      /bin: 忽略根目录下的bin文件
      /*.c: 忽略 cat.c,不忽略 build/cat.c
      debug/*.obj: 忽略 debug/io.obj,不忽略 debug/common/io.obj 和 tools/debug/io.obj
      **/foo: 忽略/foo, a/foo, a/b/foo等
      a/**/b: 忽略a/b, a/x/b, a/x/y/b等
      !/bin/run.sh: 不忽略 bin 目录下的 run.sh 文件
      *.log: 忽略所有 .log 文件
      config.php: 忽略当前路径的 config.php 文件    
      
    2. 高级规则
      / 结束的模式只匹配文件夹以及在该文件夹路径下的内容,但是不匹配该文件
      / 开始的模式匹配项目跟目录
      ? 通用匹配单个字符
      [] 通用匹配单个字符列表
      /** 匹配多级目录,可在开始,中间,结束
      
    3. 高级示例
      排除任何目录下的readme.assets文件夹下面的所有.jpg .png文件 
      !**/README.assets/*.jpg
      !**/README.assets/*.png      
      
      !**/assets/**/*.jpg
      !**/assets/**/*.png
      
  2. .gitignore规则不生效
    .gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。
    解决方法就是先把本地缓存删除(改变成未track状态),然后再提交:     
    
    可以直接删除
    git rm -r --cached .
    此处命令执行完成之后即可通过github desktop进行commit命令了
    
    git add .
    git commit -m 'update .gitignore'
    
  3. 确认文件被哪条gitignore语句忽略
    git check-ignore -v 文件名     
    git check-ignore -v App.class
    

5.14.33 pip使用方法

pip检测更新
pip list –outdated

pip升级包
pip install --upgrade packagename
pip install --upgrade --user setuptools

pip卸载包
pip uninstall packagename    

5.14.34 shutil库-创建文件夹、处理文件

获取当前工作路径
import os
print("1111")
print (os.getcwd())#获得当前目录
print (os.path.abspath('.'))#获得当前工作目录
print (os.path.abspath('..'))#获得当前工作目录的父目录
print (os.path.abspath(os.curdir))#获得当前工作目录
  1. 复制、移动文件
    import shutil 
    import os 
    
    移动
    shutil.move(filePath, destPath)     
    
    复制 shutil.copy
    sourceDir="/home/llp/caffe/d/train/apple"
    targetDir="/home/llp/caffe/d/train"
    for root, dirs, files in os.walk(sourceDir):
        for file in files:
            print(os.path.join(root,file).decode(‘gbk’)) #支持显示中文名称
            shutil.copy(os.path.join(root,file),targetDir) #执行复制操作
    
    复制 shutil.copyfile
    注意:一定得是文件的名字.jpg这种 源文件和目标文件写法都是对应到文件
    from shutil import copyfile
    copyfile(source_file, des_file)    
    
  2. 重命名文件、文件夹 os库即可
    import os
    os.rename("D:\\demo\\a.txt","D:\\demo\\b.txt")
    
  3. shutil库
    shutil.copyfile( src, dst)   #从源src复制到dst中去。 如果当前的dst已存在的话就会被覆盖掉
    shutil.move( src, dst)  #移动文件或重命名
    shutil.copymode( src, dst) #只是会复制其权限其他的东西是不会被复制的
    shutil.copystat( src, dst) #复制权限、最后访问时间、最后修改时间
    shutil.copy( src, dst)  #复制一个文件到一个文件或一个目录
    shutil.copy2( src, dst)  #在copy上的基础上再复制文件最后访问时间与修改时间也复制过来了,类似于cp –p的东西
    shutil.copy2( src, dst)  #如果两个位置的文件系统是一样的话相当于是rename操作,只是改名;如果是不在相同的文件系统的话就是做move操作
    shutil.copytree( olddir, newdir, True/Flase) #把olddir拷贝一份newdir,如果第3个参数是True,则复制目录时将保持文件夹下的符号连接,如果第3个参数是False,则将在复制的目录下生成物理副本来替代符号连接
    
    !!!!!!!!!!!!!
    shutil.rmtree( src )   #递归删除一个目录以及目录内的所有内容     
    !!!!!!!!!!!!!
    

5.14.35 数据保存-Python合集

  1. with open 模式
                若文件不存在   是否覆盖
    r	  只能读	  报错	-
    r+	可读可写	报错	是
    w	  只能写	  创建	是
    w+  可读可写	创建	是
    a  只能写	创建	否,追加写
    a+	可读可写	创建	否,追加写     
    
  2. python读取.mat文件
    from scipy.io import loadmat
    #读取文件
    para = 'para.mat'
    data = loadmat(para)
    
    data.keys()
    p_red = data['p_red']
    p_blue = data['p_blue']
    p_green = data['p_green']
    p_red, p_blue, p_green     
    
  3. python操作.yaml文件
    1. yaml原始库

      注意事项:

      • yml文件中允许直接使用Python list格式的数据的
      • python数据格式dict 不允许直接用list作为值,只能用tuple并且在单元素尾部加逗号

        import os
        import yaml
        
        # 字典格式初始化yaml
        desired_caps = {
                        'platformName': 'Android',
                        'platformVersion': '7.0',
                        'deviceName': 'A5RNW18316011440',
                        'appPackage': 'com.tencent.mm',
                        'appActivity': '.ui.LauncherUI',
                        'automationName': 'Uiautomator2',
                        'unicodeKeyboard': [True,"hh"],
                        'resetKeyboard': True,
                        'noReset': True,
                        'chromeOptions': {'androidProcess': 'com.tencent.mm:tools'}
                        }
        
        # 读取yaml中的内容,字典格式
        with open(output_path, 'r') as f:
            contents = yaml.load(open(inputname, 'r'), Loader=yaml.FullLoader)
            contents['exp_name'] = exp_name
            contents['hr_path'] = hr_path
            contents['lr_path'] = lr_path
            contents['dataroot'] = dataroot
        
        # 字典格式,写入yaml中的内容
        with open(output_path, 'w', encoding="utf-8") as nf:
            yaml.dump(contents, nf)
        
    2. ruamel.yaml高级库
        # 读取yaml内容
      with open(yml_path, 'r',encoding="utf-8") as f:
          contents = ruamel.yaml.round_trip_load(f)
          project_name = contents['project_name']
          lens = contents['CheckDirs2']
          CheckDirs3 = contents['CheckDirs3']
          npy_iso = contents['npy_iso']      
      
       # 写入yml中 可保留字典键值顺序和注释
       with open(output_path, 'w+', encoding='utf8') as nf:
           ruamel.yaml.dump(contents, nf, default_flow_style=False, allow_unicode=True, Dumper = ruamel.yaml.RoundTripDumper)
      
      
  4. python操作.npy文件
    import numpy as np
    
    # 配置numpy数据
    a = {}
    # red    blue   green
    a['100iso'] = np.array(
        [[0.0596, 0.2835], [0.0582, 0.2537], [0.0646, 0.2622]])
    a['300iso']= np.array(
        [[0.1851, 0.3512], [0.1788, 0.2876], [0.1855, 0.3183]])
    a['500iso'] = np.array(
        [[0.3145, 0.4648], [0.3002, 0.3464], [0.3254, 0.3859]])
    a['800iso'] = np.array(
        [[0.5043, 0.9278], [0.4702, 0.7227], [0.5070, 0.8073]])
    a['1600iso'] = np.array(
        [[1.0701, 2.5570], [0.8971, 2.2051], [1.0289, 2.3826]])
    a['3200iso'] = np.array(
        [[2.0742, 9.7911], [1.8294, 8.5660], [2.0102, 9.2502]])
    
    # 保存numpy
    np.save('./calibrated_coefficient__param_1962.npy',a)     
    
    # 读取numpy 
    b = np.load('./calibrated_coefficient_param_1962.npy')
    
  5. python操作.txt文件
    1. 读写简洁版本
      # modify gray.cmd with correct image width and height
      with open(CheckDir + '/' + checkdir4 + '.cmd', 'r+') as f:
          str = f.read()
          f.seek(0)
          f.truncate()
          str2 = str.replace('4000', '%s'%parameters[6]).replace('3000', '%s'%parameters[7])
          print(str, parameters[6:8])
          f.write(str2)      
      
      # f.seek(0) 定位到文件开头
      # f.truncate() 清空文本内容
      # 如果没有如上两行,则会执行续写操作
      
    2. 读取文件
      全数字读取,直接转换为np格式
      import numpy as np
      a = np.loadtxt('1.result.txt')
      
      按行读取
      data = []
      for line in open("data.txt","r"): #设置文件对象并读取每一行文件
          data.append(line)               #将每一行文件加入到list中     
      
      按行读取并转换为数组格式
      np.array(data)
      
      字符串读取
      with open('1.result.txt',"r") as f:    #设置文件对象
          str = f.read()    #可以是随便对文件的操作
      
    3. 写入文件
      with open('data.txt','w') as f:    #设置文件对象
          f.write(str)                 #将字符串写入文件中     
      
  6. python操作.xls .xlsx文件
    1. xlsx格式
      1. package

        openpyxl, os

      2. 读取工作表
        workbook=openpyxl.load_workbook(xls)
        worksheet=workbook.worksheets[0]      
        
      3. 单元格元素查找
        worksheet.cell(row=i, column=5).value      起始为(1,1)而不是(0,0)
        
      4. 单元格元素修改
        worksheet.cell(i,j,worksheet.cell(row=i, column=j).value)  与查找的区别在于cell函数里面的元素个数      
        
      5. 工作表保存
        end_workbook.save(filename = 'test.xlsx)      
        
      6. 代码展示
        import openpyxl, os
        """
        usage: 
            just put all .xlsx files in the same direction of this .py file and set outname if you want.
        
        param:
            name_output_xlsx: 输出的Excel文件名   
        
        return:
        
        """
        
        def modify(xls, name_output_xlsx):
            # load .xlsx file
            workbook=openpyxl.load_workbook(xls)
            worksheet=workbook.worksheets[0]
        
            #确认输出的Excel文件是否存在,如果不存在新建
            if os.path.exists(name_output_xlsx) == False:
                end_workbook = workbook
            else:
                end_workbook = openpyxl.load_workbook(name_output_xlsx)
        
            end_worksheet = end_workbook.worksheets[0]
        
            for i in range(10, 14):
        #        print(i, worksheet.cell(row=i, column=5).value)
                if worksheet.cell(row=i, column=5).value == None:
                    continue
                else:
                    print('*****************************', xls, worksheet.cell(row=i, column=4).value)
                    for j in range(5, 10):     
                        print('Currently modifing: ',  worksheet.cell(row=i, column=4).value, worksheet.cell(row=2, column=j).value, end='\n')
        
                        print(worksheet.cell(row=i, column=j).value,end="\n")
                        end_worksheet.cell(i,j,worksheet.cell(row=i, column=j).value)
                        print()
            end_workbook.save(filename = name_output_xlsx)   
        
        if __name__ == '__main__':
            #outpu param setting
            name_output_xlsx = r'工作进展-计划表模板.xlsx'
        
            # load all excel files
            dir_input = './'
            allxls = sorted([os.path.join(dir_input, file) for file in os.listdir(dir_input) if file.endswith('.xlsx')])
        
            # modify and save as output xlsx
            for num in range(len(allxls)):
                modify(allxls[num], name_output_xlsx)      
        
    2. xls格式
      1. packages

        xlrd xlwt

      2. 读数据
        1. 获取工作簿及工作表
           import xlrd  #引入模块
          
          #打开文件,获取excel文件的workbook(工作簿)对象
          workbook=xlrd.open_workbook("DataSource/Economics.xls")  #文件路径
          
          #获取所有sheet的名字
          names=workbook.sheet_names()
          print(names) #['各省市', '测试表']  输出所有的表名,以列表的形式
          
          #通过sheet索引获得sheet对象
          worksheet=workbook.sheet_by_index(0)
          print(worksheet)  #<xlrd.sheet.Sheet object at 0x000001B98D99CFD0>
          
          #通过sheet名获得sheet对象
          worksheet=workbook.sheet_by_name("各省市")
          print(worksheet) #<xlrd.sheet.Sheet object at 0x000001B98D99CFD0>
          
          #由上可知,workbook.sheet_names() 返回一个list对象,可以对这个list对象进行操作
          sheet0_name=workbook.sheet_names()[0]  #通过sheet索引获取sheet名称
          print(sheet0_name)  #各省市
          
        2. 具体上网站上学习即可
  7. python操作.pki文件-将字符串、列表、字典等数据结构存储为本地文件 pickle

    效果:可以直接在另外文件以原始格式打开数据

    1. 存储步骤
      import pickle
      pickle_file = open('result.pki','wb')
      pickle.dump(result, pickle_file)
      pickle_file.close()  
      
    2. 载入步骤
      import pickle 
      pkl_file = open('result.pki','rb') 
      result = pickle.load(pkl_file)
      pkl_file.close()     
      
  8. Python操作.json文件
    1. 导出
      import json
      
      names = ['joker','joe','nacy','timi']
      
      filename='names.json'
      with open(filename,'w') as file_obj:
          json.dump(names,file_obj)     
      
    2. 导入
      import json
      
      filename='names.json'
      with open(filename) as file_obj:
          names = json.load(file_obj)
      
      print(names)      
      
  9. 格式及方法对应说明

    最优解:pickle,能够处理任何格式的python数据 json只能用来处理字符串 np用来处理矩阵

    字典用.json 不带s 矩阵用np.save 列表用np.save 先转换为np 在转换回来 列表用.json 不带s

    其中json.load 与json.loads的区别 load 与 dump处理文件 loads 与 dumps处理字符串

5.14.36 数据保存-MATLAB合集

p = rand(1,10);
q = ones(10);
save('pqfile.mat','p','q')    

5.14.37 type help dir帮助命令

type 
dir 
help    

5.14.38 字典

  1. 注意事项

    字典操作不能简单的复制!为浅拷贝 实例中 dict2 其实是 dict1 的引用(别名),所以输出结果都是一致的,dict3 父对象进行了深拷贝,不会随dict1 修改而修改,子对象是浅拷贝所以随 dict1 的修改而修改。

    dict1 =  {'user':'runoob','num':[1,2,3]}
    
    dict2 = dict1          # 浅拷贝: 引用对象
    dict3 = dict1.copy()   # 浅拷贝:深拷贝父对象(一级目录),子对象(二级目录)不拷贝,还是引用
    
    # 修改 data 数据
    dict1['user']='root'
    dict1['num'].remove(1)
    
    # 输出结果
    print(dict1)
    print(dict2)
    print(dict3)    
    
  2. 删除键值
    site= {'name': '我的博客地址', 'alexa': 10000, 'url':'http://blog.csdn.net/uuihoo/'}
    pop_obj=site.pop('name') # 删除要删除的键值对,如{'name':'我的博客地址'}这个键值对
    print pop_obj   # 输出 :我的博客地址
    
  3. 字典内容批量处理 简洁写法
    dict_data = {key: {key_: val_+100 for key_, val_ in val.items()} 
                 for key, val in dict_data.items()}     
    
    示例:
    dict = {'Name': 89, 'Age': 7, 'Class': 98}
    dict1 = {key : str(value) for key, value in dict.items()}
    
  4. 对字典按value或者key进行排序
    a = {0: 10941, 1: 10943, 2: 10943, 3: 8559, 4: 0, 5: 0, 6: 0, 7: 0}
    sorted(a.items(), key = lambda x:x[1])  
    a.items()实际上是将d转换为可迭代对象,
    key=lambda item:item[0]的话则是选取第一个元素作为比较对象,也就是key值作为比较对象
    key=lambda item:item[1]的话则是选取第二个元素作为比较对象,也就是value值作为比较对象
    
    
    lambda作为一个表达式,定义了一个匿名函数,上例的代码x为入口参数,x+1为函数体,用函数来表示为:
    1 def g(x):
    2     return x+1
    
  5. 判断字典中是否有某个键值
    d = {"key1": 10, "key2": 23}
    if "key1" in d:
        print("this will execute")
    if "nonexistent key" in d:
        print("this will not")
    
    来自 <https://stackoverflow.com/questions/1602934/check-if-a-given-key-already-exists-in-a-dictionary>      
    

5.14.39 list列表

  1. 获取重复元素的数目和位置
    X = [-1, 0, 1, 0, 1, 2, 1, 2]    
    # 获取重复元素的数目和位置
    result = {}
    for i in set(X):
        id1 = [j for j,x in enumerate(X) if x==i]
        result[i] = id1
    
  2. 判断两个列表是否完全相等
    1. a=[1,-1,0]
    2. b=[1,-1,0]
    3. c=[-1,1,0]
    
    import operator
    operator.eq(a,c)
    
    来自 <https://blog.csdn.net/baidu_15113429/article/details/80564114>      
    
  3. 截取np.narray
    中的某行某列
    Z = [0,2]   #定义行数
    d = [2,3]   #定义列数
    
    #代码
    C_zd = C[z,d]      
    
  4. 交叉concatenate
    Few approaches with stacking could be suggested -
    np.vstack((A,B)).ravel('F')
    np.stack((A,B)).ravel('F')
    np.ravel([A,B],'F')
    
    Sample run -
    In [291]: A
    Out[291]: array([3, 5, 6])
    In [292]: B
    Out[292]: array([13, 15, 16])
    In [293]: np.vstack((A,B)).ravel('F')
    Out[293]: array([ 3, 13,  5, 15,  6, 16])
    In [294]: np.ravel([A,B],'F')
    Out[294]: array([ 3, 13,  5, 15,  6, 16])
    
    来自 <https://stackoverflow.com/questions/47393362/concatenate-two-arrays-in-python-with-alternating-the-columns-in-numpy>      
    
  5. expand 与 append的区别

    append可以将整个元组、列表当成一个元素添加进愿列表中

    expand会将列表、元组拆分成单元素添加进原列表

  6. 删除元素
    list1 = list(range(100))
    list1 = list1.remove(0)     # 删除list中位置0的元素
    
  7. 获取特定元素
    x = [1,2,3,2,2,2,3,4]
    >>> list(filter(lambda a: a != 2, x))
    [1, 3, 3, 4]     
    

5.14.40 画图

  1. matplotlib
    1. 示例 不完整
      import matplotlib.pyplot as plt
      
      color_name = 'red'
      plt.title(color_name)
      plt.plot(x, sorted(y_red))
      plt.plot(x, y_red_gt)
      plt.ylabel("Grade")
      plt.ylabel("number")
      plt.savefig(color_name + '.png', dpi=600)
      plt.show()
      
    2. 功能拆分
      坐标轴标题
      plt.xlabel("Grade")
      plt.ylabel("number")      
      
      
      线型、风格设定说明
      https://www.cnblogs.com/liutongqing/p/6985805.html
      
    3. 中文字体解决
      中文字体
      # 简历绩点图
      import matplotlib.pyplot as plt
      import numpy as np
      plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
      
      # UCR
      n = 3
      index_ls = ['Fall 2017','Winter 2018','Spring 2018']
      x = range(n)
      y1 = [2.43, 3.66, 4]
      y11 = np.ones(n) * 3.28
      
      fig = plt.figure(figsize=(12, 12))
      # fig = plt.figure()
      plt.plot(x, y1, color='r', linestyle='-', markerfacecolor='blue',marker='o')
      plt.plot(x, y11, color='b', linestyle='--')
      for a, b in zip(x, y1):  
          plt.text(a, b, b,ha='center', va='bottom', fontsize=30)
      plt.text(x[0], y11[0], '平均GPA:3.28', ha='left', va='bottom', fontsize=30)
      
      plt.title(r"加州大学河滨分校每学期绩点", fontsize=30)
      plt.xlabel('学期/quarter制',fontsize=30,alpha=0.5)
      plt.ylabel('绩点/4分制',fontsize=30,alpha=0.5)
      plt.xticks(x,index_ls, size = 15)
      plt.yticks(size = 15)
      
      plt.savefig('UCR.png')
      plt.show()
      
      # UESTC
      n = 6
      index_ls = ['Fall 2013', 'Spring 2014', 'Fall 2014', 'Spring 2015', 'Fall 2016', 'Spring 2016'] 
      x = range(n)
      y2 = [3.10, 2.74, 3.80, 3.95, 4.00, 3.97]
      y22 = np.ones(n) * 3.60
      
      fig = plt.figure(figsize=(12, 12))
      # fig = plt.figure()
      plt.plot(x, y2, color='r', linestyle='-', markerfacecolor='blue',marker='o', label='y2')
      plt.plot(x, y22, color='b', linestyle='--', label='y22')
      for a, b in zip(x, y2):  
          plt.text(a, b, b,ha='center', va='bottom', fontsize=30)
          plt.text(x[0], y22[0], '平均GPA:3.60', ha='left', va='bottom', fontsize=30)
      
      plt.title(r"电子科技大学每学期绩点", fontsize=30)
      plt.xlabel('学期/学年制',fontsize=20,alpha=0.5)
      plt.ylabel('绩点/4分制',fontsize=20,alpha=0.5)
      plt.xticks(x,index_ls, size = 15)
      plt.yticks(size = 15)
      plt.legend()
      
      plt.savefig('UESTC.png')
      plt.show()
      
    4. 随机颜色生成
      1. 最优效果
        import colorsys
        
        def random_colors(N, bright=True):
            """
            Generate random colors.
            To get visually distinct colors, generate them in HSV space then
            convert to RGB.
            """
            brightness = 1.0 if bright else 0.7
            hsv = [(i / N, 1, brightness) for i in range(N)]
            colors = list(map(lambda c: colorsys.hsv_to_rgb(*c), hsv))
            random.shuffle(colors)
            return colors       
        
      2. 次优效果
        import random
        
        def colors(n):
            ret = []
            r = int(random.random() * 256)
            g = int(random.random() * 256)
            b = int(random.random() * 256)
            step = 256 / n
            for i in range(n):
                r += step
                g += step
                b += step
                r = int(r) % 256
                g = int(g) % 256
                b = int(b) % 256
                r_ = r/255
                g_ = g/255
                b_ = b/255
                ret.append((r_,g_,b_))
            return ret
        

5.14.41 动态变量

  1. 使用命令空间
    命名
    names = locals()
    
    colors_name = ['red', 'blue', 'green']
    for color_name in colors_name:
        names['y_' + color_name] = color_name
    
    调用
    names = locals()
    
    colors_name = ['red', 'blue', 'green']
    for color_name in colors_name:
        print(names.get('y_' + color_name), end=' ')
    
  2. 使用exec动态赋值
    for i in range(5):
        exec('var{} = {}'.format(i, i))     
    
    print(var0, var1, var2, var3 ,var4)
    0 1 2 3 4
    
  3. 对于class,推荐使用setattr()方法
    setattr给对象添加属性或者方法
    getattr setattr
    
    来自 <https://www.cnblogs.com/Presley-lpc/p/9153865.html>      
    

5.14.42 全局变量

global需要在函数内部声明,若在函数外声明,则函数依然无法操作x
来自 <https://blog.csdn.net/xtingjie/article/details/71210182>     

5.14.43 参数解析 parse args

  1. 基本用法
    import argparse
    
    def parse_args():
        parser = argparse.ArgumentParser()
        parser.add_argument("echo",help="echo the string")
        parser.add_argument('--rescale', type=float, default=1.0, help='Rescaled LR Rate')
        parser.add_argument("--pb_path", type=str, default='./pretrained_model/FALSR-A.pb')
        parser.add_argument("--save_path", type=str, default='./result/')
        return parser.parse_args()    
    
    if __name__ == '__main__':
        cfg = parse_args()
        pb_name = cfg.pb_path
        save_path = cfg.save_path
    
    #定位参数
    cfg.echo
    cfg.rescale
    
    # 命令行使用
    python model_lgb.py --type 开飞机 --Tag 1
    
    # --rescale 是可选参数 echo 是必选参数
    
    action作用是开关,传入该参数的时候,将该参数设置为true,默认值为false
    parser.add_argument('--multiprocessing-distributed', action='store_true', help='Use multi-processing distributed training to launch')
    
  2. jupyter notebook用法
    args不为空导致报错,直接置空即可
    opt = parser.parse_args(args=[])     
    

5.14.44 转义字符

  1. 终极方法
    可以直接将字符串设置为r''格式
    强制不进行任何转义
    r'E:\test\vivo'     \v是转义字符
    
  2. 部分说明
    字符串中"双引号可以直接写
    
    单引号必须转移为\'
    \必须转义为 \\    
    

5.14.45 列表操作

  1. 内部元素 规则查找
    a = [1, 2, 3]
    a[a==1] = 0    
    a[a > 1] = 0
    
  2. 去除重复元素
    list l 
    去掉重复元素之后的列表
    set(l)     
    
  3. 排列组合
    from itertools import product
    
    l = [1, 2, 3]
    print(list(product(l, l)))
    print(list(product(l, repeat=4)))
    
    # 组合
    from itertools import combinations
    print(list(combinations([1,2,3,4,5], 2)))     
    

5.14.46 检查数据类型

isinstance(A, int)    

5.14.47 Windows GUI控制脚本 可以用来控制任何软件

  1. 库安装
    pip install pyautogui.py    
    
  2. 常用命令
    1. 网址
    2. 获取当前鼠标位置 + 交互式获取鼠标位置
      import pyautogui, sys
      
      def get_mouse_location():
          screenWidth, screenHeight = pyautogui.size() # Get the size of the primary monitor.
          currentMouseX, currentMouseY = pyautogui.position() # Get the XY position of the mouse.
          print(screenHeight, screenWidth, currentMouseX, currentMouseY)
      
      def get_mouse_location_interactively():
          print('Press Ctrl-C to quit.')
          try:
              while True:
                  x, y = pyautogui.position()
                  positionStr = 'X: ' + str(x).rjust(4) + ' Y: ' + str(y).rjust(4)
                  print(positionStr, end='')
                  print('\b' * len(positionStr), end='', flush=True)
          except KeyboardInterrupt:
              print('\n')
      
    3. 安全模式
      !!! 默认已开启safe mode 屏幕four corners
      
      当鼠标移动到屏幕四个顶点位置的时候,中止程序
      pyautogui.FAILSAFE = True      
      
    4. 鼠标操作
      # 移动到指定位置 + 单击
      pyautogui.click(1056, 720)
      
      # 鼠标移动
      pyautogui.moveTo(1056, 720)
      
      # 暂停 单位:秒
      pyautogui.PAUSE = 1
      
      pyautogui.mouseDown()   #按下鼠标按键(左键)
      
      pyautogui.mouseUp()     #释放鼠标按键(左键)
      
      pyautogui.doubleClick() #双击鼠标左键
      
      pyautogui.rightClick()  #单击鼠标右键
      
      pyautogui.middleClick() #单击鼠标中键
      
    5. 键盘操作
      # 键入字符串
      pyautogui.write(raw_name)
      pyautogui.typewrite(字符串)
      # pyautogui.write('G:/SenseSRdata/vivo1938_rawdata2/iso_0_300_lr_raw_disk_08_11_noiseratio00/img199_iso279_20-0ms_x2_disk08_11_noiseratio00_003')
      pyautogui.PAUSE = interval      
      
      # 按键
      pyautogui.typewrite([键盘键字符串])
      pyautogui.press([键盘键字符串]) 
      
      # 组合热键
      pyautogui.hotkey('ctrl', 'a') # 全选
      
      # 热键字典
      见网址2
      
    6. 消息弹窗

      pyautogui.alert('这个消息弹窗是文字+OK按钮') pyautogui.confirm('这个消息弹窗是文字+OK+Cancel按钮') pyautogui.prompt('这个消息弹窗是让用户输入字符串,单击OK')

5.14.48 python发邮件

  1. 模块

    smtplib模块主要负责发送邮件,email模块主要负责构造邮件

  2. 授权码

    授权码,从设置-账户 作用:代替密码

  3. 封装的发邮件脚本 + windows 应用程序控制
    # 1. add automatic output path setting
    # 2. interactively get currentmouse position
    # 3. enable safe mode
    # 4. status check and set email alart
    
    import os
    import pyautogui
    import smtplib
    from email.mime.text import MIMEText
    from email.header import Header
    
    def status_check(num, num_bmps):
    # check if the software working correctly
        if num <= num_bmps:
            pass
        else:
            email_alart()
            raise AssertionError('The program stopped unnornally')
    
    def email_alart():
    # send an email to alart 
        host = 'smtp.qq.com'
        post = 465
    
        password = 'smaqseauflxobgdb'
    
        msg_from = '171864200@qq.com'
        msg_to = 'yangyixin@sensetime.com'
    
        subject = "数据仿真报错"
        content = "测试:数据仿真报错,请手动重启手机连接软件"
    
        msg = MIMEText(content)
        msg['Subject'] = subject
        msg['From'] = msg_from
        msg['To'] = msg_to
    
        try:
            # 通过ssl方式发送,服务器地址,端口
            s = smtplib.SMTP_SSL(host, post)
            # 登录到邮箱
            s.login(msg_from, password)
            # 发送邮件:发送方,收件方,要发送的消息
            s.sendmail(msg_from, msg_to, msg.as_string())
            print('成功')
        except s.SMTPException as e:
            print(e)
        finally:
            s.quit()
    
    def get_mouse_location():
        screenWidth, screenHeight = pyautogui.size() # Get the size of the primary monitor.
        currentMouseX, currentMouseY = pyautogui.position() # Get the XY position of the mouse.
        print(screenHeight, screenWidth, currentMouseX, currentMouseY)
    
    def get_mouse_location_interactively():
        print('Press Ctrl-C to quit.')
        try:
            while True:
                x, y = pyautogui.position()
                positionStr = 'X: ' + str(x).rjust(4) + ' Y: ' + str(y).rjust(4)
                print(positionStr, end='')
                print('\b' * len(positionStr), end='', flush=True)
        except KeyboardInterrupt:
            print('\n')
    
    def set_bmp_path(bmp_path):
        ### set output file name
        pyautogui.click(1056, 720)
        pyautogui.PAUSE = interval
    
        pyautogui.click(1056, 720)
        pyautogui.PAUSE = interval
    
        pyautogui.hotkey('ctrl', 'a')
    
        pyautogui.press('backspace')
        pyautogui.PAUSE = interval
    
        pyautogui.write(bmp_path)
        pyautogui.PAUSE = interval
    
        pyautogui.click(1056, 720)
        pyautogui.PAUSE = interval
    
    def autogui(interval, delay_per_raw, raw_name):
        ### safe mode: allow you to abort this program when moving mouse to the upper-left
        # open as default
        # pyautogui.FAILSAFE = True
    
        ### processing each file
        # click: clear
        pyautogui.click(1056, 720)
        pyautogui.PAUSE = interval
    
        # click: add
        pyautogui.click(901, 723)
        pyautogui.PAUSE = interval
    
        # type in raw_name
        pyautogui.write(raw_name)
        # pyautogui.write('G:/SenseSRdata/vivo1938_rawdata2/iso_0_300_lr_raw_disk_08_11_noiseratio00/img199_iso279_20-0ms_x2_disk08_11_noiseratio00_003')
        pyautogui.PAUSE = interval
    
        # click: open
        pyautogui.click(1548, 758)
        pyautogui.PAUSE = interval
    
        # click: select all
        pyautogui.click(584, 751)
        pyautogui.PAUSE = interval
    
        # click: batch
        pyautogui.click(662, 752)
        pyautogui.PAUSE = interval
    
        # wait for the end of processing
        pyautogui.PAUSE = delay_per_raw
    
        # click: clear
        pyautogui.click(1056, 720)
        pyautogui.PAUSE = interval
    
    def raw2bmp(raw_path, bmp_path, interval, delay_per_raw):
        # setting bmp file path in pissca
        # set_bmp_path(bmp_path)
    
        # start
        raws = sorted(os.listdir(raw_path.replace('\\', '/')))
        bmps = sorted(os.listdir(bmp_path.replace('\\', '/')))
        total_num = int(len(raws) / 3)
        num = 1
        for raw in raws:
            if raw.endswith('.raw'):
                img_name = raw.split('.')[0]
                if os.path.exists(bmp_path + '/' + img_name + '_0.bmp'):
                    print('%s/%s %s has a bmp file exists'%(num, total_num, raw))
                    num += 1
                else:
                    print('%s/%s start processing raw %s'%(num, total_num, raw))
                    num += 1
    
                    raw_name_win = raw_path + '/' + img_name
                    raw_name = raw_name_win.replace('/', '\\')
    
                    print(raw_name)
                    autogui(interval, delay_per_raw, raw_name)
    
            # check if .bmp file was saved successfully
            status_check(num - 1, len(sorted(os.listdir(bmp_path.replace('\\', '/')))))
    
    if __name__ == '__main__':
        # data root
        raw_path = r'G:\SenseSRdata\vivo1938_rawdata2\iso_0_300_lr_raw_disk_08_11_noiseratio00'
        bmp_path = r'G:\SenseSRdata\vivo1938_traindata\iso_0_300_lr_disk_08_11_noise00'
    
        interval = 1
        delay_per_raw = 15
    
        # get currentmousex, currentmousey
        # get_mouse_location_interactively()
    
        # main function for raw2bmp
        raw2bmp(raw_path, bmp_path, interval, delay_per_raw)     
    

5.14.49 try/raise AssertionError

assert expression
等价于
if not expression:
    raise AssertionError

try:
    os.mkdir(self.exp_dir)
    os.mkdir(self.log_dir)
    os.mkdir(self.checkpoint_dir)
    os.mkdir(self.sample)
    os.mkdir(self.web)
    os.mkdir(self.img)
    os.mkdir(self.test_dir)
    print('Creating: %s\n          %s\n          %s\n          %s\n          %s'% (self.exp_dir, self.log_dir, self.sample, self.checkpoint_dir, self.test_dir))
except NotImplementedError:
    raise Exception('Check your dir.')
except FileExistsError:
    pass

5.14.50 判断图像是否完全相等

如此简单!!!

open(img1,"rb").read() == open(img2,"rb").read()    

5.14.51 多GPU操作

  1. 基本概念
    设置可用的GPU ID
    import os
    os.environ['CUDA_VISIBLE_DEVICES'] = '0,1,2,3,4,5'
    print(torch.cuda.device_count()) # 显示当前所用的GPU个数    
    
    分布式多GPU计算:3种多线程的实现方式
    1. slurm -n4 --ntasks-per-node=4
    slurm初始化训练环境  指定task per node等  全局执行
        # 初始化分布式训练环境
        os.environ['SLURM_NTASKS']          #可用作world size
        os.environ['SLURM_NODEID']          #node id
        os.environ['SLURM_PROCID']          #可用作全局rank
        os.environ['SLURM_LOCALID']         #local_rank
        os.environ['SLURM_STEP_NODELIST']   #从中取得一个ip作为通讯ip
        os.environ['SLURM_TASKS_PER_NODE']  # 每个节点的GPU数目
        print('SLURM_NTASKS: %s SLURM_LOCALID: %s SLURM_NODEID: %s SLURM_PROCID: %s SLURM_STEP_NODELIST %s'%(str(os.environ['SLURM_NTASKS']), str(os.environ['SLURM_LOCALID']), str(os.environ['SLURM_NODEID']), str(os.environ['SLURM_PROCID']), str(os.environ['SLURM_STEP_NODELIST'])))
    
    2. -m torch.launch
    -m启动初始化训练环境                               全局执行
    os.environ['RANK'] WORLD_SIZE LOCAL_RANK
    
    3. mp.spawn
    mp分发                                                      局部执行
    
  2. 分布式多GPU计算,slurm环境
    初始化多个节点,多个GPU
    dist.init_process_group(backend=args.dist_backend, init_method=args.dist_url, world_size=args.world_size, rank=args.rank)
    
    分发模型到多个节点,多个GPU
    model = torch.nn.parallel.DistributedDataParallel(model)
    
    分发数据
    if args.distributed:
        train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset)     
    

5.14.52 pytorch

  1. 基本语法
    model.cuda() tensor.cuda()
    对模型和相应的数据使用,将内存中的数据复制到GPU的显存中去,torch.FloatTensor 变为 torch.cuda.FloatTensor (GPU 0)这样代表这个数据现在存储在GPU中
    
    优先使用model.to(device)
    model.to(device) 可以将model或者tensor迁移到GPU中
    但是model不用保存,tensor一定要返回value
    # tensor a is in CPU
    device = torch.device('cuda:0')
    b = a.to(device)
    # a is still in CPU!
    # b is in GPU!
    # a and b are different 
    
  2. 查看tensor的大小
    显示张量大小
    tensor.shape     
    list(tensor.size())
    
  3. 模型保存
    只保存参数:
    Save:
    torch.save(model.state_dict(), PATH)
    Load:
    model = TheModelClass(*args, **kwargs)
    model.load_state_dict(torch.load(PATH))
    model.eval()
    
    保存整个模型
    Save:
    torch.save(model, PATH)
    Load:
    # Model class must be defined somewhere
    model = torch.load(PATH)
    model.eval()
    
    来自 <https://pytorch.org/tutorials/beginner/saving_loading_models.html>      
    

5.14.53 time

  1. sleep
    # 中止1秒     
    import time 
    time.sleep(1)  
    
  2. 获取当前时间
    import datetime
    now_time = datetime.datetime.now()
    print(now_time)     
    

5.14.54 libtmux

python控制tmux命令行,批量处理代码

https://github.com/tmux-python/libtmux

  1. 示例
    import libtmux
    def main():
        path = 'run_code.txt'
    
        # 按行读取
        data = []
        with open('runcode2.txt','w') as f:
            for line in open(path, 'r'):
                if 'x1_' not in line and 'hr02_disk_0.8_1.1_noise_0.0_upx2_ps20200206' not in line and 'hr02_disk_0.8_1.1_noise_0.0_upx2_ps20200124mask' not in line:
                    if 'iso_0_300' in line:
                        if 'lr02_disk_0.8_1.1_noise_0.2_tele2_norm' in line or 'lr02_disk_0.8_1.1_noise_0.13_tele2_norm' in line:
                            continue
    
                    data.append(line)
                    f.write(line)
                    # f.write('\n')
    
        # send to tmux using libtmux
        server = libtmux.Server()
    
        session = server.find_where({"session_name": "session_test"})
        if session == None:
            session = server.new_session(session_name="session_test", kill_session=True, attach=False)
    
        start = 0
        number = 2
        for id in range(start, start + number):
            # print(id, data[id])
    
    
            # print(window)
            # print(session.list_windows())
            # for w in session.list_windows():
            #     print(w)
    
            window = session.select_window(id)
            if window == None:
                window = session.new_window(attach=True, window_name=str(id))
    
            pane = window.attached_pane
            pane.send_keys('cd /mnt/lustre21/DATAshare2/yangyixin/20200427')
            pane.send_keys(data[id])
    
  2. 发送按键
    https://github.com/tmux-python/libtmux/issues/15
    
    示例代码
    libtmux.Server().sessions[0].attached_window.panes[0].send_keys('C-c', enter=False, suppress_history=False)     
    
    详细清单:
    pane.send_keys('')
    send_keys automatically sends enter, unless you do enter=False:
    pane.send_keys('echo "Hi"', enter=False)
    
    tmux allows a command to be bound to most keys, with or without a prefix
    key. When specifying keys, most represent themselves (for example ‘A’ to
    ‘Z’). Ctrl keys may be prefixed with ‘C-’ or ‘^’, and Alt (meta) with
    ‘M-’. In addition, the following special key names are accepted: Up,
    Down, Left, Right, BSpace, BTab, DC (Delete), End, Enter, Escape, F1 to
    F20, Home, IC (Insert), NPage/PageDown/PgDn, PPage/PageUp/PgUp, Space,
    and Tab.
    

5.14.55 map-lambda函数

  1. 基本用法
    map(function,iterable,...)
    第一个参数接受一个函数名,后面的参数接受一个或多个可迭代的序列,返回的是一个集合。
    把函数依次作用在list中的每一个元素上,得到一个新的list并返回。注意,map不改变原list,而是返回一个新list。    
    
    示例一:
    del square(x):
        return x ** 2
    
    map(square,[1,2,3,4,5])
    
    # 结果如下:
    [1,4,9,16,25]
    
    示例二:
    map(lambdax, y : (x**y,x+y),[2,4,6],[3,2,1])
    
    # 结果如下
    [(8,5),(16,6),(6,7)]
    
  2. 实现类型转换
    将元组转换为list:
    map(int,(1,2,3))
    # 结果如下:
    [1,2,3]
    
    将字符串转换为list:
    map(int,'1234')
    # 结果如下:
    [1,2,3,4]
    
    提取字典中的key,并将结果放在一个list中:
    map(int,{1:2,2:3,3:4})
    # 结果如下
    [1,2,3]
    

5.14.56 print动态替换当前打印输出

end='\r'
print('processing %s/%s'%(count, total), end="\r")    

6 Matlab语言

6.1 知识补充 cell的使用

6.1.1 将矩阵保存到cell里面,从而用一个for循环索引cell的编号来画图

6.1.2 代码

cell(n) 创建一个n-by-n的空cell
cell{1,2} 索引cell中的第一行第二个矩阵元素
lines=cell([1 n]);创建一个1行n列的cell

6.2 for循环处理画图语句

row=3;
col=3;

M=cell(row*col);
figure;
for i = 1:row*col
        M{1,i} = I;
        subplot(row,col,i),imshow(M{1,i}),title(['\fontsize{16} Wiener filter with n=' num2str(i)]);
end
suptitle('DCT 4-by-4 basis images');

6.3 类 class 函数变量名: 变量名.成员变量

6.4 matlab中运行python代码

6.4.1 配置python环境

pyversion D:/anaconda/python.exe 该命令会添加python到matlab中
其中D:/anaconda/python.exe 是python解释器的路径    

6.4.2 使用方法及调试

https://blog.csdn.net/qq_28314803/article/details/84857166

Matlab的外部环境是支持python的,在matlab的安装路径 matlab\extern\engines里面,可以看到有python引擎存在的
直接再matlab命令行窗口输入pyversion,即可查看当前matlab下的python运行版本。
py.numpy.zeros([5,5])
这里提一下,当你输入py.numpy.后,可以按下tab健,这时会出现一些可用命令(方便吧)。
Matlab下的python命令全是以“py.”开头的,比如 py.numpy.reshape
这里numpy表示的是python下的numpy库,reshape和matlab里面的reshape作用一样

7 C++语言 & linux系统

7.1 vs code

7.1.1 c++

  1. 基本配置

    编译环境需要配置 -lstdc++

    示例: g++ -w -lstdc++ test.cpp test.o

    gcc可以编译c++文件,也可以编译c文件,但默认是编译c文件的,加-lstdc++表示编译c++文件,即链接c++库,加-lc表示链接c库,默认情况下就是链接c库,所以如果编译c文件可以不加-lc

  2. 使用技巧
    1. debug

      在函数最后一行return 0 添加断点,即可在左侧显示所有变量

7.2 windows下子系统linux搭建

7.2.1 安装ubuntu

https://blog.csdn.net/u012516524/article/details/79870414

  1. 开启win10开发者模式
  2. 启用或关闭windows功能->适用于Linux的 windows子系统,选中后点确定
  3. 在微软应用商店中安装ubuntu软件
  4. linux图形化界面安装 可能需要挂VPN
sudo apt-get update
sudo apt-get install xorg
sudo apt-get install xfce4

Xrdp允许Windows或Linux系统通过远程桌面的方式来访问另外一台主机
sudo apt-get install xrdp
sudo sed -i 's/port=3389/port=3390/g' /etc/xrdp/xrdp.ini
sudo echo xfce4-session >~/.xsession
sudo service xrdp restart
  1. 在windows搜索 远程桌面 应用 然后在“计算机”中输入“本机的IP:3390”以及Ubuntu中的用户名点击确定就可以了,所有的操作到这里就结束了 10.108.195.253:3390
  2. 远程桌面可以访问图形化界面
  3. ubuntu可以直接访问命令行

7.2.2 设置root命令并获取root权限

设置root权限及密码
sudo passwd root 

获取root权限
su root   

退出root权限       
exit

删除root权限
sudo passwd -l root  

7.2.3 安装必备package

sudo apt install gcc
sudo apt install g++
sudo apt install build-essential    

7.2.4 编译和运行

编译源程序
g++ test.cpp -o test.out

查看程序运行结果    
./a.out 

7.2.5 文件管理

与windows文件互通

路径为:/mnt 该路径下有windows硬盘分区C,D,E,F

可以直接打开windows桌面修改文件及其路径即可

7.2.6 ubuntu系统文件夹功能介绍

1./bin目录
/bin目录包含了引导启动所需的命令或普通用户可能用的命令(可能在引导启动后)。这些命令都是二进制文件的可执行程序(bin是binary-二进制的简称),多是系统中重要的系统文件。
2./sbin目录
/sbin目录类似/bin,也用于存储二进制文件。因为其中的大部分文件多是系统管理员使用的基本的系统程序,所以虽然普通用户必要且允许时可以使用,但一般不给普通用户使用。
3./etc 目录
/etc目录存放着各种系统配置文件,其中包括了用户信息文件/etc/passwd,系统初始化文件/etc/rc等。linux正是*这些文件才得以正常地运行。
4./root目录
/root目录是超级用户的目录。
5./lib目录
/lib目录是根文件系统上的程序所需的共享库,存放了根文件系统程序运行所需的共享文件。这些文件包含了可被许多程序共享的代码,以避免每个程序都包含有相同的子程序的副本,故可以使得可执行文件变得更小,节省空间。
6./lib/modules目录
/lib/modules目录包含系统核心可加载各种模块,尤其是那些在恢复损坏的系统时重新引导系统所需的模块(例如网络和文件系统驱动)。
7./dev目录
/dev目录存放了设备文件,即设备驱动程序,用户通过这些文件访问外部设备。比如,用户可以通过访问/dev/mouse来访问鼠标的输入,就像访问其他文件一样。
8./tmp目录
/tmp目录存放程序在运行时产生的信息和数据
9./boot目录
/boot 目录存放引导加载器 (bootstraploader)使用的文件,如lilo,核心映像也经常放在这里,而不是放在根目录中。但是如果有许多核心映像,这个目录就可能变得很大,这时使用单独的文件系统会更好一些。还有一点要注意的是,要确保核心映像必须在ide硬盘的前1024柱面内。
10./mnt目录
/mnt 目录是系统管理员临时装载(mount)文件系统的安装点。程序并不自动支持安装到/mnt。/mnt下面可以分为许多子目录,例如/mnt/dosa可能是使用msdos文件系统的软驱,而/mnt/exta可能是使用ext2文件系统的软驱,/mnt/cdrom光驱等等。
11./home目录
/home目录是所有普通用户的宿主目录所在地,在一般情况下,如果想要对用户进行磁盘限额功能,最好将此目录单独分区。
12./usr目录
/usr目录包含了所有的命令、说明文件、程序库等,此目录下有很多重要的目录,常见的有:/usr/local 这个目录包含管理员自己安装的程序;/usr/share 包含文件的帮助文件;/usr/bin 和/usr/sbin 包含了所有的命令。
13./var目录
/var目录包含了日志文件、计划性任务和邮件等内容。
14./media目录
/media目录主要用于挂载多媒体设备。    

7.2.7 环境变量设置

临时设置
export PATH=/opt/android-studio/bin:$PATH

当前用户的全局设置
vim ~/.profile,添加行:
export PATH=/opt/android-studio/bin:$PATH
使生效
source .profile    

所有用户的全局设置
vim /etc/profile
在里面加入:
export PATH=/opt/android-studio/bin:$PATH
使生效
source /etc/profile

7.2.8 ssh登录用法

ssh yangyixin@10.106.20.31

7.2.9 vim编辑器基本使用方法

Ecs 切换输入模式和命令模式

  1. 文件管理
    :q  退出
    :wq 保存并退出
    :q! 不保存并退出
    :w 保存
    :w! 强行保存
    :wq --> :x
    
  2. 编辑
    i: 在当前光标所在字符的前面,转为输入模式;
    a: 在当前光标所在字符的后面,转为输入模式;
    o: 在当前光标所在行的下方,新建一行,并转为输入模式;
    I:在当前光标所在行的行首,转换为输入模式
    A:在当前光标所在行的行尾,转换为输入模式
    O:在当前光标所在行的上方,新建一行,并转为输入模式;    
    

7.2.10 ssh之后退出当前登录

exit

7.2.11 OpenCV安装

  1. 安装相关软件包
    sudo apt install  build-essential
    
    sudo apt install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev  
    
    sudo apt install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev    
    
    无法定位软件包libjasper-dev 的错误提示 的解决方案
    sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
    sudo apt update
    sudo apt upgrade
    sudo apt install libjasper1 libjasper-dev
    
  2. 用 CMake 从 Source 构建 OpenCV
    在源码source build之外创建build文件夹
    cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ../sources     
    
    cmake-gui 图形化界面
    
  3. 编译运行 安装OpenCV库
    make -j7 # runs 7 jobs in parallel
    sudo make install     
    
  4. 配置环境
    打开一个空白配置文件路径
    sudo vim /etc/ld.so.conf.d/opencv.conf     
    键入:
    /usr/local/lib  
    
    使刚才配置生效
    sudo ldconfig 
    
    配置bash 
    sudo vim /etc/bash.bashrc  
    在文末添加
    PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig  
    export PKG_CONFIG_PATH  
    
    使刚才配置生效
    source /etc/bash.bashrc  
    
    最后更新
    sudo updatedb 
    
  5. 测试 opencv需要有图形化界面才能显示
    1. 编译+运行命令
      cmake .
      make
      ./opencv_example     
      
    2. CMakeLists 文件内容
      # cmake needs this line
      cmake_minimum_required(VERSION 3.1)
      
      # Enable C++11
      set(CMAKE_CXX_STANDARD 11)
      set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
      
      # Define project name
      project(opencv_example_project)
      
      # Find OpenCV, you may need to set OpenCV_DIR variable
      # to the absolute path to the directory containing OpenCVConfig.cmake file
      # via the command line or GUI
      find_package(OpenCV REQUIRED)
      
      # If the package has been found, several variables will
      # be set, you can find the full list with descriptions
      # in the OpenCVConfig.cmake file.
      # Print some message showing some of them
      message(STATUS "OpenCV library status:")
      message(STATUS "    config: ${OpenCV_DIR}")
      message(STATUS "    version: ${OpenCV_VERSION}")
      message(STATUS "    libraries: ${OpenCV_LIBS}")
      message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")
      
      # Declare the executable target built from your sources
      add_executable(opencv_test opencv_test.cpp)
      
      # Link your application with OpenCV libraries
      target_link_libraries(opencv_test LINK_PRIVATE ${OpenCV_LIBS})      
      

7.2.12 anaconda安装

  1. 步骤
    1. 安装下载下来的安装包
    bash ~/Downloads/Anaconda3-5.2.0-Linux-x86_64.sh
    
    2. conda: command not found ,解决方法是立即生效环境变量 
    source的用法:用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录
    source ~/.bashrc
    
    3. 手动修改环境变量
    vi ~/.bashrc
    在bashrc文件的最后添加:export PATH="/home/用户名/anaconda3/bin:$PATH"。(vi编辑器中按i进入编辑模式)
    添加完按esc退出编辑模式,并按:x(保存并退出)
    最后需要更新.bashrc:
    source ~/.bashrc
    

7.2.13 必备操作集锦

  1. 基本命令使用
    复制文件或目录
    cp [options] source dest     
    sudo cp sources.list sources.list.bak
    
    修改文件名
    mv 文件名 文件名	将源文件名改为目标文件名
    mv 文件名 目录名	将文件移动到目标目录
    mv 目录名 目录名	目标目录已存在,将源目录移动到目标目录;目标目录不存在则改名
    
    系统版本号查询
    lsb_release -a
    uname -a
    cat /proc/version
    
    查询某文件夹所占内存的大小
    du -sh /home/yangyixin/cpp
    
    查询当前路径下的所有文件信息
    ls -lhi
    
    删除文件、文件夹
    rm -rf /var/log/httpd/access
    -r 就是向下递归,不管有多少级目录,一并删除;
    -f 就是直接强行删除,不作任何提示的意思。
    
    linux硬链接与软链接
    内容-用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;
    文件名-元数据则是文件的附加属性,如文件名、文件大小、创建时间、所有者、文件所在的inode等信息。
    在 Linux 中,元数据中的 inode 号(inode 号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。如图1:
    
  2. 要通过远程桌面连接linux子系统 必须先启动xrdt服务

    命令为;

    重启xrdp服务
    sudo service xrdp restart
    
    获取本机IP地址
    ipconfig
    
  3. 在linux环境中使用emacs

    通过apt-get install emacs命令直接安装emacs编辑器即可提供类似 vim的文本编辑功能 退出文件的命令为:C-x C-c

  4. apt-get命令
    sudo apt-get update  更新源
    sudo apt-get install package 安装包
    sudo apt-get remove package 删除包
    sudo apt-cache search package 搜索软件包
    sudo apt-cache show package  获取包的相关信息,如说明、大小、版本等
    sudo apt-get install package --reinstall  重新安装包
    sudo apt-get -f install  修复安装
    sudo apt-get remove package --purge 删除包,包括配置文件等
    sudo apt-get build-dep package 安装相关的编译环境
    sudo apt-get upgrade 更新已安装的包
    sudo apt-get dist-upgrade 升级系统
    sudo apt-cache depends package 了解使用该包依赖那些包
    sudo apt-cache rdepends package 查看该包被哪些包依赖
    sudo apt-get source package  下载该包的源代码
    sudo apt-get clean && sudo apt-get autoclean 清理无用的包
    sudo apt-get check 检查是否有损坏的依赖     
    
  5. apt-get更新源替换为国内镜像
    1. 清华

      https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/ 方法同中科大版本,只需要将列表内容替换为清华网站上对应ubuntu版本 版本信息获取方式:

      lsb_release -a
      
    2. 中科大

      https://blog.csdn.net/zgljl2012/article/details/79065174/

       1、原文件备份
       sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 
      
       2、编辑源列表文件
       cd /etc/apt/
       sudo vim /etc/apt/sources.list
      
       3、将原来的列表删除,添加如下内容(中科大镜像源)
       deb http://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse
       deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
       deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
       deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse
       deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
       deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse
       deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
       deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
       deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse
       deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
      
       4、运行
      sudo apt-get update
      sudo apt-get upgrade
      
  6. linux环境下python安装
     1. 下载安装包 默认下载完成后的保存路径为~/Downloads
     wget下载下来的文件有问题,直接从官网挂VPN下载源码即可
     wget https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tgz   
    
     2. 解压缩文件
     sudo tar -xvf Python-3.6.9.tgz -C /usr/local
    
     3. 编译
     路径为:/usr/local/Python-3.6.9 需要加入--with-ssl,否则pip无ssl模块将无法使用
     ./configure --with-ssl --prefix=/usr/local/Python-3.6.9 
    
     4. 安装
     make
     make install 
    
     5. 创建新版本的软链接
     修改旧版本
     mv /usr/bin/python /usr/bin/python_bak
    
     6.创建新的软连接 
     当前python3.6版本的可执行程序的位置:/usr/local/Python-3.6.9/bin/python3
     python命令对应的的位置:/usr/bin/python
     mkdir -p /usr/local/python
     ln -s /usr/local/Python-3.6.9/bin/python3 /usr/bin/python
     建立pip3.6可执行程序的软链接
     ln -s /usr/local/Python-3.6.9/bin/pip3.6 /usr/bin/pip
    
     6. 软链接建立流程
     备份原有/usr/bin/python /usr/bin/pip 通过重命名 或者直接删除如果不需要保存的话 rm -rf /usr/bin/python
     mv /usr/bin/python /usr/bin/python_bak
     mv /usr/bin/pip /usr/bin/pip_bak
    
     建立可执行程序的软链接
     ln -s /usr/local/Python-3.6.9/bin/python3 /usr/bin/python
     ln -s /usr/local/Python-3.6.9/bin/pip3.6 /usr/bin/pip
    
     7.直接添加环境变量 即可
     emacs ~/.bash_profile   或者为~/.bashrc
     export PATH=$PATH:$HOME/bin:/usr/local/Python-3.6.9/bin
    
     之后需要执行环境变量
     source ~/.bash_profile  或者为~/.bashrc
    
     8.检查python的版本
     python -V
     python-3.6.0
     软连接创建成功
    
     9.安装pip3
    sudo apt install pip3
    
  7. anaconda路径修改之后软链接重新对应方法
    1. 修改环境变量
      emacs ~/.bashrc
      export PATH=$PATH:$HOME/bin:/usr/local/Python-3.6.9/bin
    
    2. 修改软链接指向位置
    需要修改的软链接有两个
    anaconda/bin/conda  >> /usr/bin/conda 
    anaconda/etc/profile.d/conda.sh   >>   /etc/profile.d/conda.sh
    
    具体执行命令
    首先备份链接
    sudo mv /usr/bin/conda /usr/bin/conda.bak
    sudo mv /etc/profile.d/conda.sh /etc/profile.d/conda.sh.bak
    
    然后添加软链接
    sudo ln -s /path-to-anaconda/anaconda/bin/conda /usr/bin/conda 
    sudo ln -s /path-to-anaconda/anaconda/etc/profile.d/conda.sh /etc/profile.d/conda.sh      
    

7.3 windows下gcc g++平台搭建

需要安装g++ gcc编译平台 MinGw安装 g++ 是调用c++编辑器的驱动 gcc是调用c 编辑器的驱动 之后需要将D:\mingw\bin添加到环境变量 安装成功标志: gcc -v g++ -v 并且bin中有gcc g++ gdb 3个exe

需要安装修改mingw中的make.exe名字

7.4 Makefile环境搭建

7.4.1 make命令

  1. make命令在windows环境下需要安装mingw
  2. 修改mingw32-make.exe 更名为make.exe

7.4.2 makefile的生成

新建无格式的文本,注意不能为txt,名字为:Makefile 格式一定是TAB不能为4个空格

7.4.3 Makefile书写规范

  1. 通用规范
    1. 命令行前面不是4个空格,一定是1个TAB
    2. 删除编译的中间.o文件

      该段代码一定要放到Makefile的末尾

      .PHONY: clean
       clean:
           -rm -rf *.o        
      
    3. 核心思路
      1. 建立依赖关系 output : prerequist
      2. 生成命令 gcc g++
  2. 便捷写法
    1. 依赖关系简化
      1. 简化符号

          $^ 代表所有的依赖文件 即指向add.c sub.c

          $@ 代表所有的目标文件 所有的.out

          $< 代表第一个依赖文件 即指向main.c

      2. 代码示例
        main: main.o add.o sub.o
        main.o: main.c  
            gcc -c $< -o $@
        add.o: add.c
            gcc -c $^ -o $@  
        sub.o: sub.c
            gcc -c $^ -o $@
        
        clean:
            rm -rf *.o       
        
    2. 常量表示
      1. 代码示例 c
        OBJS = main.o add.o sub.o
        main: $(OBJS) 
        %.o : %.c
            gcc -c $^ -o $@
        
        clean:
            -rm -rf $(OBJS)       
        
      2. 代码示例 cpp
        OBJS = main.cpp add.cpp sub.cpp
        main: $(OBJS) 
        %.exe : %.cpp
            g++ $^ -g -o $@
        
        clean:
            -rm -rf $(OBJS)       
        
  3. cpp
    1. 最简单的g++ 编译cpp的Makefile代码示例
      test: test.cpp
          g++ test.cpp -g -o test.exe
      
  4. c
    1. 最简单的gcc 编译c的Makefile示例代码

      注意 .c 一定要有中间.out 也就是说-c编译过程

      hello: hello.o    
      hello.o: hello.c
          gcc -c hello.c -o hello.o
      

7.4.4 重要问题

  1. windows是无法直接执行.out文件的

    linux下可以用./a.out直接执行

    解决方案:生成.exe即可

  2. g++ 与 gcc的用法区别
    1. gcc 必须先用 -c -o 编译生成.out文件,之后在.exe
    2. g++ 可以直接指定 -o 输出为.exe即可,不能输出.out
  3. windows下无法执行.out文件

    linux可以g++生成.out之后直接./a.out即可

7.4.5 大型程序

1)对于大型的project,我们可以新建一个src目录,将各个模块的源文件放在其下

2)对于编译产生的中间文件,我们可以新建一个build目录,并将其置于其下

3)对于产生的最终目标文件,我们可以新建一个bin目录,并将其置于其下

4)对于编译链接,我们可以采用范性编程的思想,利用find和patsubst等命令来构造sources和objects等变量

7.5 SDK 软件开发工具包:opencv等库的安装及使用

7.5.1 依赖

安装cmake vs opencv

工作流程:

  1. 下载OpenCV source code
  2. 新建build文件夹保存编译文件
  3. 运行cmake 命令,使用Mingw作为generator
  4. make + install
mkdir build
cd build
cmake -S d:/opencv/sources -B d:/opencv/build -G "MinGW Makefiles"
mingw32-make -j 8    已经手动将mingw中的mingw32-make重命名为了make 
mingw32-make install   结果:build路径下出现build\install文件夹
添加环境变量build\install\x64\mingw\bin

7.5.2 通过cmake编译opencv库生成opencv.sln文件

命令 其中d:/opencv为下载的源文件路径

cmake-gui 更优的图形处理编译工具 必须指定mingw作为编译器 clear the cache to make it reappear
cmake -S d:/opencv/sources -B d:/opencv/build -G "MinGW Makefiles"

7.5.3 编译和安装

上一步已经生成了makefiles

接下来make

7.5.4 基本知识

  1. SDK

    UI,user interface:人和程序交互的地方 API: 应用程序编程接口 SDK: 开发集成工具环境,API就是数据接口。在SDK环境下调用API数据

7.6 ubuntu及oracal虚拟机 (过时)

Get a virtual machine (VM) with Ubuntu 16.04 (Xenial): make your own, re-use one you have, or download a ready-made one from https://my.syncplicity.com/share/wvfndte4grz0jgl/Ubuntu_16.04_i386 (1.8 GB)

  1. Install the latest Oracle Virtual Box from http://virtualbox.org/
  2. Install VirtualBox Extension Pack from the same website (needed

Oracle和ubuntu都可以从官网下载

需要在cpu configuration 中开启硬件虚拟化

7.7 可以直接用成熟的Windows shell程序

MobaXterm

7.8 MobaXterm 连接bender

只能用linux虚拟机打开bender
ssh -X yiyang@bender.ee.ucr.edu
@aowMStsWHpPyr(GD3UV   

ssh -X yiyang@hermesconrad.engr.ucr.edu

srun --gres=gpu python test2.py

rm -rf sgemm-tiled

git pull origin master

exit 退出bender系统

7.9 cygwin 类Unix的Windows端软件

可以将windows的命令行变成一个可以直接运行cpp文件的shell

7.10 在emacs中编译 运行cpp文件

7.10.1 代码调试逻辑

  1. 在c++ mode 中写入代码
  2. 用F9直接编译生成a.exe文件,并运行a.exe可执行文件
  3. 确认编译通过之后,用F5执行编译+运行命令直接输出结果
  4. 直接在cpp中打印想要查看的变量,通过F5运行来查看结果
  5. 使用命令M-x gdb打开调试窗口,并对程序进行测试

7.10.2 一键编译并运行c++ mode

init.el设置代码,并将命令绑定到快捷键F5

;;一键快速编译并运行 C++-mode
;;一键快速编译并运行 C++-mode
(defun your-g++-compile-and-run ()
  (interactive)
  (compile (format "g++ %s -g -o %s && %s " (buffer-name (current-buffer)) (substring (buffer-name (current-buffer)) 0 -4) (substring (buffer-name (current-buffer)) 0 -4))))
(global-set-key [(f5)] 'your-g++-compile-and-run)  ;;快捷键F9

7.10.3 一键编译C++ mode

init.el设置代码 将编译命令绑定到F9 研究lisp语言 http://www.bagualu.net/wordpress/archives/6596#sec-6-4

;;一键快速编译 C++-mode
(defun quick-compile ()
  "A quick compile funciton for C++"
  (interactive)
  (compile (concat "g++ " (buffer-name (current-buffer)) " -g -o " (substring (buffer-name (current-buffer)) 0 -4)))
  )
(global-set-key [(f9)] 'quick-compile)  ;;快捷键F9

7.10.4 一键打印输出变量的值 调试方法

  1. 方法一

    在cpp代码中加入调试代码范例 https://blog.csdn.net/a1323933782/article/details/86775738

    调试阶段:
    定义调试语句
    #define DebugP(x) std::cout << "Line" << __LINE__ << "	" << #x << "=" << x << std::endl
    
    输出变量名
    DebugP(a); DebugP(b);
    
    提交阶段:
    只需要将调试语句修改为以下即可
    #define DebugP
    
    注意事项:不要在调用DebugP的时候对变量进行任何操作!错误示范:DebugP(a++);
    

7.10.5 打开命令行工具的方法

M-x shell 好用,另开一个shell buffer 
M-m ! 直接在buffer的缓冲区打开一个shell命令输入接口    

7.10.6 编译/执行命令

-g 表示生成可执行调试文件 -o指定输出文件名 -c指定只编译 输出.out

编译生成.out object file

g++ test.cpp -g -o test.exe 
.\test  最新的win10支持 .\来运行
dir == ls 查看当前目录下的所有文件    

7.10.7 编译环境配置

  1. 简单的单文件脚本
    g++ -g -o test.cpp test.exe     
    
  2. 大型程序

    Makefile

7.10.8 必备操作集锦

  1. 多行代码块批量缩进

    不同于python EIN模式,c++ mode可以直接选中区域,TAB即可

7.11 debug gdb

7.11.1 emacs打开方式

M-x gud-gdb 或者直接在shell中键入命令 gdb test.exe

7.11.2 基本调试语法

  1. 设置断点
    break 函数名
    
    break 行号
    
    break 文件名:函数名
    
    break 文件名:行号
    
    break +偏移量
    
    break -偏移量
    
    break *地址
    
    info break查看断点列表     
    
  2. 删除断点
    delete <断点id>:删除指定断点
    
    delete:删除所有断点
    
    clear
    
    clear 函数名
    
    clear 行号
    
    clear 文件名:行号
    
    clear 文件名:函数名     
    
  3. 运行 run r
  4. 变量显示
    p {var1, var2, var3} 一行显示多个变量
    display {var1, var2, var3} 跟踪自动显示     
    
  5. 单步执行

    单步执行有两个命令next和step,两者的区别是next遇到函数不会进入函数内部,step会执行到函数内部。

    如果需要逐条汇编指令执行,可以分别使用nexti和stepi。

  6. 改变变量的值

    “通过set variable <变量>=<表达式>”来修改变量的值。

7.12 C++基本语法

7.12.1 基本符号

  1. <<endl

    相当于换行符号 \n == <<endl

    其中<<表示向屏幕传递多个参数

    cout << "type: \t\t" << "************size**************"<< endl; 
    
  2. ->

    https://blog.csdn.net/a6333230/article/details/99674661 ->用于指针

    ->用于指向结构体的指针

    ->用于指向结构体的指针,表示结构体内的元素

  3. ::
    1. 表示作用域,和所属关系
    2. 代码示例
      python中 class A.add()
      cpp中 class A::add()      
      
  4. ? :

    三目条件运算符 A ? B : C 如果A为真,输出B 如果A为假,输出C

7.12.2 函数用法

  1. int main()

    https://blog.csdn.net/zhaobinbin2015/article/details/81007737 固定用法: 在程序体中 Argc 表示输入参数的个数, Argv 表示输入的参数 [0] [1]…

    #include
    int main(int argc, char ** argv)
    {
        int i;
        for (i=0; i < argc; i++)
            printf(“Argument %d is %s.\n”, i, argv[i]);
        return 0;
    }
    
    argv[0] 是程序全名 test.exe
    
  2. 关键字
    1. 存储类
      1. auto

        https://www.cnblogs.com/KunLunSu/p/7861330.html auto可以在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型,类似的关键字还有decltype。举个例子:

        int a = 10;
        auto au_a = a;//自动类型推断,au_a为int类型
        cout << typeid(au_a).name() << endl;
        

        typeid运算符可以输出变量的类型。程序的运行结果输出了

      2. Register存储类

        https://www.runoob.com/cplusplus/cpp-storage-classes.html register 存储类用于定义存储在寄存器中而不是 RAM 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个词),且不能对它应用一元的 '&' 运算符(因为它没有内存位置)。

      3. static 存储类

        https://www.runoob.com/cplusplus/cpp-storage-classes.html static 存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。

        static 修饰符也可以应用于全局变量。当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。

        在 C++ 中,当 static 用在类数据成员上时,会导致仅有一个该成员的副本被类的所有对象共享。

      4. threadlocal 存储类

        使用 threadlocal 说明符声明的变量仅可在它在其上创建的线程上访问。 变量在创建线程时创建,并在销毁线程时销毁。 每个线程都有其自己的变量副本。 threadlocal 说明符可以与 static 或 extern 合并。 可以将 threadlocal 仅应用于数据声明和定义,threadlocal 不能用于函数声明或定义。 以下演示了可以被声明为 threadlocal 的变量: https://www.runoob.com/cplusplus/cpp-storage-classes.html

    2. using关键字

      https://jingyan.baidu.com/article/f3ad7d0f720d9809c3345bc5.html

      1. 定义using namespace来声明命名空间,后续使用到命名空间中的内容都不需要添加命名空间
      2. using关键字可以设置别名
      3. using还可以重写设置访问权限,首先定义下图所示的两个类,子类私有继承基类,子类中将基类中的变量a,重写设置访问权限为public
    3. Extern关键字

      https://www.runoob.com/cplusplus/cpp-variable-types.html extern 关键字在任何地方声明一个变量,虽然您可以在 C++ 程序中多次声明一个变量,但变量只能在某个文件、函数或代码块中被定义一次。

      Extern int a, b, c 变量声明:
      Int a, b, c  变量定义:
      

      用法详解

      File A.cpp
      extern int a //声明变量a
      a = 1;               //定义变量a
      Int a;               //定义变量a
      
      File B.cpp
      extern int    //声明变量a
      

      只能定义一次不同文件中的声明就是引用该变量的数值

7.12.3 字符常量、转义字符、运算符、循环体

7.12.4 数组

https://www.runoob.com/cplusplus/cpp-arrays.html

在 C++ 中要声明一个数组,需要指定元素的类型和元素的数量,如下所示:

type arrayName [ arraySize ];

double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};

int threedim[5][10][4];   //多维数组

7.12.5 指向数组的指针

  1. 指针运算符* &
    1. 易混淆含义
      int *p = & a 中
      实际上的表述应为 int* p = & a 也即=右边的表达式应该为一个指针 这里之所以写成Int *p是为了便于多个变量赋值的时候含义明确      
      
    2. 说明
      数组名 是指向&balance[0]的指针,即数组第一个元素的地址
      &是取址运算符,表示后面变量地址    &a
      *是取值运算符,表示取出存放在p位置的值
      Int *p = &a     //把指针p指向存放变量a的地址
      a 变量
      &a 存放a的地址
      P 指针/内存位置
      *p p指针指向地址存放的值    
      
      指针是一个变量,其值为其所指向的变量的地址
      

      2019-10-19_17-45-05_screenshot.png

  2. 引用符号int& r = i;

    这里表示r 是 i的别名 他们的值同时变化,并且引用的时候必须初始化

  3. int* a与 int *a

    int* a跟int *a是一样的,只是int *a更严谨,

7.12.6 字符串序列

string类包含了所需的标准库

7.12.7 时间和日期

使用日期和时间相关的函数和结构,需要在 C++ 程序中引用 <ctime> 头文件

7.12.8 c++的基本输入输出

<iostream>	该文件定义了 cin、cout、cerr 和 clog 对象,分别对应于标准输入流、标准输出流、非缓冲标准错误流和缓冲标准错误流。
<iomanip>	该文件通过所谓的参数化的流操纵器(比如 setw 和 setprecision),来声明对执行标准化 I/O 有用的服务。
<fstream>	该文件为用户控制的文件处理声明服务。我们将在文件和流的相关章节讨论它的细节。    

标准输入输出示例

#include <iostream>

using namespace std;

int main( )
{
   char name[50];

   cout << "请输入您的名称: ";
   cin >> name;
   cout << "您的名称是: " << name << endl;

}

cerr: 非缓冲,当即显示 clog: 缓冲,延迟显示

7.12.9 public private

  1. 基本说明

    类的一个特征就是封装,public和private作用就是实现这一目的。所以:

    用户代码(类外)可以访问public成员而不能访问private成员;private成员只能由类成员(类内)和友元访问。

  2. 代码示例
    class Point
    {
    public:
      void setPoint(int x, int y) //实现setPoint函数
      {
        xPos = x;
        yPos = y;
      };
      void printPoint() //实现printPoint函数
      {
        cout<< "x = " << xPos << endl;
        cout<< "y = " << yPos << endl;
      };
    private:
      int xPos;
      int yPos;
    };
    
    class Point2
    {
    public:
      void setPoint(int x, int y);
      void printPoint();
    
    private:
      int xPos;
      int yPos;
    };     
    

7.12.10 vector向量

  1. 初始化
    #include<vector>
    vector<int> a ;                                //声明一个int型向量a
    vector<int> a(10) ;                            //声明一个初始大小为10的向量
    vector<int> a(10, 1) ;                         //声明一个初始大小为10且初始值都为1的向量
    vector<int> b(a) ;                             //声明并用向量a初始化向量b
    vector<int> b(a.begin(), a.begin()+3) ;        //将a向量中从第0个到第2个(共3个)作为向量b的初始值     
    
    int n[] = {1, 2, 3, 4, 5} ;
    vector<int> a(n, n+5) ;              //将数组n的前5个元素作为向量a的初值
    vector<int> a(&n[1], &n[4]) ;        //将n[1] - n[4]范围内的元素作为向量a的初值
    
  2. 元素输入与访问

    同数组一样 vector<int> a

    那么调用为: a[0]

  3. 向量的基本操作
     1. a.size()                 //获取向量中的元素个数
    2. a.empty()                //判断向量是否为空
    3. a.clear()                //清空向量中的元素
    4. 复制
        a = b ;            //将b向量复制到a向量中
    5. 比较
        保持 ==、!=、>、>=、<、<= 的惯有含义 ;
        如: a == b ;    //a向量与b向量比较, 相等则返回1
    6. 插入 - insert
        ①、 a.insert(a.begin(), 1000);            //将1000插入到向量a的起始位置前
        ②、 a.insert(a.begin(), 3, 1000) ;        //将1000分别插入到向量元素位置的0-2处(共3个元素)
        ③、 vector<int> a(5, 1) ;
            vector<int> b(10) ;
            b.insert(b.begin(), a.begin(), a.end()) ;        //将a.begin(), a.end()之间的全部元素插入到b.begin()前
    7. 删除 - erase
        ①、 b.erase(b.begin()) ;                     //将起始位置的元素删除
        ②、 b.erase(b.begin(), b.begin()+3) ;        //将(b.begin(), b.begin()+3)之间的元素删除
    8. 交换 - swap
        b.swap(a) ;            //a向量与b向量进行交换     
    
  4. 二维向量
    vector< vector<int> > b(10, vector<int>(5));        //创建一个10*5的int型二维向量     
    
  5. 成员函数
    c.assign(beg,end)c.assign(n,elem)
      将[beg; end)区间中的数据赋值给c。将n个elem的拷贝赋值给c。
    c.at(idx)
      传回索引idx所指的数据,如果idx越界,抛出out_of_range。
    c.back()      // 传回最后一个数据,不检查这个数据是否存在。
    c.begin()     // 传回迭代器中的第一个数据地址。
    c.capacity()  // 返回容器中数据个数。
    c.clear()     // 移除容器中所有数据。
    c.empty()     // 判断容器是否为空。
    c.end()       // 指向迭代器中末端元素的下一个,指向一个不存在元素。
    c.erase(pos)  // 删除pos位置的数据,传回下一个数据的位置。
    c.erase(beg,end)  //删除[beg,end)区间的数据,传回下一个数据的位置。
    c.front()     // 传回第一个数据。
    get_allocator // 使用构造函数返回一个拷贝。
    c.insert(pos,elem)    // 在pos位置插入一个elem拷贝,传回新数据位置。
    c.insert(pos,n,elem)  // 在pos位置插入n个elem数据。无返回值。
    c.insert(pos,beg,end) // 在pos位置插入在[beg,end)区间的数据。无返回值。
    c.max_size()       // 返回容器中最大数据的数量。
    c.pop_back()       // 删除最后一个数据。
    c.push_back(elem)  // 在尾部加入一个数据。
    c.rbegin()         // 传回一个逆向队列的第一个数据。
    c.rend()           // 传回一个逆向队列的最后一个数据的下一个位置。
    c.resize(num)      // 重新指定队列的长度。
    c.reserve()        // 保留适当的容量。
    c.size()           // 返回容器中实际数据的个数。
    c1.swap(c2)
    swap(c1,c2)        // 将c1和c2元素互换。同上操作。
    operator[]         // 返回容器中指定位置的一个引用。     
    

7.12.11 unordered-map 字典

  1. 使用方法
    #include <unordered_map>     
    
    unordered_map<int, string> myMap={{ 5, "张大" },{ 6, "李五" }};//使用{}赋值
    myMap[2] = "李四";  //使用[ ]进行单个插入,若已存在键值2,则赋值修改,若无则插入。
    myMap.insert(pair<int, string>(3, "陈二"));//使用insert和pair插入
    
    auto iterator = myMap.find(2);//find()返回一个指向2的迭代器
    
  2. .end()

    如果.find()查找不到该元素,则返回.end()

7.12.12 构造函数和析构函数 类对象的初始化赋值和分配空间清除

  1. 作用

    构造函数:初始化内存空间,初始化class中的值 好处在于

    可以直接写 Line line(10.0); 这样的格式直接给class Line内部的元素len赋值为10.0

    析构函数:删除所分配的资源

  2. 构造函数

    1)、类的成员函数名和类名相同

    2)、定义时可带有参数

    3)、没有返回值类型声明

    4)、在没有提供构造函数时,通过类名声明对象会调用默认的构造函数

    5)、一般情况下我们需要手工调用构造函数

  3. 析构函数

    1)、C++中的类可以定义一个特殊的成员函数清理对象,这个特殊的成员函数叫析构函数

    2)、析构函数没有任何参数和返回值类型

    3)、析构函数在对象销毁时自动调用

  4. 代码示例

7.12.13 :: -> :

  1. ->

    用于指向结构体的指针,整个语句功能,对指针指向的结构体的成员元素进行赋值

    struct role *w //定义一个结构体指针
    w - > level  //对结构体中的成员变量level进行赋值
    
  2. ::
    1. 用法1 作用域限定符

      如果a的作用域为类ww时,调用a时用

      作用域限定符,当在类体中直接定义函数时,不需要在函数名字的前面加上类名,但是在类体外实现函数定义的时候,必须加上类名并且加上作用域限定

      C++为例避免不同的类有名称相同的成员而采用作用域的方式进行区分

      class ww
      {
        public:
          int a();
      }
      int ww::a()//表示test是属于A的
      {
       return 0;
      }
      
    2. 用法2

      调用静态变量

      class Point
      {
      public:
        static int cPos;
      };
      
      int Point::cPos = 10;
      
      int main(){
          cout<< "cPos = " << M.cPos << endl;
      };
      
  3. : 函数定义中初始化列表

    下面两种语法等效

    1. 用法示例

      两种写法完全等效

      ListNode(int x) { val = x; next = NULL;} 
      ListNode(int x) : val(x), next(NULL) {}
      
    2. 初始化列表
      Line::Line( double len): length(len)
      {
          cout << "Object is being created, length = " << len << endl;
      }      
      
    3. 正常函数
      Line::Line( double len)
      {
          length = len;
          cout << "Object is being created, length = " << len << endl;
      }      
      

7.12.14 new关键字的

  1. 用法

    实际上相当于3部

    1. 调用operator new分配内存,operator new (sizeof(A))
    2. 调用构造函数生成类对象,A::A()
    3. 返回相应指针

    另外也可以用两行代码来替代

    ListNode l1(1)
    ListNode *phead = &l1
    
  2. 代码书写
    string *ps = new string("hello world");
    ListNode* pNode = new ListNode(0);     
    

7.12.15 typedef

用typedef简化复杂的声明和定义 相当于给某种复杂的数据类型起一个别名,方便多次使用

7.12.16 template 模板

使用模板的目的就是能够让程序员编写与类型无关的代码

  1. 函数模板
    template<typename T> // 这里typename关键字可以换为 class T为形参
    int compare(const T& left, const T& right) {
      if (left < right) {
        return -1; 
      }
      if (right < left) {
        return 1; 
      }
      return 0;
    }
    
    compare<int>(1, 2); //使用模板函数
    
    template <模板形参表>
    <返回值类型>  <函数名>(模板函数形参表)
    {
          //函数定义体
    }     
    
  2. 类模板

    类模板与函数模板的区别在于作用域不同,一个作用于函数一个作用于类

    template <class T>
    class Stack { 
      private: 
        vector<T> elems;     // 元素 
    
      public: 
        void push(T const&);  // 入栈
        void pop();               // 出栈
        T top() const;            // 返回栈顶元素
        bool empty() const{       // 如果为空则返回真。
            return elems.empty(); 
        } 
    };      
    

7.12.17 #define语句

相当于简单的文本替换,跟函数有区别

#define MAXTIME 1000

跨平台和系统的大型软件,进行条件编译

#ifdef WINDOWS
……
……
#endif
#ifdef LINUX
……
……
#endif

7.13 c++代码书写

7.13.1 写法规范

  1. 与python不同,cpp中每一行结尾都需要加上;
  2. 函数前面 标识return返回值的数据类型比如Int void float
  3. 函数体用大括号,输入参数后面直接换行大括号即可
  4. 大括号内部必须进行缩进
  5. 指针的写法: int* a

7.13.2 代码示例

#include <iostream>
using namespace std;

class Point
{
public:
  void setPoint(int x, int y) //实现setPoint函数
  {
    xPos = x;
    yPos = y;
  };
  void printPoint() //实现printPoint函数
  {
    cout<< "x = " << xPos << endl;
    cout<< "y = " << yPos << endl;
  };
private:
  int xPos;
  int yPos;
};

int main()
{
  Point M; //用定义好的类创建一个对象 点M
  M.setPoint(10, 20); //设置 M点 的x,y值
  M.printPoint(); //输出 M点 的信息
  return 0;
}

class Point2
{
public:
  void setPoint(int x, int y);
  void printPoint();

private:
  int xPos;
  int yPos;
};    

7.14 linux-ubuntu环境Docker部署流程

7.14.1 docker安装

https://blog.csdn.net/fei2636/article/details/79384969

1. 安装docker
sudo apt-get install -y docker.io

2. 启动docker
systemctl start docker
systemctl enable docker

7.14.2 win10 linux子系统systemctl报错

https://blog.csdn.net/li_yan_sring/article/details/84408701 System has not been booted with systemd as init system (PID 1). Can’t operate. 解决方案如下,执行以下命令,如果docker –version能正确显示版本号,则安装成功

1. 先安装redis-server 
sudo apt-get install redis-server
2. 启动redis
sudo service redis-server start


无效方法
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce

7.14.3 添加当前用户权限 避免每次使用docker都需要sudo

yyx为用户名
sudo usermod -aG docker yyx    
sudo groupadd docker
sudo gpasswd -a yyx docker
su - yyx

显示所有权限用户,如果出现yyx则表示添加成功
id -nG

8 ubuntu系统16.04版本

8.1 Ubuntu设置国内镜像

sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup sudo emacs etc/apt/sources.list 清华大学镜像网址:https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu sudo apt-get update

8.2 Ubuntu下emacs26.3安装

8.2.1 emacs

sudo add-apt-repository ppa:kelleyk/emacs 
sudo apt update 
sudo apt install emacs26     

8.2.2 spacemacs安装

git clone https://github.com/syl20bnr/spacemacs ~/.emacs.d
安装完成之后需要手动移除.emacs文件
rm .emacs
一定要记住手动修改根目录路径为符合Ubuntu文件系统逻辑的表述    

8.2.3 emacs输入法设置

1. 设置环境变量
emacs ~/.bashrc 
export LC_CTYPE=zh_CN.UTF-8
source ~/.bashrc
2. 修改输入法config
将trigger input method修改为Ctrl+Shift即可
3. 从terminal启动emacs    
4. 设置user-emacs-directionary,为C-x C-f打开的路径

8.2.4 Source Code Pro字体安装

wget https://github.com/adobe-fonts/source-code-pro/archive/2.030R-ro/1.050R-it.tar.gz
tar xvf 1.050R-it.tar.gz
sudo mkdir -p /usr/share/fonts/opentype
sudo cp -r source-code-pro-2.030R-ro-1.050R-it/OTF/* /usr/share/fonts/opentype
sudo fc-cache -f -v    

8.2.5 ein无法登陆处理方法

由于之前设置了terminal作为shell而不是anaconda中的base环境,因此需要安装curl包即可

sudo apt-get install curl 

8.2.6 MATLAB-mode支持

  1. ubuntu环境下安装方式很特殊

    https://sourceforge.net/p/matlab-emacs/src/ci/master/tree/

    下载源码,并放在~/.emacs.d/elpa文件夹下
    git clone git://git.code.sf.net/p/matlab-emacs/src matlab-emacs-src    
    
    编译
    make 
    
    在init.el中添加
    ;; 设置MATLAB-mode
    (add-to-list 'load-path "~/.emacs.d/elpa/matlab-emacs-src")
    (load-library "matlab")
    (require 'matlab)
    ;; Enable CEDET feature support for MATLAB code. (Optional)
    ;; (matlab-cedet-setup)
    

8.3 基本软件安装

8.3.1 搜狗输入法

  1. 安装
    sougou for linux 
    sudo dpkg -i package.deb
    sudo apt-get install libqtwebkit4
    sudo apt-get install fonts-droid-fallback
    sudo apt-get install libopencc1
    sudo apt-get -f install
    
    sudo add-apt-repository ppa:fcitx-team/nightly  //添加FCITX仓库
    sudo apt-get update//更新仓库
    sudo apt-get install fcitx //安装fcitx输入法框架
    
  2. 搜狗输入法后选框乱码 卸载重装即可

    https://blog.csdn.net/zhuiqiuzhuoyue583/article/details/86750278 1.重启配置文件

    killall fcitx
    fcitx -r
    

    2.删除错误的配置文件

    cd ~/.config
    sudo rm -rf SogouPY* sogou*
    

8.3.2 anaconda安装

安装完成之后需要更新环境变量 source ~/.bashrc 如果没有环境变量,则需要在.bashrc中添加

export PATH=/home/aeasringnar/anaconda3/bin:$PATH

Ubuntu关闭anaconda自动进入base虚拟环境
conda config --set auto_activate_base false  配置不自动激活base环境
conda activate spacename  //环境的名称 激活环境
conda deactivate          //退出环境

8.3.3 seafile软件安装

sudo add-apt-repository ppa:seafile/seafile-client
sudo apt-get update
sudo apt-get install seafile-gui
服务器地址:
http://file.intra.sensetime.com/    

8.3.4 微信/onenote/qq音乐等Windows专属软件安装

sudo snap install electronic-wechat --devmode
sudo electronic-wechat 即可打开应用

snap常用命令
snap list 列出所有已安装的软件
snap search + package 搜索包
snap install + package 安装
snap remove + package 卸载

8.3.5 filezilla登陆方式说明:

FTP normal Host: 172.20.20.21 Usersname: LADP Passwords: LADP

8.3.6 wine Ubuntu下Windows应用安装解决方案

https://wiki.winehq.org/Ubuntu_zhcn
sudo dpkg --add-architecture i386 
wget -nc https://dl.winehq.org/wine-builds/winehq.key
sudo apt-key add winehq.key
sudo apt-add-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ xenial main'
sudo apt update
sudo apt install --install-recommends winehq-stable
wine --version出现则说明安装成功
wine 软件.exe即可安装程序    

字体及系统设置 https://blog.csdn.net/ysy950803/article/details/80326832

8.4 ubuntu常用命令

8.4.1 linux命令

  1. 文件管理、权限、复制粘贴
     pwd获取当前工作路径
    
     cat + 文件名 显示文件内容
    
     文件类资源管理:
     df -h查看系统中文件的使用情况
     du -sh * 查看当前目录下各个文件及目录占用空间大小
     du -sh /var/cache/apt/archives 查看路径里面文件的大小
     du -h --max-depth=1 ./     查看某一目录下的磁盘空间占用情况,方便删除大额数据
    
     计算资源管理:RSS是真实的内存的占用
     top 
    s – 改变画面更新频率
    l – 关闭或开启第一部分第一行 top 信息的表示
    t – 关闭或开启第一部分第二行 Tasks 和第三行 Cpus 信息的表示
    m – 关闭或开启第一部分第四行 Mem 和 第五行 Swap 信息的表示
    N – 以 PID 的大小的顺序排列表示进程列表
    P – 以 CPU 占用率大小的顺序排列进程列表
    M – 以内存占用率大小的顺序排列进程列表
    h – 显示帮助
    n – 设置在进程列表所显示进程的数量
    q – 退出 top
    s – 改变画面更新周期
    
     free显示当前内存占用
    
     ps 列出当前用户所属的进程
     ps -aux 列出所有用户进程
     ps -aux | grep yangyixin  查找所有跟yangyixin有关的进程 ps -aux中(a指代all——所有的进程,u指代userid——执行该进程的用户id,x指代显示所有程序,不以终端机来区分)
     ps系列
     简练写法:
     ps -aux | sort -k3nr | head -K       K表示前K个
     | head -1表示显示第一列,即标题列
     | sort -r 表示反向排序,-n表示按数字排序,-k4表示列的第4个字符。
     linux下获取占用CPU资源最多的10个进程,可以使用如下命令组合:
     ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head 
     linux下获取占用内存资源最多的10个进程,可以使用如下命令组合:
     ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head 
     该命令组合实际上是下面两句命令:
     ps aux|head -1
     ps aux|grep -v PID|sort -rn -k +3|head
     其中第一句主要是为了获取标题(USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND)。
     接下来的grep -v PID是将ps aux命令得到的标题去掉,即grep不包含PID这三个字母组合的行,再将其中结果使用sort排序。
     sort -rn -k +3该命令中的-rn的r表示是结果倒序排列,n为以数值大小排序,而-k +3则是针对第3列的内容进行排序,再使用head命令获取默认前10行数据。(其中的|表示管道操作)
    
     which python 查找系统PATH目录下的可执行文件
     whereis python 查看Python所在位置 查找二进制(命令)、源文件、man文件 查找的面比which要广
    
     ls  列出目录(文件夹)中的文件和子目录 
     -l   长格式列出 
     -a   显示所有文件,包括隐藏文件和目录(所有以“.”为开始的文件和目录为隐藏文件) 
     -R 递归显示,包括文件夹和子文件
    
     ls -lR 显示当前路径下的所有文件和文件夹 长列表格式
     ls -lR /*/*/*/*.jpg   显示文件夹里面的.jpg文件
     ls -R  显示当前路径下的所有文件和文件夹 只显示文件名
    
     ls -la 可以显示当前路径下的符号链接 如在/usr/local路径
     ls -al 可以显示当前路径下的符号链接 如在/usr/local路径
     查询当前路径下的所有文件信息
     ls -lhi
    
     检索路径下的所有*.packed_word 文件,并将文件名输入到a.txt文件中
     ls -R /data/vendor/camera_dump/*main-imgo-PW4032-PH3000-BW5040__4000x3000_10_2.packed_word >a.txt 
    
     >a.txt 多次执行 覆盖
     >>a.txt 多次执行 尾部添加
    
     系统版本号查询
     lsb_release -a
     uname -a
     cat /proc/version
    
     chmod 777 + 文件名 修改权限为读写 
     文件权限说明 
     -rw-r--r-- 
     -表示普通文件 d是文件夹,l是连接文件 
     rw-r--r-- 9个符号表示权限  
     9个字符共分为3组,每组3个字符。 
     第1组表示创建这个文件的用户的权限,第2组表示创建创建这个文件的用户所在的组的权限,第3组表示其他用户的权限 
     Chmod 777  
     4表示读取权限,2表示写入权限,1表示执行权限 
     7=4+2+1 rwx 
     6=4+2     rw- 
    
     复制文件或目录
     cp [options] source dest     
     sudo cp sources.list sources.list.bak
    
     修改文件名
     mv 文件名 文件名	将源文件名改为目标文件名
     mv 文件名 目录名	将文件移动到目标目录
     mv 目录名 目录名	目标目录已存在,将源目录移动到目标目录;目标目录不存在则改名
    
     cp [-adfilprsu] 源文件(source) 目标文件(destination) 
         -a:是指archive的意思,也说是指复制所有的目录 
         -d:若源文件为连接文件(link file),则复制连接文件属性而非文件本身 
         -f:强制(force),若有重复或其它疑问时,不会询问用户,而强制复制 
         -i:若目标文件(destination)已存在,在覆盖时会先询问是否真的操作 
         -l:建立硬连接(hard link)的连接文件,而非复制文件本身 
         -p:与文件的属性一起复制,而非使用默认属性 
         -r:递归复制,用于目录的复制操作 
         -s:复制成符号连接文件(symbolic link),即“快捷方式”文件 
         -u:若目标文件比源文件旧,更新目标文件 
         如将/test1目录下的file1复制到/test3目录,并将文件名改为file2,可输入以下命令: 
         cp /test1/file1 /test3/file2     
    
     移动文件到指定路径
     mv 1610.02357.pdf /media/canran/文件盘/book
    
     删除文件、文件夹
     rm -rf /var/log/httpd/access
     -r 就是向下递归,不管有多少级目录,一并删除;
     -f 就是直接强行删除,不作任何提示的意思。
    
     想同时删除多个文件
     rm -r /sdcard/dcim/camera/IMG_20200310_141841.jpg /sdcard/dcim/camera/IMG_20200310_141839_1.jpg
    
     显示隐藏的文件夹
     Ctrl + h
    
     查询命令所在的位置
     which + 命令 
     例如: which python 
    
     linux硬链接与软链接
     内容-用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;
     文件名-元数据则是文件的附加属性,如文件名、文件大小、创建时间、所有者、文件所在的inode等信息。
     在 Linux 中,元数据中的 inode 号(inode 号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。如图1:
    
     linux软链接建立流程
     备份原有/usr/bin/python /usr/bin/pip 通过重命名 或者直接删除如果不需要保存的话 rm -rf /usr/bin/python
     mv /usr/bin/python /usr/bin/python_bak
     mv /usr/bin/pip /usr/bin/pip_bak
    
     建立可执行程序的软链接
     sudo ln -s /usr/local/Python-3.6.9/bin/python3 /usr/bin/python
     sudo ln -s /usr/local/Python-3.6.9/bin/pip3.6 /usr/bin/pip
    
  2. 查找文件所在路径
    查找文件所在路径
    locate libopencv_imgcodecs.so.3.0     
    
  3. 列出可执行程序所有缺失的依赖包

    ldd + 可执行程序名字 比如:ldd batchYUV2PNG

  4. dir 检索文件
    /b 只显示文件名和路径信息,剥离权限等信息
    /s Display All Files and Folders and Everything Inside
    
    dir /b /s *.raw 显示当前路径下的文件和文件夹名 仅在.cmd文件中有效  
    dir ./*raw 仅在cmd窗口中有效     
    
  5. packages安装及dpkg
    sudo apt-get -f install 安装所需要的依赖
    sudo apt-get --purge remove packages   同时删除配置文件--purge
    sudo apt-get autoremove 这条命令用来删除不需要的依赖软件包.
    sudo apt-get autoclean 删除/var/cache/apt/archives目录下的deb安装包.但它只删除那些已经不能从软件仓库中下载的deb安装包.这就是说,Debian或Ubuntu已经不维护那些软件包了,或者那些软件包有了一个新的名字.
    apt-get clean packages 删除这些deb安装包
    
    dpkg 可以用来处理wine-stable安装问题
    dpkg -l 显示所有用dpkg安装的软件
    sudo dpkg -r package 卸载package     
    dpkg -l | grep + package 显示指定包的详细信息
    dpkg -i urserver.deb 安装.deb 
    dpkg -r urserver 只删除包,不包括配置文件
    dpkg -P urserver 彻底删除,包括配置文件
    
    
  6. 环境变量设置
    env 显示所有的环境变量
    echo $PATH 显示所有的环境变量
    export RABBITMQ_CONFIG_FILE=/etc/rabbitmq/rabbitmq.config  环境变量指定
    
    当前用户的环境变量
    ~/.bashrc    
    export PATH=/home/yan/share/usr/local/arm/3.4.1/bin:$PATH
    source .bashrc
    
    所有用户的环境变量
    /etc/profile 
    export PATH=/home/yan/share/usr/local/arm/3.4.1/bin:$PATH
    source profile     
    
  7. vim编辑器基本使用方法

    Ecs 切换输入模式和命令模式

    1. 文件管理
      :q  退出
      :wq 保存并退出
      :q! 不保存并退出
      :w 保存
      :w! 强行保存
      :wq --> :x
      
    2. 编辑
      i: 在当前光标所在字符的前面,转为输入模式;
      a: 在当前光标所在字符的后面,转为输入模式;
      o: 在当前光标所在行的下方,新建一行,并转为输入模式;
      I:在当前光标所在行的行首,转换为输入模式
      A:在当前光标所在行的行尾,转换为输入模式
      O:在当前光标所在行的上方,新建一行,并转为输入模式;    
      
  8. 查看cuda版本
    cuda 版本
    cat /usr/local/cuda/version.txt     
    
    cudnn 版本
    cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
    
  9. 查看GPU信息
    nvidia-smi nvtop     
    
  10. 查看服务器可用端口号
    查看服务器端口  
    端口号状态:listen开放端口,established已经连接端口 
    端口号可用:1024 – 49151
    netstat -anptl 
    netstat -anptl  | grep LISTEN
    netstat -anptl | grep 3306
    
    查看ip地址
    ifconfig     
    
  11. 更换gcc版本:
    1. 最简单的方式
      CC="gcc-4.5" ./configure
      CC="gcc-4.5" make      
      
    2. 需要sudo权限
      sudo apt-get install gcc-4.3 gcc-4.4 g++-4.3 g++-4.4
      
      sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.3 10
      sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 20
      
      sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.3 10
      sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.4 20
      
      sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc 30
      sudo update-alternatives --set cc /usr/bin/gcc
      
      sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++ 30
      sudo update-alternatives --set c++ /usr/bin/g++
      
      sudo update-alternatives --config gcc
      sudo update-alternatives --config g++      
      

8.4.2 terminal

  1. 常用快捷键

    https://blog.csdn.net/u014754386/article/details/80956816 Ctrl+Shift+C 复制 Ctrl+Shift+V 粘贴

  2. tmux多终端管理工具

    https://www.cnblogs.com/sddai/p/10212897.html

    Ctrl+b 激活控制台
    c 创建新窗口     
    数字键 切换至指定窗口
    p 切换至上一窗口
    n 切换至下一窗口
    l 在前后两个窗口间互相切换
    w 通过窗口列表切换窗口      重要
    , 重命名当前窗口;这样便于识别
    . 修改当前窗口编号;相当于窗口重新排序
    f 在所有窗口中查找指定文本
    
    2)常用到的几个组合键:
    Ctrl+b x            关闭当前窗口
    ctrl+b ?            显示快捷键帮助
    ctrl+b 空格键       采用下一个内置布局,这个很有意思,在多屏时,用这个就会将多有屏幕竖着展示
    ctrl+b !            把当前窗口变为新窗口
    ctrl+b  "           模向分隔窗口
    ctrl+b %            纵向分隔窗口
    ctrl+b q            显示分隔窗口的编号
    ctrl+b o            跳到下一个分隔窗口。多屏之间的切换
    ctrl+b 上下键      上一个及下一个分隔窗口
    ctrl+b C-方向键    调整分隔窗口大小
    ctrl+b &           确认后退出当前tmux
    ctrl+b [           复制模式,即将当前屏幕移到上一个的位置上,其他所有窗口都向前移动一个。
    ctrl+b c           创建新窗口
    ctrl+b n           选择下一个窗口
    ctrl+b l           最后使用的窗口
    ctrl+b p           选择前一个窗口
    ctrl+b w           以菜单方式显示及选择窗口
    ctrl+b s           以菜单方式显示和选择会话。这个常用到,可以选择进入哪个tmux
    ctrl+b t           显示时钟。然后按enter键后就会恢复到shell终端状态
    ctrl+b d           脱离当前会话;这样可以暂时返回Shell界面,输入tmux attach能够重新进入之前的会话
    
    3)窗口管理
    tmux ls 
    tmux kill-window -t 16
    
    tmux attach -t 0 重新接入会话
    tmux a -t <session-name> 
    tmux a 
    
    tmux detach 断开当前会话(还可以使用快捷键:control+b,再按d)
    
    滚动屏幕
    C-b pageup 
    C-b pagedonw
    q 退出当前复制模式
    
    快速中止所有tmux
    1. 列出所有的terminal
    tmux ls
    2. 删除targetSession
    tmux kill-session -t targetSession
    

8.4.3 pytorch 0.4.1安装

pip conda速度很慢,并且无法用镜像解决 whl包安装 https://download.pytorch.org/whl/cu90/torch_stable.html

pip install torch-0.4.1-cp37-cp37m-linux_x86_64.whl

8.4.4 mmdetection安装

  1. 命令

    https://github.com/open-mmlab/mmdetection/blob/master/docs/INSTALL.md

    conda create -n open-mmlab python=3.7 -y
    conda activate open-mmlab
    
    conda install -c pytorch pytorch torchvision -y
    conda install cython -y
    git clone https://github.com/open-mmlab/mmdetection.git
    cd mmdetection
    pip install -v -e .
    
    mkdir data
    ln -s $COCO_ROOT data     
    
  2. python setup.py develop出现cuda错误解决方案
    配置环境变量
    emacs ~/.bashrc
    
    在末尾添加
    export PATH="/usr/local/cuda-9.0/bin:$PATH"
    export LD_LIBRARY_PATH="/usr/local/cuda-9.0/lib64:$LD_LIBRARY_PATH"
    
    source ~/.bashrc
    

8.4.5 Ubuntu下git常用操作

git fetch origin
git add .  
git rm filename
git commit -m "修复XXbug"
git pull <远程主机名> <远程分支名> 
git push <远程主机名> <远程分支名>    
git log 查看历史记录

保存凭据
git config --global credential.helper store

8.4.6 fpt服务器登陆

浏览器直接输入:
ftp://172.20.52.136    

8.5 GPU集群训练

8.5.1 sbatch命令

北京大学高性能计算中心说明https://hpc.pku.edu.cn/guide_sbatch.html 更详细的使用说明https://ubccr.freshdesk.com/support/solutions/articles/5000688140-submitting-a-slurm-job-script

脚本文件名为job.sh
#!/bin/bash                     或者#!/bin/sh
#SBATCH -o job.%j.out
#SBATCH --partition=C032M0128G
#SBATCH --qos=low
#SBATCH -A hpcxxxxxx
#SBATCH -J myFirstJob
#SBATCH --get-user-env
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=4
#SBATCH --mail-type=end
#SBATCH --mail-user=xxxx@pku.edu.cn
#SBATCH --time=120:00:00

srun hostname -s | sort -n >slurm.hosts

module load intel/2017.1
mpiicc -o hellompi.o hellompi.c
mpirun -n 8 -machinefile slurm.hosts ./hellompi.o
rm -rf slurm.hosts    

提交作业
$ sbatch job.sh

sbatch使用说明
--help	显示sbatch命令的使用帮助信息;
-A <account>	指定计费账户;
-D, --chdir=<directory>	指定工作目录;
--get-user-env	获取用户的环境变量;
--gres=<list>	使用gpu这类资源,如申请两块gpu则--gres=gpu:2
-J, --job-name=<jobname>	指定该作业的作业名;
--mail-type=<type>	指定状态发生时,发送邮件通知,有效种类为(NONE, BEGIN, END, FAIL, REQUEUE, ALL);
--mail-user=<user>	发送给对应邮箱;
-n, --ntasks=<number>	sbatch并不会执行任务,当需要申请相应的资源来运行脚本,默认情况下一个任务一个核心,--cpus-per-task参数可以修改该默认值;
-c, --cpus-per-task=<ncpus>	每个任务所需要的核心数,默认为1;
--ntasks-per-node=<ntasks>	每个节点的任务数,--ntasks参数的优先级高于该参数,如果使用--ntasks这个参数,那么将会变为每个节点最多运行的任务数;
-o, --output=<filename pattern>	输出文件,作业脚本中的输出将会输出到该文件;
-p, --partition=<partition_names>	将作业提交到对应分区;
-q, --qos=<qos>	指定QOS;
-t, --time=<time>	设置限定时间;

-J, --job-name=<jobname>	Name for the job
-n, --ntasks=<number>	Number of task
-N, --nodes=<minnodes[-maxnodes]>	Number of nodes to assign. You may specifiy a range and SLURM will try to assignthe maxnodes you want and the job will run when the node available meet the minnodes requirement.
-c, --cpus-per-task=<ncpus>	CPUs per task
--mem=<size[units]>	Memory required per node. units may use [K|M|G|T]
--mem-per-cpu=<size[units]>	Memory required per allocated CPU. units may use [K|M|G|T]
-t, --time=<time>	Set a limit on total run time of the job. time may use "mins", "HH:MM:SS", "days-HH:MM:SS"
-o,--output=<filename pattern>	Write the output to a file. By default both standard output and standard error are directed to the same file.
-e, --error=<filename pattern>	Write the error to a file.
--mail-type=<type>	Notify user by email when certain event types occur. type values are NONE, BEGIN, END, FAIL, REQUEUE, ALL
--mail-user=<email>	Notify the user by which email address

8.5.2 节点状态查询

scontrol show node <节点名> 查看节点的详细信息
已经占用的资源为 AllocTRES=cpu=4,mem=8800M,gres/gpu=2

seninfo | grep Superresolution   查看节点有多少张卡
squeue | grep Pixel       查看任务排队情况
swatch -l                 查看任务排队情况
swatch -q                 查看磁盘占用情况,是否超额,也可使用  lfs quota -u linzhineng /mnt/lustre -h
du -h --max-depth=1 ./     查看某一目录下的磁盘空间占用情况,方便删除大额数据    

8.5.3 sh脚本参考

  1. 并行计算脚本

    一个计算节点可以包含多个GPU 此时需要进行数据分发,影响并发训练速度 一个计算节点只使用一个GPU,此时数据不用分发,计算速度快,但是loss下降不稳定 结论:一个节点使用一个GPU即可 只指定gres 不指定节点的任务

    1. 终极模板脚本
      #!/bin/sh
      #SBATCH -p Pixel
      #SBATCH -J train_x1_model
      #SBATCH -o debug.out
      #SBATCH -N 4   # 总节点数
      #SBATCH -n 4
      #SBATCH --gres=gpu:4
      #SBATCH --get-user-env
      #SBATCH --mail-type=END,FAIL          # Mail events (NONE, BEGIN, END, FAIL, ALL)
      #SBATCH --mail-user=yangyixin@sensetime.com     # Where to send mail	
      
      ### 路径 主机 时间
      pwd; hostname; date
      
      ### x1_1
      srun -p Pixel --gres=gpu:1 --job-name=x1_1 -o 1.out -N 1 -n 1 python -u /mnt/lustre/yangyixin/SenseSR_trainModel_lmdb/framework/train_vivo710_new_x1_with_x2data.py --config /mnt/lustre/yangyixin/yyx/config/config_x1_vivo1926_20200113data_iso0-300part_x2_hr02_pslj0610.yml &
      
      ### x1_2
      srun -p Pixel --gres=gpu:1 --job-name=x1_2 -o 2.out -N 1 -n 1 python -u /mnt/lustre/yangyixin/SenseSR_trainModel_lmdb/framework/train_vivo710_new_x1_with_x2data.py --config /mnt/lustre/yangyixin/yyx/config/config_x1_vivo1926_20200113data_iso0-300part_x2_hr02_pslj0610_04_lr03ps20200108mask.yml &
      
      ### x1_3
      srun -p Pixel --gres=gpu:1 --job-name=x1_3 -o 3.out -N 1 -n 1 python -u /mnt/lustre/yangyixin/SenseSR_trainModel_lmdb/framework/train_vivo710_new_x1_with_x2data.py --config /mnt/lustre/yangyixin/yyx/config/config_x1_vivo1926_20200113data_iso0-300part_x2_hr02_pslj0610_07_lr03ps20200108mask.yml &
      
      ### x1_4
      srun -p Pixel --gres=gpu:1 --job-name=x1_4 -o 4.out -N 1 -n 1 python -u /mnt/lustre/yangyixin/SenseSR_trainModel_lmdb/framework/train_vivo710_new_x1_with_x2data.py --config /mnt/lustre/yangyixin/yyx/config/config_x1_vivo1926_20200113data_iso0-300part_x2_lr03_mean_EDSRx2_ps20200108mask_noiseware.yml &
      
      wait
      
      date
      
    2. 简要说明

      Job-Array是用来对同一条命令多次重复执行的 多条不同的命令同时执行需要用&符号

    3. Job-Array方法
      #SBATCH -a 0-3
      
    4. 多条命令同时执行方法
      squeue -s -u yangyixin     其中-s参数表示显示jobstp的详细信息
      #SBATCH -J print_test      设置的是jobname
      srun --job-name=large_time python -u test.py 设置的是jobstep名称
      
  2. 标准
    #!/bin/bash
    #SBATCH -p Pixel
    #SBATCH -J makedata
    #SBATCH --get-user-env
    #SBATCH --mail-type=END,FAIL          # Mail events (NONE, BEGIN, END, FAIL, ALL)
    #SBATCH --mail-user=yangyixin@sensetime.com     # Where to send mail	
    
    ### 路径 主机 时间
    pwd; hostname; date
    
    ### 模块载入
    ### module load python
    
    echo "Running plot script on a single CPU core"
    
    srun -p Pixel --job-name=makedata_x4_1  python -u ./preprocess/process/create_lmdb.py --config ./yyx/config_x4_vivo1926_20200113data_iso0-300part_x4_hr02_pslj0610.yml
    
    python /ufrc/data/training/SLURM/plot_template.py
    
    date    
    
  3. 备选
    #SBATCH -p Pixel
    #SBATCH -J makedata
    #SBATCH -o test.out
    #SBATCH --get-user-env
    #SBATCH --mail-type=END,FAIL          # Mail events (NONE, BEGIN, END, FAIL, ALL)
    #SBATCH --mail-user=yangyixin@sensetime.com     # Where to send mail	     
    

8.5.4 sbatch运行之后查看srun输出结果的方法

cat slurm-572188.out 即可    

8.5.5 slurm命令

sinfo

批处理
# !/bin/bash
#SBATCH -J name

启动批处理脚本
sbatch

check the detailed info of job 
scontrol show jobid 583807

查看作业状态
使用squeue命令
squeue -u yangyixin  查看用户作业
squeue -p Pixel  查看分区作业

取消作业
使用scancel命令,示例
scancel [jobid]
scancel 98833434

查看之前作业
使用sacct命令    

seninfo | grep Superresolution   查看节点有多少张卡
squeue | grep Pixel       查看任务排队情况
swatch -l                 查看任务排队情况
swatch -q                 查看磁盘占用情况,是否超额,也可使用  lfs quota -u linzhineng /mnt/lustre -h
du -h --max-depth=1 ./     查看某一目录下的磁盘空间占用情况,方便删除大额数据

任务追踪
scontrol show job JOBID

显存占用计算
swatch -n SZ-IDC1-172-20-20-78 nv

8.5.6 集群计算

srun -p Test --gres=gpu:1 --job-name=TEST python -u ~/SenseSR_trainModel_lmdb/framework/train_vivo710_new_x4_with_x2data.py --config ~/SenseSR_trainModel_lmdb/train_scripts/config_OPPO710_20190124data_iso100part_EDSR_x2_ps20200103mask_noiseware.yml     

8.5.7 通用Python文件训练:

srun -N 1 -n 1 -p Pixel2 --gres=gpu:1 -w SZ-IDC1-172-20-21-[51-60] --job-name=Test python test.py 
Sacct 查看之前的作业 
scancle [job id] 取消作业 
ssh yangyixin@jump01.sz.sensetime.com 
cd SenseSR_trainModel_lmdb     

8.5.8 必备操作

  1. sbatch参数详细说明 + 多GPU同时运行的命令
    商汤集群最多同时使用的GPU为4
     –gres=gpu:8    每个节点使用的GPU数目   Nodes-per-gpu
     -n 1           使用的进程数目 = cpu核心 = 线程数目              一般固定设为1即可
     -N 1            节点数目 每个节点都有8张卡!!!!!!即相当于几个服务器 固定设为1即可
    
    多GPU运行示例:
    srun -p Pixel --gres=gpu:4 -N 1 -n 1 --job-name=abpn_test python demo_4x.py
    意义:
    N 1 一个计算节点 
    每个计算节点调用了 n1个线程 gres4个GPU
    
  2. seninfo崩溃之后的备用方法 cinfo 用来查询空卡
  3. 多卡同时训练的方法
    1. tensorflow版本
      import os
      os.environ["CUDA_VISIBLE_DEVICES"] = "0, 1, 2, 3"     
      
    2. pytorch版本

      !!!需要注意吧batch size调大N倍

      import torch.nn as nn
      model=nn.DataParallel(model,device_ids=[0,1,2]) # multi-GPU      
      
      示例二
      import torch.nn as nn
      
      # instantiation
      net = MyNet.Net()
      # Parallel Computing
      net = nn.DataParallel(net)
      net = net.cuda()
      
  4. 内存占用查询 sstat saact使用方法
    sstat 查看RUNNING作业
    sstat -e 查看可选命令
    sstat -a --format="JobId,Pids,AveCPU,AveRSS,MaxRSS"  600122 
    
    sacct 查看FINISHED作业     
    sacct -e 查看可选命令
    sacct --format="JobId,Elapsed,CPUTime,CPUTimeRAW,AveCPU,TotalCPU,UserCPU,SystemCPU,AveRSS,MaxRSS" -j 600122
    
  5. 批量取消job

    https://unix.stackexchange.com/questions/417426/best-way-to-cancel-all-the-slurm-jobs-from-shell-command-output

    只需要将197替换为使用的job id前缀即可
    查询
    squeue -u $USER | grep 197 | awk '{print $1}'      
    执行取消
    squeue -u $USER | grep 197 | awk '{print $1}' | xargs -n 1 scancel
    

8.6 UCR集群

8.6.1 HPC

  1. 登陆方式
    ssh -X username@cluster.hpcc.ucr.edu    
    

8.7 必备操作集锦

8.7.1 emacs中Python代码flycheck出现大量error

  1. 解决方案尝试:安装Python3.8 并设置为默认的python解释器

    https://www.linuxidc.com/Linux/2019-07/159277.htm

    sudo add-apt-repository ppa:deadsnakes/ppa
    sudo apt update 
    sudo apt install python3.8
    python3.8 --version
    
  2. 在系统级修改 Python 版本
    首先罗列出所有可用的 python 替代版本信息
    sudo update-alternatives --list python
    
    将不同版本的Python.exe链接到Python解释器 /usr/bin/python  优先级2 > 1
    sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.8 3
    sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.5 2
    sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
    
    切换Python版本
    sudo update-alternatives --config python
    
    Ubuntu关闭anaconda自动进入base虚拟环境
    conda config --set auto_activate_base false
    
    移除替代版本
    update-alternatives --remove python /usr/bin/python2.7
    
  3. Ubuntu关闭anaconda自动进入base虚拟环境
    conda config --set auto_activate_base false     
    

8.7.2 ubuntu查看cuda版本号和cudnn

cuda
cat /usr/local/cuda/version.txt

cudnn
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

9 Html语言

9.1 配置

需要web-mode package

(require 'web-mode)
(add-to-list 'auto-mode-alist '("\\.phtml\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.tpl\\.php\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.jsp\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.as[cp]x\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.erb\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.mustache\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.djhtml\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.php\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.html\\'" . web-mode))

(defun my-web-mode-hook ()
  "Hooks for Web mode."
    (setq web-mode-markup-indent-offset 4)
    (setq web-mode-css-indent-offset 4)
    (setq web-mode-code-indent-offset 4)
    (setq web-mode-indent-style 4)
)
(add-hook 'web-mode-hook  'my-web-mode-hook)

9.2 学习抓取某网站的技巧

将网页与源代码按照从上到下依次一一对应,识别代码与内容的匹配

9.3 html基本知识

9.3.1 常用标签

  1. 学习网址
  2. 常用标记
    <html>
     <head>
       <title>HTML页面</title>
     </head>
     <body>
       <b>
         应用记事本编写HTML代码
       </b>
     </body>
    </html>     
    
  3. 换行标记

    换行标记 在HTML语言中,换行标记为<br>

  4. 布局标签
    div标签定义文档中的分区或节(division/section),可以把文档分割为独立的、不同的部分,主要用于布局。
    aside标签的内容可用作文章的侧栏,<span style="color: #ff0000;">html5新增标签</span>。
    header标签定义页面的头部(介绍信息),<span style="color: #ff0000;">html5新增标签</span>。
    section标签定义文档中的节(section、区段)。比如章节、页眉、页脚或文档中的其他部分,<span style="color: #ff0000;">html5新增标签</span>。
    footer 标签定义文档或节的页脚,通常包含文档的作者、版权信息、使用条款链接、联系信息等等,<span style="color: #ff0000;">html5新增标签</span>。
    article标签规定文章独立的其他内容,比如:标题、内容、评论,<span style="color: #ff0000;">html5新增标签</span>。     
    
  5. 文本标签
    h1-h6标签可定义标题
    p标签定义段落
    b/strong标签加粗
    em标签来表示强调的文本,斜体
    strong标签表示重要文本
    u标签下划线
    s标签删除线
    br标签表示回车换行
    hr标签表示水平线
    span标签被用来组合文档中的行内元素。
    blockquote标签表示块引用
    pre标签可定义预格式化的文本,保持原有格式的一种标签。
    sub标签下标,
    sup>标签上标
     表示一个空格
    ©表示版权符
    <表示<
    >表示>     
    
  6. a标签定义超链接,指定页面间的跳转。链接可以指向外部链接或者页面内部id锚点,可以在当前页面打开,新开窗口。

    <a href="指向的链接地址或者网址#ID名" target="blank|self|top|parent">百度</a>

  7. 多媒体标签
    img标签主要在网页中插入图像,可以定义图片替换文本、显示宽度和高度、是否带边框,建议等比例设置,否则图像会变形。
    <img src="图片地址" alt="替换文本,图片打不开的时候显示" width="图片宽度" height="高度" border="0" />
    audio标签定义声音,比如音乐或其他音频流。<span style="color: #ff0000;">html5新增标签</span>。
    <audio src="someaudio.wav">您的浏览器不支持 audio 标签。</audio>
    video标签定义视频,比如电影片段或其他视频流。<span style="color: #ff0000;">html5新增标签</span>。
    <video src="movie.ogg" controls="controls">您的浏览器不支持 video 标签。</video>     
    
  8. 序列化标签
    ul和li无序列表标签
    <ul>
    <li>HTML</li>
    <li>JS</li>
    <li>PHP</li>
    </ul>
    ol和li有序列表标签,可以使用type属性规定有序列表符号的类型。1 按数字有序排列,为默认值,(1、2、3、4);a 按小写字母有序排列,(a、b、c、d);A 按字母大写有序排列,(A、B、C、D)。i 按小写罗马字母有序,(i, ii, iii, iv);I 按小写罗马字母有序,(I, II, III, IV)。
    <ol>
    <li>HTML</li>
    <li>JS</li>
    <li>PHP</li>
    </ol>
    dl标签定义了定义列表(definition list),dl标签用于结合 dt(定义列表中的项目)和 dd(描述列表中的项目)。
    <dl>
    <dt>计算机</dt>
    <dd>用来计算的仪器 ... ...</dd>
    </dl>     
    
  9. 表格标签
    table标签和tr标签,th标签和td标签,合并单元格。
    <table width="100%" height="193" border="1" cellpadding="0" cellspacing="0" bordercolor="#FF0000" bgcolor="#000000" background="">
    <tr>
    <th>标题</th>
    <th>标题</th>
    </tr>
    <tr>
    <!-- 合并横向单元格 -->
    <td colspan="2" nowrap="nowrap">&nbsp;</td>
    </tr>
    <tr>
    <td></td>
    <!-- 合并纵向单元格 -->
    <td rowspan="2"> </td>
    </tr>
    <tr>
    <td height="16"> </td>
    </tr>
    </table>     
    
  10. 表单标签
    form标签定义提交方式、提交地址、表单字符集以及如何对其进行编码,需要提交的表单一定要放在form标签内。
    <form id="form1" name="form1" method="post|get" enctype="multipart/form-data" action="提交到的地址"></form>
    input标签用于搜集用户信息
    <input name="userName" type="text" maxlength="5" size="100" value="asdfasdfasfd" />
    密码,输入的字符会被掩码(显示为星号或原点)
    <input name="pwd" type="password" maxlength="5" size="100" value="" />
    文件类型的表单,上传文件时,form表单一定要设置为enctype="multipart/form-data"
    <input type="file" name="file" />
    隐藏表单
    <input type="hidden" name="country" value="China" />
    提交
    <input type="submit" name="Submit" value="提交" disabled="disabled" />
    重置
    <input type="reset" name="Submit2" value="重置" />
    radio单选
    <input name="sex" type="radio" value="1" />男
    <input name="sex" type="radio" value="2" checked="checked" />女
    checkbox多选
    <input name="skill" type="checkbox" value="1" checked="checked" />PHP
    <input name="skill" type="checkbox" value="2" />前端
    <input name="skill" type="checkbox" value="2" />数据库
    <span style="color: #ff0000;">注:checked="checked"可以简写成checked</span>
    label标签为input元素定义标注,如果您点击label元素文本,就会触发此input控件。
    textarea标签,设置文本区内的可见行数和宽度
    <textarea name="content" cols="30" rows="10">大段文本输入框</textarea>
    button标签定义一个按钮
    提交按钮
    <button type="submit" value="提交">提交</button>
    重置按钮
    <button type="reset" value="重置">重置</button>
    select标签和option标签下拉列表
    单选菜单列表框
    <select name="user">
    <option value="1">ray</option>
    <option value="2" selected="selected">raykaeso</option>
    </select>
    多选列表下拉框,shift加鼠标单击,可以连续选择多个选择,CTRL+鼠标点击,可以点击多个。
    <select name="user" size="10" multiple="multiple">
    <option value="1">雷雪松</option>
    <option value="2" selected="selected">ray</option>
    <option value="3">raykaeso</option>
    </select>
    注:selected="selected"可简写成selected,表示选中     
    

9.4 最重要的函数findall

findall( name , attrs , recursive , string , **kwargs ) findall() 方法搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件

9.4.1 name参数

这是最简单而直接的一种办法了,我么可以通过html标签名来索引; sb = soup.findall('img')

9.4.2 keyword参数

所谓关键字参数其实就是通过一个html标签的id、href(这个主要指的是a标签的 )和title,我测试了class,这个方法好像不行,不过没有关系,下面我会谈到这个点的! soup.findall(href=re.compile("elsie"))

9.4.3 sting参数

通过 string 参数可以搜搜文档中的字符串内容.与 name 参数的可选值一样, string 参数接受 字符串 , 正则表达式 , 列表, True;

9.4.4 limit参数

这个参数其实就是控制我们获取数据的数量,效果和SQL语句中的limit一样;

9.4.5 recursive参数

调用tag的 findall() 方法时,Beautiful Soup会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数 recursive=False;

9.4.6 使用说明

直接输入字符串的话,查找的是标签。如果想要查找文本的话,则需要用到text参数。如下所示: soup.find('ul') ul标签 soup.find(text = 'plants') 文本plants 这里text是属性 soup.find(id='primaryconsumers') ul标签中的属性 soup.find(attrs={'data-custom':'custom'}) ul标签中的data-custom属性 值为custom 属性传递写法 findparent() findparents() 查找父标签 findnextsiblings() 查找同类 注意:这两个函数一定要先把trs = trs[0]变成一个可以调用的类型

10 batch批处理语言

10.1 基本语法

https://blog.csdn.net/wal1314520/article/details/80362138

echo off,屏幕不显示bat文件中所有的命令行
cd,英文change directory的缩写(切换目录)。例如cd d:</span>sybase,进入sybase目录
md,英文make directory的缩写(创建目录。例如md c:</span>123
rd,英文remove directory的缩写(删除目录)。例如rd c:</span>123
del,英文delete的缩写(删除)。用于删除指定磁盘、目录中的一个或一组文件,例如del D:</span>gvim.exe  

末尾加pause 表示运行结束后保持窗口

%,表示参数(在运行批处理文件时在文件名后加的字符串,例如%1、%2等);
运行C:\>t a.txt b.txt  
%1 : 表示a.txt
%2 : 表示b.txt 
%var%,变量var;

%cd%, %~dp0 表示当前路径
%cd%代表的是当前工作目录
%~dp0代表的是当前批处理文件所在完整目录(the batch file's directory,fixed)。
cd = C:\program
dp0 = C:\program\
cd表示当前文件的工作路径 dp0表示所执行命令的工作路径
优先使用%~dp0

Test.bat: 假设传入的参数为:c:\temp\test1.txt
echo %~d1 =>c:
echo %~dp1 =>c:\temp\
echo %~nx1 =>test1.txt
echo %~n1 =>test1
echo %~x1 =>.txt
cho 当前目录路径:%~dp0

touch + 文件名
新建空文件

删除
del .\TEST\*.o

复制
copy file1.txt 文件夹1
copy file2.txt 文件夹2

重命名
ren *.txt *.mp3
ren  *.gif *.jpg

一般情况下,默认的.cmd开头
@echo off
setlocal enabledelayedexpansion

rd 删除文件夹及其子文件和子文件夹
rd /s /q C:\Users\dell\AppData\Local\Temp\A

dir
显示目录下的内容。有以下参数。
/w ,只显示缩略信息。
/p,如果一页占不下的话,分页显示。
/s,显示系统文件。
以上三个可以一起使用。

10.2 变量

#变量的引用及赋值                                                                             
#基础用法
set                    #显示目前所有可用的变量,包括系统变量和自定义的变量                                    
echo %SystemDrive%     #显示系统盘盘符。系统变量可以直接引用                                                  
set p                  #显示所有以p开头的变量,要是一个也没有的话就设errorlevel=1                                 
set p=qwerdfzxc        #设置变量p,并赋值为 = 后面的字符串,即qwerdfzxc     

字符串拼接
SET Sender = %Sender1%, %Sender2%

echo %p%          #显示变量p代表的字符串,即qwerdfzxc                                                     
echo %p:~3%       #显示变量p中第3个字符以后的所有字符,即rdfzxc                                           
echo %p:~3,3%     #显示第3个字符以后的3个字符,即rdf                                                      
echo %p:~0,3%     #显示前3个字符,即qwe                                                                   
echo %p:~-2%      #显示最后面的2个字符,即xc                                                              
echo %p:~0,-2%    #显示除了最后2个字符以外的其它字符,即qwerdfz                                           
echo %p:q=aa%     #用c替换变量<span>p</span>中所有的q,即显示aawerdfz                                                 
echo %p:q=%      #将变量p中的所有q字符串置换为空,即显示werdfzxc                                     
echo %p:*we=c%    #第一个bb及其之前的所有字符被替换为c,即显示crdfzxc                                     
set p=%p:*q=c%    #设置变量p,赋值为 %p:*q=c% ,即cwerdfzxc                                               
set /a p=39       #设置p为数值型变量,值为39                                                              
set /a p=39/10    #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3set /a p=p/10                     
                  #用 /a 参数时,在 = 后面的变量可以不加%直接引用set /a p="1&0"                           
                  #"与"运算,要加引号。其它支持的运算符参见set/?                                          
set p=            #取消p变量                                                                              
set /p p=         #请输入屏幕上显示"请输入",并会将输入的字符串赋值给变量p注意这条可以用来取代 choice 命令

10.3 示例

10.3.1 该脚本列出当前目录下面以if开头的文件,并打印出文件名

echo off
for %%f in (./if*) do echo %%f

10.4 必备操作集锦

10.4.1 最好用的批量处理文件脚本 借鉴vivo

版本一
@echo off
setlocal enabledelayedexpansion

for %%F in ("%cd%\Example\*.packed_word") do call :Go "%%F" 

pause
goto :exit

:Go
%cd%\PAK2RAW.exe %cd%\Example\ %~n1.packed_word 1 1 2 0

:exit    

版本二
@echo off
setlocal enabledelayedexpansion

set width=4000	
set height=3000

cd ..
cd ..

for %%F in ("%cd%\*.raw") do call :Go "%%F" 

pause
goto :exit

:Go
%cd%\pack2unpack\rawUnpackU10.exe %cd%\%~n1.raw %cd%\%~n1_1.raw !width! !height!

:exit

10.4.2 读取txt内容

delims负责切分字符串,而tokens负责提取字符串
tokens=有时表示提取全部。
Tokens=*表示删除每行前面的空格。忽略行首的所有空格。
tokens=m表示提取第m列。
tokens=m,n表示提取第m列和第n列。
tokens=m-n表示提取第m列至第n列。

for /f "tokens=*" %%i in (a.txt) do (echo %%i)    
for /f "delims=-" %%i in (歌曲列表.txt) do echo %%i  分隔符为- 默认只显示分隔符前面的内容


保存txt 
adb shell ls -R data/vendor/camera_dump/*main-imgo-PW4032-PH3000-BW5040__4000x3000_10_2.packed_word >a.txt

读取txt
@echo off
setlocal enabledelayedexpansion

for /f "delims=" %%x in (a.txt) do (
set Build=%%x
echo %%x
echo !Build!
)

pause

10.4.3 adb拉取shell中的指定类型文件

方法一
@echo off
setlocal enabledelayedexpansion

for /f "tokens=*" %%G IN ('adb shell ls -R data/vendor/camera_dump/*main-imgo-PW4032-PH3000-BW5040__4000x3000_10_2.packed_word') DO (
echo %%G
adb pull %%G E:/test_unique/adb
)

pause    

10.4.4 windows优先用.cmd文件

10.4.5 os.system执行cmd文件

必须先进入该文件所在的路径,cmd默认禁止执行脚本,必须在文件路径内才能执行 os.system('cd %s && start %s'%(root, file))

10.4.6 字符串分割方法

字符串分割操作
假设原本的变量为
%%s  %1 %0

%0表示当前的.bat批处理文件  %1表示传入的第一个参数
%~dp0当前批处理路径   %0 表示批处理文件本身  ~dp是变量扩充  其中d表示扩充到分区号 p表示扩充到路径
%~nx1当前传入参数的完整文件名test.txt   其中%~n1表示前缀test %~x1表示后缀.txt
%%~nxs 获取变量s的完整文件名
同理可得,对变量%%s, %~nxs表示变量s的完整文件名    

11 SenseTime-FrameWork

11.1 Parrots 基于pytorch的框架

11.1.1 安装指南

  1. 在裸机上部署
    /mnt/lustre/share/platform/download/  安装包
    
    需要将集群上的pymc动态链接库下载下来,放到dir/download/目录下
    /mnt/lustre/share/pymc/py3/mc.so -> dir/download/
    
    解压env.tar.gz并放到download/env下
    
    安装环境 - !这一步会删掉dir/下已有的miniconda, cuda, mpi, nccl目录
    # dir 为待安装目录
    # tmp_dir 为编译的临时目录
    # local_disk 指在本地编译,若换成 local_lustre 则指在 lustre 上面编译
    sh install_env.sh dir tmp_dir local_disk
    
    
    
  2. 使用git工具
    source  /mnt/lustre/share/platform/env/pat_latest   
    
    

11.2 SenseNet 基于caffe的框架

12 Adobe Illustrator 作图软件

12.1 基本工具及快捷键

v 选择工具          选择整个图形
a 直接选择工具       对锚点进行操作,可结合钢笔工具进行锚点的移动
p 钢笔工具
c 剪刀工具        
Shift + c 锚点工具
t 文字工具
r 旋转工具
Alt + 鼠标左键 快速复制图形
Alt + 鼠标滚轮 放大缩小当前画面
Ctrl + z 还原操作undo 
Ctrl + shift + z 重做操作redo
Shift + m 形状生成工具
Shift + e 橡皮擦工具

12.2 使用逻辑

12.2.1 基本图形库

可以直接从word、ppt文档中把基本图形复制粘贴到AI中,即可生成矢量图,并进行编辑

12.2.2 锚点的使用

锚点相当于断点,将直线打断之后就可以进行添加线段或者删除线段的操作

添加锚点:钢笔工具在直线上显示交叉,单击即可添加锚点

删除锚点:直接将锚点拖动到端点即可

修改直线上的锚点位置:先用直接选择工具选中图形即可,之后拖动锚点即可修改图形形状

12.2.3 形状生成器

交叉重叠的图形使用形状生成工具后,图形中的每一个交叉点都会变为单独的个体,按住Alt键点击对应位置,即可删除个体。

13 Adobe Photoshop 作图软件

13.1 基本快捷键

   撤销:CTRL+Z

   旋转操作:先使用自由变换工具,之后鼠标落在画面之外即可对图形进行旋转

   自由变换工具: CTRL+T 选中图层之后 调整图层大小

   快速选择功能: v 可以同时选中多个图层,通过框选区域

   直接选择功能: a

   取消选中 CTRL+D    

   使用技巧: 单击修图  ALT缩小

   蒙版上绘制黑色,可以产生图层之间透明的效果   

   合并图层:选中两个图层之后 Ctrl + e 

14 github

14.1 忽略文件配置

14.1.1 编写逻辑

  1. 在同级目录,即有.git文件夹的路径下新建.gitignore文件
  2. 将忽略配置写入文件

.gitignore的管理范围是当前路径 因此可以用多个.gitignore对不同文件夹分逻辑管理

14.1.2 编写代码

*.jpg 忽略所有Jpg文件
!lib.jpg # 但 lib.jpg 除外    
build # 忽略 build目录, 及下面的文件
*.[oa] # 忽略*.o和*.a文件

dbg # 忽略dbg文件和dbg目录
dbg/ # 只忽略dbg目录,不忽略dbg文件
/dbg # 只忽略当前目录下的dbg文件和目录,子目录的dbg不在忽略范围内

14.1.3 注意事项

注意:如果你创建.gitignore文件之前就push了某一文件,那么即使你在.gitignore文件中写入过滤该文件的规则,该规则也不会起作用,git仍然会对该文件进行版本管理。

14.1.4 无法commit到远端的问题解决

  1. 方案一

    直接删除.git文件夹即可

  2. 设置.gitignore文件 忽略.git文件夹

14.2 git命令

git status 查看状态
git add .  stage所有更改
git commit -m '1' 提交更改
git push origin master 将变更提交到主分支上面
git branch -a 查看所有分支
git checkout 分支名 切换到指定分支
git branch -d 分知名 删除本地分支
git push origin --delete 分支名 删除远端分支
git diff filename1 比较当前修改后的filename1与仓库中的文件的差异

重要
提交当前分支到远端指定分支
git push origin master:dev_yyx   将本地分支master提交到远端的dev_yyx中

配置账号信息
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
同时使用

记录账号和密码
git config --global credential.helper store

15 SenseTime

15.1 标定流程记录

待完成: pack2unpack批量执行代码

  1. 进入手机内存,核对图片保存路径,

cmd环境下:

adb shell 进入手机内存,确认图片路径, 
adb pull /data/vendor/camera D:/ 将图片拉到本地电脑中
  1. 用rawtest里面的generate.py生成用来拍摄的.sh脚本
python generate.py
  1. 执行拍摄脚本
./run_bat *.bat 
  1. 预处理packaged数据文件

pyhton filetricks.py step1() 预处理packaged数据文件

  1. 判断是否需要额外工具

python raw2png.py

5.1 无需额外工具 python filetricks.py 直接运行packed版本的matlab程序,生成.mat文件 以iso段为单位

4.2 需要额外工具 python filetricks.py 自动识别mode并使用pack2unpack工具 step2() pack2unpack工具使用 step3() 将unpakced数据保存在正确的位置

运行unpacked版本的matlab程序,生成.mat文件 以iso段为单位

4.3 验证 python mat2npy.py

15.2 打印机使用方法

15.2.1 windows

直接在浏览器中键入ip地址:10.152.15.226 即可

16 Algorithems & Data Structure

16.1 Sorting

16.1.1 Insertion sort

比较大小,插入序列中合适位置 比如:1-(j-1)的序列已经排序完成 j为下一个需要排序的元素 那么依次将j与j-1,j-2…1比较,然后插入合适位置即可 伪代码如下

screenshot_2019-06-14_10-24-46.png

16.1.2 divide-and-conquer approach 分治法 又称为merge sort归并排序

  1. 概念

    把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并

  2. 关键步骤

    合并两个已排好序的序列 (p,q) (q+1,r) 总长度为n=r-p+1 步骤:取出两个序列中的最小值,并比较,取小者作为新序列的输入值,重复此操作 伪代码如下

    screenshot_2019-06-17_16-57-14.png

    screenshot_2019-06-17_16-57-23.png

    图解算法:merge sort

    screenshot_2019-06-17_16-59-54.png

16.1.3 heapsort堆排序

  1. 基本概念

    heap是个近似的完全二叉树,从左向右填充,根节点是A[1],下标i的父节点A[i/2],左孩子A[2i],右孩子A[2i+1] 最大堆、最大堆性质:除了根节点,A[PARENT(i)]>=A[i] 最大值在根节点 最小堆、最小堆性质:除了根节点,A[PARENT(i)]<=A[i] 最小值在根节点 堆中结点的高度:该结点到叶结点最长简单路径上边的数目

  2. MAX-HEAPIFY维护堆的性质

    目标:最大堆 步骤:i为根节点,则比较A[i],A[left(i)],A[right(i)]的值,将其重新变成一个最大堆 步骤:对A的子树重复上述操作 伪代码

    screenshot_2019-06-17_22-53-53.png

  3. BUILD-MAX-HEAP建堆

    度:结点拥有的子节点的个数 叶子结点:度为0 表达式:A([n/2+1]…n) 原理:叶子结点都可以看做是只有一个元素的堆,所以只需要堆其余的结点调用MAX-HEAPIFY 伪代码

    screenshot_2019-06-17_22-16-47.png

  4. Heap-sort算法 堆排序

    建堆只能保证每个结点的值大于其子结点的值,仅此而已,仍需要排序 Build-Max-Heap保证全局最大值在根节点 适用条件:无序堆-最大堆 Max-Heapify保证全局最大 适用条件:子树最大堆-最大堆 伪代码

    screenshot_2019-06-17_23-25-42.png

16.1.4 Quicksort 快速排序

  1. 基本概念

    关键部分是PARTITION过程,实现了原址重排

    screenshot_2019-06-17_23-48-49.png

    screenshot_2019-06-17_23-59-47.png

  2. 算法分析

    将p-r区间划分partition 主元A[r]为数组最右侧的值 p-i 表示比主元小的元素集合 i-j 表示比主元大的元素集合 j-r 表示还未排序的集合 一次partition最终将集合以主元为界,二分

  3. 性能分析

    性能取决于用于划分的元素,即主元的选择 平衡:性能接近归并排序 不平衡:性能接近插入排序

16.1.5 Counting Sort计数排序

  1. 基本思想

    基本思想为一组数在排序之前先统计这组数中其他数小于这个数的个数,则可以确定这个数的位置 局限性比较大,只限于对整数进行排序 消耗空间发杂度来获取快捷的排序方法

  2. 实现方法

    首先需要三个数组,第一个数组记录A要排序的数列大小为n,第二个数组C要记录比某个数小的其他数字的个数所以第二个数组的大小应当为K(数列中最大数的大小),第三个数组B为记录排序好了的数列的数组,大小应当为n。 A(0-n) C(0-k) B(0-n) C序列 各下标位置存储值为0-k的元素的个数 伪代码

    screenshot_2019-06-18_13-54-17.png

16.1.6 Radix Sort基数排序

  1. 基本概念

    与计数排序的区别在于,这里分别以个位数、十位数为基数,进行基数排序,入桶出桶操作,桶的个数为10 算法示例:

    screenshot_2019-06-18_14-16-26.png

16.1.7 Bucket Sort桶排序

  1. 基本思想

    桶排序的思想近乎彻底的分治思想。桶排序假设待排序的一组数均匀独立的分布在一个范围中,并将这一范围划分成几个子范围(桶) 算法示例:

    screenshot_2019-06-18_14-22-31.png

  2. 区别与联系

    计数排序:对整数范围0-k进行均分 基数排序:对基数,个位、十位、百位等位数进行排序 桶排序:将元素取值范围均分,对范围进行排序,之后对每个桶进行排序,再合并即可

16.1.8 七种sort算法

sort_algorithms_2019-06-13_18-32-29.png

16.1.9 一句话概括七种排序算法

算法名称 算法思想 备注
插入算法 依次比较大小,插入合适位置  
归并算法 分解+合并 合并关键:比较两个有序子列的最小值,取小者作为新序列的输入值  
堆排序 完全二叉树 建堆和维护堆  
快速排序 主元为界二分 p-i i-j两个区间  
计数排序 整数序列:统计小于下标的元素的个数  
基数排序 桶:基数即digit  
桶排序 元素取值范围均分,入桶,桶内进行排序算法,合并桶  

16.2 中位数和顺序统计量

16.3 数据结构

16.3.1 基本数据结构

  1. 动态集合

    在算法操作过程中能够增大、缩小或者发生其他变化,称这样的集合为动态的

  2. Stacks and Queues栈和队列

    Stacks类似于餐厅摞盘子的弹簧 只有最上层的才能取出来 S.top栈顶 Queues类似于收银台排队的顾客 出队元素总是队头的那个 Q.head队头 Q.tail队尾

    1. Stacks栈

      被删除的是最近插入的元素 后进先出LIFO

    2. Queues队列

      被删除的是集合中存在时间最长的元素 先进先出FIFO

  3. 链表
    1. 双向链表

      每个元素都是一个对象,每个对象有一个key和两个指针:next和prev 相邻元素的next-prev指针相连接

    2. 单链表

      忽略每个元素中的prev指针

    3. 哨兵Sentinel

      哨兵是一个哑对象,作用简化边界条件

  4. 指针和对象的实现
    1. 当某些语言不支持指针和对象数据类型的时候

      利用数组和数组下标来构造对象和指针

    2. 两种实现方法
      1. 对象的多数组表示

        用三个数组项key[x],next[x],prev[x]一起表示链表中的一个元素

      2. 对象的单数组表示

        核心思想:以某一长度的地址作为储存空间,A[j-k]中j即为指向该对象的指针 属性Key、next、prev的偏移量分别是0,1,2

  5. Rooted trees有根树
    1. 分支无限制的有根树

      父结点指针p T.root树的根结点 x.left-child 指向结点x最左边的孩子结点 x.right-child 指向结点x最右边的孩子结点

16.3.2 散列表

实质是字典?

  1. 直接寻址表Direct-Address Table
  2. 散列表定义

    散列方式中,元素储存在h(k)中,k为元素的值,函数h将关键字的全域U映射到散列表中 一般来说,散列表大小要比全域小得多

  3. 散列表 映射冲突解决方法
    1. 链接法

      把散列到同一槽中的所有元素都放到一个链表中

    2. 开放寻址法

      所有的元素都存放在散列表里

  4. 散列函数
    1. 除法散列法

      h(k) = k mod m k除以m的余数

    2. 乘法散列法

      h(k) = [m(kA mod 1)]这里的中括号应为向下取整

    3. 全域散列法
  5. 完全散列

16.3.3 二叉搜索树

  1. 基本概念

    二叉搜索树上的基本操作所花的时间与这棵树的高度成正比 链表结构,每个结点是一个对象 对任何结点x,其左子树中的关键字最大不超过x.key,其右子树中的关键字最小不低于x.key

  2. 中序遍历算法

    根据性质:x.left.key < x.key < x.right.key 搜索次序为:左子树 父结点 右子树

  3. 查询二叉搜索树

    由于性质,左 中 右 从根结点向下开始搜索,路径唯一,复杂度为二叉树的告诉

16.3.4 红黑树

  1. 定义

    红黑树是一课二叉搜索树,每个结点增加一个存储为表示结点的颜色Red or Black 通过对任何一条从根到叶子的简单路径上各个结点的颜色进行约束,红黑树确保了没有一条路径会比其他路径长出两倍 每个结点5个属性:color key left right parent

  2. 红黑性质
    1. 每个结点是黑或者红
    2. 根结点是黑色的
    3. 每个叶结点是黑色的
    4. 如果一个结点是红色的,则它的两个子结点都是黑色的
    5. 对于每个结点,从该节点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点。
  3. 红黑树基本操作:左旋和右旋

    对红黑树进行添加或者删除之后,需要左旋或者右旋重新变成红黑树 左旋:x结点 左子树l 右子树r x-l位置 l-仍然是x的左子树 r-x的原始位置 r的左子树-新x的右子树 算法示例:

    screenshot_2019-06-18_16-20-22.png

    右旋:

    screenshot_2019-06-18_16-19-45.png

    左旋示例图(以x为节点进行左旋): z x / / \ –(左旋)–> x y z / y 对x进行左旋,意味着,将“x的右孩子”设为“x的父亲节点”;即,将 x变成了一个左节点(x成了为z的左孩子)!。 因此,左旋中的“左”,意味着“被旋转的节点将变成一个左节点”。

    右旋示例图(以x为节点进行右旋): y x \ / \ –(右旋)–> x y z \ z 对x进行右旋,意味着,将“x的左孩子”设为“x的父亲节点”;即,将 x变成了一个右节点(x成了为y的右孩子)! 因此,右旋中的“右”,意味着“被旋转的节点将变成一个右节点”。

  4. 红黑树的基本操作(二) 添加
    1. 概述

      首先,将红黑树当作一颗二叉查找树,将节点插入;然后,将节点着色为红色;最后,通过旋转和重新着色等方法来修正该树,使之重新成为一颗红黑树

    2. 根据被插入节点的父节点的情况,可以将"当节点z被着色为红色节点,并插入二叉树"划分为三种情况来处理。

      ① 情况说明:被插入的节点是根节点。 处理方法:直接把此节点涂为黑色。 ② 情况说明:被插入的节点的父节点是黑色。 处理方法:什么也不需要做。节点被插入后,仍然是红黑树。 ③ 情况说明:被插入的节点的父节点是红色。 处理方法:那么,该情况与红黑树的“特性(5)”相冲突。这种情况下,被插入节点是一定存在非空祖父节点的;进一步的讲,被插入节点也一定存在叔叔节点(即使叔叔节点为空,我们也视之为存在,空节点本身就是黑色节点)。理解这点之后,我们依据"叔叔节点的情况",将这种情况进一步划分为3种情况(Case)

      screenshot_2019-06-18_16-38-19.png

  5. 红黑树的基本操作(三) 删除
    1. 概述

      将红黑树当作一颗二叉查找树,将该节点从二叉查找树中删除;然后,通过"旋转和重新着色"等一系列来修正该树,使之重新成为一棵红黑树

    2. 将上面的姿态,可以概括为3种情况。

      ① 情况说明:x是“红+黑”节点。 处理方法:直接把x设为黑色,结束。此时红黑树性质全部恢复。 ② 情况说明:x是“黑+黑”节点,且x是根。 处理方法:什么都不做,结束。此时红黑树性质全部恢复。 ③ 情况说明:x是“黑+黑”节点,且x不是根。 处理方法:这种情况又可以划分为4种子情况。这4种子情况如下表所示:

      screenshot_2019-06-18_16-44-28.png

16.4 高级设计和分析技术

16.4.1 动态规划

  1. ALL

    https://blog.csdn.net/hunt_ing/article/details/81904953 重叠子问题 + 最优子结构 最优子结构:当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。 重叠子问题:在用递归算法自顶向下解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。 用递归求解最优解的值

  2. One

    分解: 重叠: 状态转移公式: 递归:

  3. 三个重要的概念

    最优子结构、边界、状态转移公式

  4. 10级梯子模型

    有一座高度是10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶。要求用程序来求出一共有多少种走法。 比如,每次走1级台阶,一共走10步,这是其中一种走法。我们可以简写成 1,1,1,1,1,1,1,1,1,1。 再比如,每次走2级台阶,一共走5步,这是另一种走法。我们可以简写成 2,2,2,2,2。

    假如只差一步就能走完整个楼梯,要分为几种情况?因为每一步能走一级或者两级台阶,所以有如下两种情况:

    1.最后一步走2级台阶,也就是从8级到10级

    2.最后一步走1级台阶,也就是从9级到10级

    那么在上面的基础上假设1级到8级有X种走法,1级到9级有Y种走法,那么1级到10级有几种走法?

    我们把10级台阶的走法表达为F(10)此时: F(10) = F(9)+F(8)

    F(9) = F(8)+F(7)

    F(8) = F(7)+F(6)

    F(3) = F(2)+F(1)

    看到没,我们把一个复杂的问题分阶段分步的简化,简化成简单的问题,这就是动态规划的思想。

    当只有1级台阶和2级台阶时走法很明显,即F(1)=1、F(2)=2,可以归纳出如下公式:

    F(n) = F(n-1) + F(n-2)(n >= 3);

    F(2) = 2;

    F(1) = 1; 动态规划中包含三个重要的概念,最优子结构、边界、状态转移公式。

    上面我们分析出F(10)=F(9)+F(8), 其中,F(9)和F(8)是F(10)的最优子结构。

    当只有1级和2级台阶时,我们可以直接得出结果,而无需再次简化。我们称F(2)和F(1)是问题的"边界",如果一个问题没有边界,那么这个问题就没有有限解。

    F(n) = F(n-1) + F(n-2)是阶段之间的状态转移公式,它是动态规划的核心,决定了问题的每个阶段和下阶段之间的关系。

    至此,动态规划的“问题建模就完成了”。

16.4.2 贪心算法

基本思路 其基本的解题思路为:

1.建立数学模型来描述问题

2.把求解的问题分成若干个子问题

3.对每一子问题求解,得到子问题的局部最优解

4.把子问题对应的局部最优解合成原来整个问题的一个近似最优解

必须注意的是策略的选择必须具备无后效性,即某个状态的选择不会影响到之前的状态,只与当前状态有关,所以对采用的贪婪的策略一定要仔细分析其是否满足无后效性

16.4.3 摊还分析

17 Algorithems & Data Structure 2019 11 02

17.1 学习思想及标准

算法与数据结构是一种思想,一种方法,一种思维方式

  1. 吃透彻 代码用法 使用场景 核心思想
  2. python跑通算法
  3. 精通cpp语言
  4. cpp跑通算法

LeetCode代码为准 把数据结构细节跑通

17.2 10个数据结构+10种算法

17.2.1 数组

  1. 数组
    1. sizeof运算符 求数组长度
      int a1[5] = {1, 2, 3};  // other element will be set as the default value
      int size = sizeof(a1) / sizeof(*a1);      //sizeof(a1[0])结果永远是4
      int size = sizeof(a1) / sizeof(a1[0]);     
      
    2. sort排序
      sort(a1, a1 + size); //a1本身表示指针,a1+size表示数组末尾元素的地址     
      sort(start, end, compare)
      
    3. 枚举数组所有元素
      1. 写法一
        cout << "[Version 1] The contents of a1 are:";
        for (int i = 0; i < size; ++i) {
          cout << " " << a1[i];
        }      
        
      2. 写法二
        cout << "[Version 2] The contents of a1 are:";
        for (int& item: a1) {
          cout << " " << item;
        }      
        
  2. 动态数组 vector 解决内存浪费
    1. 将数组转换为vector
      vector<int> v0;
      vector<int> v1(5, 0); 5个元素 初始值为0
      // 2. make a copy
      vector<int> v2(v1.begin(), v1.end());
      vector<int> v3(v2);
      int a[5] = {0, 1, 2, 3, 4};
      
      vector < int > v4(a, a+4)
      vector<int> v4(a, *(&a + 1));      
      
    2. 求数组长度
      cout << "The size of v4 is: " << v4.size() << endl;      
      
    3. sort排序
      // 7. sort
      sort(v4.begin(), v4.end());      
      
    4. 添加删除元素
      // 8. add new element at the end of the vector
      v4.push_back(value);
      // 9. delete the last element
      v4.pop_back();      
      // 10. 在a.begin()+1 位置插入一个元素,值为5
      a.insert(a.begin()+1,5); 
      // 11. 在a.begin()+1 位置插入3个元素,值为5
      a.insert(a.begin()+1, 3, 5); 
      // 12. 在a.begin()+1 位置插入数组b的b+3, b+5个元素,不包括b+6
      a.insert(a.begin()+1,b+3,b+6); //b为数组,在a的第1个元素(从第0个算起)的位置插入b的第3个元素到第5个元素(不包括b+6),如b为1,2,3,4,5,9,8 ,插入元素后为1,4,5,9,2,3,4,5,9,8
      
  3. 二维数组
  4. 字符串
    1. 简介

      字符串实际上是一个Unicode字符 数组,所有数组操作都可以用

    2. 额外操作
      #include <iostream>
      
      int main() {
          string s1 = "Hello World";
          // 1. concatenate
          s1 += "!";
          cout << s1 << endl;
          // 2. find
          cout << "The position of first 'o' is: " << s1.find('o') << endl;
          cout << "The position of last 'o' is: " << s1.rfind('o') << endl;
          // 3. get substr
          cout << s1.substr(6, 5) << endl;
      }     
      
    3. substr 截取子串
      #include<string>
      #include<iostream>
      using namespace std;
      int main()
      {
          string x="Hello_World";
          /*默认截取从0到npos.重载原型为string substr(_off=0,_count=npos);npos一般表示为string类中不存在的位置,_off表示字符串的开始位置,_count截取的字符的数目*/
          cout<<x.substr()<<endl;
          cout<<x.substr(5)<<endl;//截取x[5]到结尾,即npos.重载原型为string substr(_off,_count=npos)
          cout<<x.substr(0,5)<<endl;//以x[0]为始,向后截取5位(包含x[0]),重载原型string substr(_off,_count)
          /*
          备注:
          指定的截取长度加起始位置即_off+_count>源字符串的长度,则子字符串将延续到源字符串的结尾
          */
      }      
      

17.2.2 链表

  1. 单链表
    1. 初始化赋值
      TreeNode(int x) : val(x), left(NULL), right(NULL) {} //把x赋给val,left和right赋值NULL      
      
    2. 代码示例
      // Definition for singly-linked list.
      struct SinglyListNode {
          int val;
          SinglyListNode *next;
          SinglyListNode(int x) : val(x), next(NULL) {}
      };      
      
    3. 添加操作

      与数组不同,我们不需要将所有元素移动到插入元素之后。因此,您可以在 O(1) 时间复杂度中将新结点插入到链表中,这非常高效。

      众所周知,我们使用头结点来代表整个列表。因此,在列表开头添加新节点时更新头结点 head 至关重要。

17.3 数据结构c++语言清华大学邓俊辉

17.3.1 复杂度

  1. 时间复杂度

    渐进上界:最差情况 O(n) 渐进下界:最好情况 ou(n)

  2. 空间复杂度

    时间复杂度是空间复杂度的天然上界

  3. 常数O(1)

17.3.2 递归

自我调用

  1. 数组求和算法 线性递归版

    计算n的元素和 = 计算前n-1个元素的和 + 第n个元素

    减而治之的思想

17.3.3 抽象数据类型 ADT

  1. 数组

    连续地址单元 元素A[i]对应的物理地址为:A + i x S 其中S 一般为4 byte

  2. ADT接口

    应该支持多种操作接口 size() get() put()等等

17.3.4 列表

从数组的静态存储方式更改为动态存储,其物理地址不需要连续,添加、删除操作所需要的时间大大缩小

17.3.5 栈与队列

栈:只在顶部 后进先出lifo 队列:银行排队 先进先出fifo

17.3.6 二叉树

  1. 有根树的定义

    根节点 节点 边

    1. 深度

      每个节点v到根节点r所经过边的数目,称作v的深度

    2. 度数

      节点v的孩子总数(恰好比v低一层的子节点)称为度数或者度

    3. 无孩子的节点称为叶节点

      包括根在内的其他节点称为内节点

    4. 树的高度

      树中所有节点深度的最大值称作树的高度

  2. 二叉树

    每个节点的度数都不超过2 不含一度节点的二叉树称为真二叉树

  3. 有根数 -> 二叉树

    左儿子右兄弟 引申规则:右兄弟 那么兄弟连成一条线

  4. 二叉树的实现

    基本组成实体 节点

17.3.7

  1. 基本概念

    G = (V, E) 顶点 和 边

    1. 度数

      与顶点v关联的边数称为v的度数

    2. 简单图

      不含任何自环的图

    3. 邻接矩阵

      图的最基本的实现方式

    4. 邻接表

      邻接矩阵空间效率低,换为表的形式

17.3.8 搜索树

18 LeetCode学习

18.1 学习策略及逻辑

  1. 第一遍对题目用到的c++语法全部熟悉
  2. 第二遍对题目用到的算法思想
  3. 尝试自己手写全部题目
  4. 尝试优化答题思路

18.2 正序题号

18.2.1 哈希表 Hash table

  1. 数据类型比较
    1 数组 连续地址 cpu缓存 快 不易拓展
    2 链表 散列地址 cpu内容 慢 适合拓展
    3 哈希表 连续+散列 拉链法 数据内容与数据地址之间用hash函数对应

    特征:数据地址由数据内容确定

  2. 常用散列法
    1. 除法散列法

      index = value % 16

    2. 平方散列法

      index = (value * value) >> 28 (右移,除以228。记法:左移变大,是乘。右移变小,是除。)

    3. 斐波那契(Fibonacci)散列法

      index = (value * 2654435769) >> 28

18.3 python版本

18.3.1 1

  1. 基础知识
    name 名称 editable 书写 命名方式 调用方式 备注
    list 列表 可修改 [] a[0] a[0]  
    tumper 元组 不可修改 () a(0) a[0] 单元素元组命名:a(50,)
    dictionary 字典 可修改 {} dicts = {key:value} value = dicts[key] 等效于value = dicts.get(key) 单一映射,只能由键找值
  2. enumerate枚举

    函数用法: for index,value in enumerate(lst): 第一个是index 第二个是list中的值

  3. zip()

    用法示例

    books = ['疯狂Kotlin讲义', '疯狂Swift讲义', '疯狂Python讲义']
    prices = [79, 69, 89]
    # 使用zip()函数压缩两个列表,从而实现并行遍历
    for book, price in zip(books, prices):
        print("%s的价格是: %5.2f" % (book, price))
    

    输出结果:

    疯狂Kotlin讲义的价格是: 79.00
    疯狂Swift讲义的价格是: 69.00
    疯狂Python讲义的价格是: 89.00
    

18.3.2 2

  1. 求余运算

    243//10 = 24 243/10 = 24.3 243%10 = 3

  2. 循环语句的写法
    while(l1 or l2):
        x= l1.val if l1 else 0
        y= l2.val if l2 else 0
        s=carry+x+y
        carry=s//10
        r.next=ListNode(s%10)
        r=r.next
        if(l1!=None):l1=l1.next
        if(l2!=None):l2=l2.next     
    

18.3.3 3

python中遍历问题,喜欢用字典dictionary,原因是速度快 通过if判断是否之前添加过到字典中,从而查找到符合一定条件的值。

18.3.4 4

  1. list数据类型相关操作
    list.append()            在list末尾添加元素
    list.insert(0, '周杰伦')  在list位置0添加元素“周杰伦”     
    list.reverse()           翻转list
    list1.extend(list2)      合并list
    list[:]                  取全部元素
    list.sort()              对列表进行排序,括号内为排序方法,可以缺省
    

18.3.5 5

  1. Manacher 马拉车算法
    1. 处理流程
      1. 原字符串每个字符间插入新的字符,比如#
      2. 求解新字符串中,以每个字符为中心的最长字符串的长度
      3. 当前已经查找到的最大回文串半径MaxR 与 i为中心对应回文半径的关系有三种情况
      4. 讨论三种情况,结论是,只需要查询黄线部分即可。
    2. 三种可能性情况

      情况一: r线段与r1线段关于中心点对称,他们的最长会问半径一定相等 因此只需计算r1的中心点坐标即可

      screenshot_2019-06-15_19-45-12.png

      情况二:

      screenshot_2019-06-15_19-45-29.png

      情况三:

      screenshot_2019-06-15_19-45-57.png

    3. 伪代码
      /*
      String:加'#'处理后的回文串
      MaxR:最长回文半径的右边界
      flag:最长回文半径对应的中心点下标
      cnt[i]:以i为中心对应的回文半径
      length:String长度
      对应关系:MaxR = flag + cont[flag] - 1
      */  
      for i to length
        if MaxR > i:               //如果当前点被最长回文半径右边界包含
          cnt[i]=min(cnt[2*flag-i],MaxR-i) //取情况1和情况2中较小的(防止超出MaxR范围)
        else:
          cnt[i]=1
        while(String[i+cnt[i]] == String[i-cnt[i]]):
          cnt[i]++;
        if i+cnt[i] > MaxR:
          MaxR=i+cnt[i],flag=i;     
      
    4. 结果分析
      String: $ # a # b # a # a # b # a # 0
      cnt:    1 1 2 1 4 1 2 7 2 1 4 1 2 1      
      
  2. 正则表达式
    1. 库1
      .	匹配除换行符以外的所有字符
      x?	匹配0次/1次x字符串
      x*	x匹配>=0次
      x+	x匹配>=1次
      *	任何字符匹配>=0次
      .+	任何字符匹配>=1次
      {m}	指定字符串匹配=m次
      {m,n}	指定字符串匹配>=m 并<=n次
      {m,}	指定字符串匹配>=m次
      []	匹配符合[]内的字符
      [^]	匹配不符合[]内的字符
      [0-9]	匹配所有数字字符
      [a-z]	匹配所有小写字母字符
      [^0-9]	匹配所有非数字字符
      [^a-z]	匹配所有非小写字母字符
      ^	匹配字符开头的字符
      $	匹配字符结尾饿字符
      \d	匹配一个数字的字符,=[0-9]
      \d+	匹配多个数字的字符,=[0-9]+
      \D	匹配一个数字的字符,=[^0-9]
      \D+	匹配多个数字的字符,=[^0-9]+
      \w	英文字母,数字或下划线的字符串,=[a-zA-Z0-9_]
      \w+	=[a-zA-Z0-9_]+
      \W	=[^a-zA-Z0-9_]
      \W+	=[^a-zA-Z0-9_]+
      \s	=[\n\t\r\f]
      \s+	=[\n\t\r\f]+
      \S	=[^\n\t\r\f]
      \S+	=[^\n\t\r\f]+
      \b	匹配以英文字母,数字为边界的字符串
      \B	匹配不以英文字母,数字为边界的字符串
      a|b|c	匹配符合a字符/b字符/ c字符的字符串
      模式匹配修饰符
      修饰符	描述
      i	忽略模式中的大小写
      m	多行模式
      o	仅赋值一次
      s	单行模式,".“匹配”\n"(默认不匹配)
      x	忽略模式中的空白
      g	全局匹配
      cg	全局匹配失败后,允许再次查找匹配串
      注意:如果在正则表达式中匹配.,+等通配符,需要转义\.
      
    2. 库2

      https://www.cnblogs.com/michelle-phone/p/8590684.html

      .小数点  匹配任意    单个字符  不包括换行符
      \w      匹配任意    单个字母 或 单个数字或 单个下划线(对应的英文单词word)
      \W      匹配任意    单个非字母  或单个非数字 或单个非下划线(与\w相反)
      \d      匹配任意    单个数字 相当于[0-9](对应的英文单词digital)
      \D      匹配任意   不是数字的单个字符(与\d相反)
      \s      匹配任意    一个不可见字符,等价于[\f\n\r\t\v](对应的英文单词space)
      \S      匹配任意    一个可见的字符(与\s相反)
      ^       匹配开始位置 
      $       匹配结束位置
      1 *          等价于{0,}
      2 ?          等价于{0,1}
      3 +          等价于{1,}
      4 {n}        重复n次
      5 {n,}       重复>=n次
      6 {n,m}      重复n到m次      
      1  (a|b|c) 匹配abc中的任何一个 
      2  [abc] ===[a-c] 一个字符集合。匹配方括号的中任意字符 
      3  [^abc] ===[^a-c] 一个反向字符集。匹配任何没有包含在方括号中的字符 
      4  由最不优化到最优化(a|b|c)=[abc]=[a-c
      1 分组 :以括号进行分组
      2     用括号括住的部分(pattern) 匹配pattern并获取这一匹配。该匹配内容存放在相应的内存数组中,
      3 引用:一个括号对应的项以$1-$9引用,以括号的顺序从$1开始,最多可以捕获9个
      4 如/(\d{4})-(\d{2})-(\d{2})/ 假设匹配2018-03-17。那么 $1对应的内容是2018
      5                                                   $2对应的内容是03
      6                                                   $3对应的内容是17
      
    3. 用法示例
      [xyz]字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”
      [^xyz]负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”。      
      

18.3.6 6

  1. 二维数组、矩阵的创建和初始化元素
    rows = [[] for _ in range(numRows)]     # 创建[[], [], [], []]的数组
    rows[counts].append(c)                  # 添加元素的格式
    
  2. 把字符串连接起来

    ''.join([''.join(r) for r in rows])

18.3.7 7

  1. *与**运算符

    *表示乘法 **表示乘方

18.3.8 8

  1. 判断字符串是不是空格的方法isspace()
    s = 'hello there'
    for i in s:
       print i.isspace()     
    
  2. 判断字符串是不是数字isdigit() 字母.isalpha()
  3. 判断语句 and or

    if a and b and c if a or b or c

  4. 数组索引 倒序

    a[1:3] a[-1]表示倒数第一个元素 a[0:-1] 数组中index 0 到结尾

18.3.9 9

  1. 判断奇数偶数

    a % 2 == 0 偶数

  2. 在每个字符间隔插入#

    '#'.join(x) 效果如下 120hellow world '1#2#0#h#e#l#l#o#w# #w#o#r#l#d'

18.3.10 10

  1. 获取元素的index 该方法只能查找第一个出现的索引

    如果是string s.index('h') 如果是数组 s.index(1)

  2. 获取所有元素的索引 enumerate

    [index for (index,value) in enumerate(lst) if value == item]

18.3.11 11

18.3.12 12

18.3.13 13

18.3.14 14

  1. str.join方法
    str = "-";
    seq = ("a", "b", "c"); # 字符串序列
    print str.join( seq );     
    

18.3.15 15

  1. 三数之和问题

    用指针于中心值两端

18.3.16 16

18.3.17 17

18.3.18 18

18.3.19 19

18.3.20 20

  1. 使用stack栈来处理

    数据结构提供思路,需要动手去构建栈,而不是现成的栈给你使用

18.3.21 21

18.4 c++版本

18.4.1 1

  1. 时间复杂度

    https://blog.csdn.net/qq_41523096/article/details/82142747

    经典的4种时间复杂度 O(1)< O(logn)< O(n)< O(n2

18.5 C-Plus-Plus题解库

18.5.1 sorting


18.6 核心要点

18.6.1 动态规划

  1. 理解

    是什么: 能用动态规划解决的问题:

    1. 问题的答案依赖于问题的规模
    2. 大规模问题的答案可以由小规模问题的答案递推得到
    3. 将一个大问题拆分为多个小问题来解决,取决于该问题是否能用动态规划解决的是这些”小问题“会不会被被重复调用

    核心参数: 建立状态转移方程、缓存并复用以往结果、按顺序从小往大算

  2. 用法
    缓存中间结果:也就是搞个数组之类的变量记录中间结果。
    按顺序从小往大算:也就是搞个for循环依次计算。     
    

19 人工智能-AI

19.2 基础知识

19.2.1 卷积操作

  1. 基本说明

    卷积操作如下:

    http://cs231n.github.io/assets/conv-demo/index.html

    https://zhuanlan.zhihu.com/p/35333316

    假设卷积层的输入特征图大小为Cin x H x W, 卷积核大小为K1 x K2, padding = P1 x P2, stride = S1 x S2, filter 数目为Cout

    输出的特征图大小为Cout x Hout x Wout, 其中

      Hout = [(H - K1 + 2P1) / S1] + 1

      Wout = [(W - K2 + 2P2) / S2] + 1

    []表示向下取整。

    卷积核的厚度H, 一般等于前层厚度M(输入通道数,或前层feature map数)

  2. 示例

    信息列表 Filter个数:32 原始图像shape:224*224*3 卷积核大小为:2*2

    一个卷积核的参数: 2*2*3=12 !!!!!! *3与输入图的通道数一致,kernel size为 2x2x3 与输入图 224x224x3卷积 通道数必须一致!!!,厚度为3 个数为32 16个卷积核的参数总额: 16*12 + 16 =192 + 16 = 208 weight * x + bias根据这个公式,即可算的最终的参数总额为:208

19.2.2 计算卷积层的参数个数

  1. 卷积核参数量

    有 Cout 个卷积核

    每个卷积核为Cin 层,size K1 x K2

    Cout x Cin x K1 x K2

  2. 乘法计算量:

    为了得到输出的特征图的某一个位置的像素值,需要 Cin x K1 x K2次乘法操作,而特征图总共有Cout x Hout x Wout个像素,因此总计算量为                     Cout x Hout x Wout x ( Cin x K1 x K2)

19.2.3 计算卷积层前后的张量维度

默认参数:
torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)

张量维度:
x = [batch_size, channels, height, width]                   [2, 1, 7, 3]
Conv2D = [channels, output, kernal_height, kernal_width]    [1, 8, 2, 3]
res = [batch_size, output, output_height, output_width]     [2, 8, 6, 1]
output_height = height - kernal_height + 1 + 2*padding = 7 - 2 + 1 + 2*0 = 6
output_width = width - kernal_width + 1 + 2*padding = 3 - 3 + 1 + 2*0 = 1
计算公式
W2=(W1-F+2*P)/S+1,W1是卷积前的图像大小,W2为卷积后,F为卷积核大小,P为填充,S为步长 其中 向下取整

计算示例:
x = inputs=torch.Tensor([[[[1,2,3],          # [1, 1, 3, ,3]
          [4,5,6],
          [7,8,9]]]])
conv1=nn.Conv2d(1,2,kernel_size=3,padding=1)
conv2=nn.Conv2d(1,2,kernel_size=3)

x = [1, 1, 3, 3]
output1 = [1, 2, 3, 3]
output2 = [1, 2, 1, 1]

代码示例:
import torch

x = torch.randn(2,1,7,3)
conv = torch.nn.Conv2d(1,8,(2,3))
res = conv(x)

print(res.shape)    # shape = (2, 8, 6, 1)    

19.2.4 GPU显存占用计算

https://blog.csdn.net/sweetseven_/article/details/96026706

VGG中
卷积核参数数量:
cin * k * k * cout  138M
对于float32 每个参数4bytes 
显存占用:138M * 4 /1024/1024 = 528 MB

layer输出参数:
H * W * cout  15.2M
显存占用:15.2 * 4 /1024/1024 = 58.12MB

训练阶段:
Memory for models:
显存占用:params + SGD + momentum = 1.54G                       para x3
如果优化器是Adam: params + SGD + momentum + RMSprop  para x4

Memory for outputs: 正向传播+反向传播 因此x2
batch size * 58.12 * 2 = 14.53G 

Total memory:
1.54G + 14.53G = 16.07G    

19.2.5 优化器

优化器Adam,momentum是SGD传播过程中的优化方法

momentum动量:SGD过程中为了避免陷入局部最小值,用动量来累计之前的梯度
引入一个新的变量 v去积累之前的梯度,实际梯度方向为momentum和SGD向量之和

AdaGrad: 梯度平方和累加r=r+g^2,梯度归一化w1=w1-g/square r * a  

RMSprop  root mean square prop: AdaGrad基础上,对r和g^2给个权重系数,相当于结合历史梯度信息

Adam=momentum+RMSprop    

19.3 Paper研读

19.3.1 Dr. Amit

  1. MazaheriASkipConnectionArchitectureforLocalizationofImageManipulationsCVPRW2019paper
    1. 基础知识
      1. RNN
        1. 与CNN的区别

          训练样本输入是连续的序列,且序列的长短不一,比如基于时间的序列:一段段连续的语音,一段段连续的手写文字。这些序列比较长,且长度不一,比较难直接的拆分成一个个独立的样本来通过DNN/CNN进行训练

        2. 处理序列

          模型的feature h(t)是变化的不再是确定的值,而是由h(t-1)和x(t)来决定的 在序列索引号t位置的隐藏状态h(t),则由x(t)和在t−1位置的隐藏状态h(t−1)共同决定

        3. 前向传播与后向传播

          前向传播:沿着神经网络输入到输出,更新权重w 反向传播:沿着神经网络输出到输入,更新权重w

      2. LSTM Long Short-Term Memory
        1. RNN的变种

          LSTM可以避免常规RNN的梯度消失

        2. 与RNN的区别

          LSTM在在每个序列索引位置t的门一般包括遗忘门,输入门和输出门三种 遗忘门(forget gate)顾名思义,是控制是否遗忘的,在LSTM中即以一定的概率控制是否遗忘上一层的隐藏细胞状态 输入门(input gate)负责处理当前序列位置的输入

19.4 决策树

19.4.1 基本特点

  1. 分类

    离散or连续

  2. 特征选择

    最好的决策树是CART分类树 ID3和C4.5用于分类,CART可用于分类与回归

    ID3(通过信息增益选择特征)、C4.5(通过信息增益比选择特征)、CART(通过Gini指数选择特征)

    CART分类树通过基尼指数选择最优特征,同时决定该特征的最优二值切分点,而ID3和C4.5直接选择最优特征,不用划分。

  3. 划分原则

    使用某特征对数据集划分之后,各数据子集的纯度要比划分钱的数据集D的纯度高(也就是不确定性要比划分前数据集D的不确定性低)

  4. 裁剪 过拟合 用随机森林来做

    决策树容易过拟合,一般需要剪枝来缩小树结构规模、缓解过拟合。

19.4.2 CART分类树

  1. 算法

    输入:训练数据集D,停止计算的条件

    输出:CART决策树

    根据训练数据集,从根结点开始,递归地对每个结点进行以下操作,构建二叉树:

    Step1:设结点的训练数据集为D,计算现有特征对该数据集的基尼指数。此时,对每一个特征A,对其可能取的每个值a,根据样本点A=a的测试为“是”或“否”将D分割为D1和D2两部分,利用上式Gini(D,A)来计算A=a时的基尼指数。

    Step2:在所有可能的特征A以及他们所有可能的切分点a中,选择基尼指数最小的特征及其对应可能的切分点作为最有特征与最优切分点。依最优特征与最有切分点,从现结点生成两个子节点,将训练数据集依特征分配到两个子节点中去。

    Step3:对两个子结点递归地调用Step1、Step2,直至满足条件。

    Step4:生成CART决策树

    算法停止计算的条件是节点中的样本个数小于预定阈值,或样本集的基尼指数小于预定阈值,或者没有更多特征。

  2. python代码实现

19.5 随机森林

19.5.1 基本概念

本质上是决策树,多个决策树组成了随机森林

相对于单个决策树,增强了准确率降低了解释性

19.5.2 随机性

  1. 训练集大小为N, 随机且又放回的抽样N个训练样本作为该树的训练集
  2. 如果每个样本的特征维度为M,指定一个常数m<<M,随机地从M个特征中选取m个特征子集,每次树进行分裂时,从这m个特征中选择最优的;

19.5.3 随机森林分类效果(错误率)与两个因素有关:

森林中任意两棵树的相关性:相关性越大,错误率越大;

森林中每棵树的分类能力:每棵树的分类能力越强,整个森林的错误率越低。(特征越小,看法越片面,分类能力就越弱)

减小特征选择个数m,树的相关性和分类能力也会相应的降低;增大m,两者也会随之增大。所以关键问题是如何选择最优的m(或者是范围),这也是随机森林唯一的一个参数。

19.5.4 袋外误差率 out of bag error(oob error)

19.6 分类与回归

19.6.1 回归 不需要加上softmax函数

回归问题的应用场景(预测的结果是连续的,例如预测明天的温度,23,24,25度)

回归问题通常是用来预测一个值,如预测房价、未来的天气情况等等,例如一个产品的实际价格为500元,通过回归分析预测值为499元,我们认为这是一个比较好的回归分析。一个比较常见的回归算法是线性回归算法(LR)。另外,回归分析用在神经网络上,其最上层是不需要加上softmax函数的,而是直接对前一层累加即可。回归是对真实值的一种逼近预测。

19.6.2 分类

分类问题的应用场景(预测的结果是离散的,例如预测明天天气-阴,晴,雨)

分类问题是用于将事物打上一个标签,通常结果为离散值。例如判断一幅图片上的动物是一只猫还是一只狗,分类通常是建立在回归之上,分类的最后一层通常要使用softmax函数进行判断其所属类别。分类并没有逼近的概念,最终正确结果只有一个,错误的就是错误的,不会有相近的概念。最常见的分类方法是逻辑回归,或者叫逻辑分类。

19.6.3 聚类 也成为无监督分类

如果给定一组样本特征 , 我们没有对应的属性值 , 而是想发掘这组样本在 维空间的分布, 比如分析哪些样本靠的更近,哪些样本之间离得很远, 这就是属于聚类问题

19.6.4 降维

如果我们想用维数更低的子空间来表示原来高维的特征空间, 那么这就是降维问题

降维就是希望去除特征的冗余, 用更加少的维数来表示特征.降维算法最基础的就是PCA了, 后面的很多算法都是以PCA为基础演化而来

20 Spring 2018

20.1 EE 147

20.1.2 淘宝course hero

20.2 EE 243

20.2.1 hw2

  1. Matlab程序资料备份
    1. 第二问
      1. docomposion 的一个例子及链接
      2. reconstruction using function waverec2
      3. reconstruction using function wrcoef2!!!!!!
      4. 两个重构函数的区别在于:
        1. wrcoef2能够处理细节
        2. waverec2只能多维度处理
      5. 近似系数函数的解释

        wavelet.png

        1. S矩阵的第一行是N级近似系数
        2. 第二行到倒数第二行,是detailed 系数矩阵 排列顺序是H V D
        3. 最后一行是原始的图像
        4. C矩阵存储的元素依次为:第二级 1282*4+2562*3=262144个
    2. 第二问用到的函数
      1. wavdec2
      2. waverec2
    3. 第三问
      1. 拉普拉斯变换
      2. 边缘检测官网文件汇总
      3. edge函数
    4. 第三问所用到的资料
      1. 3.a edge函数
      2. 3.b Detect lines in grayscale image using Hough Transform 不能用
      3. 3.b build-in function hough
      4. 3.b 自己写hough函数
        1. 一个简述hough transform原理的博客
        2. 现成的自定义hough函数代码
    5. 第四问
      1. Shi-Tomasi corner detector 什么是这个检测器

    6. 第四问实现方法
      1. 4.a detectMinEigenFeatures
        1. getCorners.m文件 用detectMinEigenFeatures函数实现
        2. 4.a 文件按照assignment里面的要求写即可
      2. 4.b featurematching.m文件
        1. 4.b.1 getFeatures
          1. 需要完成getCorners.m在4.a中
          2. 需要完成getFeatures.m文件
            1. getFeatures.m的用处

              extract the Histogram of Gradient (HoG) features

            2. 实现HoG features
              1. extractHOGFeatures build-in function 仅供参考理解 老师不允许用
              2. 自定义函数
        2. 4.b.2 getMatches.m
        3. 4.b.3 featurematching.m

20.2.2 Project proposal

  1. 要求
    Project Abstract
    Posted on: Friday, April 13, 2018 11:38:53 PM PDT
    
    也即小五 9磅字体
    Please submit a short 1-para abstract of your course project by 11.59PM April 27. The abstract should include the following.
    1. Brief description of the problem you want to work on.
    2. A paper related to the problem that you would like to focus on. Usually, this will mean implementation of, at least, a part of the paper. However, it could also include theoretical analysis of an approach. Describe how you chose this paper.
    3. What results you will present as part of your project.
    The abstract should not be more than 1 page single column 12 point font.
    We will provide a submission folder. Please name your submission (your last name)\_(your first name).pdf.
    It is fine to align your course project with your research, but it is important to define what you will do in the course project.
    
  2. 初选题目
    1. 3D 重构
      1. SIFT
      2. SFM Structure from Motion
      3. PCL
    2. 构思

      Python openSFM openMVG openCV point cloud

  3. 思路整理
    1. 题目

      Implement 3D reconstruction by using global Structure from Mothon (SFM)

    2. 工具:

      openCV python

    3. paper:

      N. Jiang, Z. Cui and P. Tan, "A Global Linear Method for Camera Pose Registration," 2013 IEEE International Conference on Computer Vision, Sydney, NSW, 2013, pp. 481-488. doi: 10.1109/ICCV.2013.66

      [2] Changchang Wu, "VisualSFM: A Visual Structure from Motion System", http://ccwu.me/vsfm/, 2011

      P. Moulon, P. Monasse and R. Marlet, "Global Fusion of Relative Motions for Robust, Accurate and Scalable Structure from Motion," 2013 IEEE International Conference on Computer Vision, Sydney, NSW, 2013, pp. 3248-3255. doi: 10.1109/ICCV.2013.403S.

    4. approach:
      1. SIFT

        特征值提取 可以采用AKAZE最新版来处理

        https://www.zhihu.com/search?type=content&q=sfm

      2. kd-tree

        特征点匹配 从而得到符合要求特征点个数的图片

      3. F-matrices epipolar constraint极线约束

        Geometric constraints

      4. bundle adjustment 光束平差法

        采用一个非线性最小二乘的优化方法求解

      5. RANSAC方法

        降噪

      6. global

        增量式:一张一张加图片

        全局式:只在最后一步BA

      7. camera pose

        Monocular camera

      8. CMVS

        从稀疏点云SFM到密集点云CMVS

    5. 结果:

      an external camera pose per image and a 3D point cloud (the structure)

20.2.3 hw3

  1. Problem 1
    1. Problem 1 归一化切割和图像分割
      1. 参考资料
        b)  在命令行中输入 mex -setup 
         根据指引选择。我用的是VS10 对就选择的是Microsoft Visual C++ 2010。(注:对于其他VS版本不保证能运行通过,因为没有亲测。)
        c) 在命令行中输入  compileDir_simple
        
    2. Problem 1 Ncut深度理解
      1. 图论理解
        • 邻接矩阵 无向图 也就是相似性矩阵
        • degree of node di: i点到其他所有点的线的个数之和 di = Sij j
        • volume of set: 该set中所有点i的度数之和
        • cut: i-A j-!A Sij 之和
        • Ncut: Ncut(A,B)=cut(A,B)(1/vol(A)+1/vol(B))
      2. 在Ncut领域的重新表述
  2. Problem 2
    1. Problem 2 参考资料
      1. 源代码参考
      2. 原理解释:
      3. 百度搜索栏汇总
    2. Problem 2 EM算法核心理解
      • 首先初始化,假设N个点分别属于M个集合
      • 有集合的方程,可以计算每个点对应于某个集合的概率,取最大值更新ownership
      • 对所有点更新ownership,之后,可以重新统计集合中的数据的个数,更新权重、均值和标准差
      • 重复进行即可
  3. Problem 3
    1. Problem 3
      1. 相关资料
        1. Motion-Based Multiple Object Tracking Matlab官方文档 可能是最适合的
        2. Detecting Cars Using Gaussian Mixture Models MATLAB官方文档
        3. csdn 人脸检测
        4. 视频多目标跟踪

20.2.6 hw6

  1. 参考资料
    1. 矩阵变换 重要知识 仿射变换与投影(透视)变换
    2. 本征矩阵只与外部参数的旋转 平移有关,基础矩阵与内部和外部参数有关。
    3. 八点法求解基础矩阵

20.2.7 SFM

  1. 大纲
    • 多幅图像获取内参矩阵
    • 多幅图像提取特征点SIFT
    • 特征点+内参矩阵获取本征矩阵
    • 特征点+本征矩阵获取相对矩阵
    • 相对矩阵 进行三角测距获取空间坐标
  2. 参考资料
    1. 很好的统筹讲解,包含CMVS csdn博客
    2. 坐标系转换 CSDN博客
    3. MATLAB实现相机标定
  3. 相机标定
  4. 畸变参数

    纠正过来即可

  5. 本征矩阵 极线约束

    前提:内参已知,相机的位置信息已有。 极线约束:极线上的点有相应的约束关系,用来减少检索的工作量。而本征矩阵只与旋转与平移向量有关。 https://www.cnblogs.com/clarenceliang/p/6704970.html http://www.360doc.com/content/14/0205/14/10724725_349963695.shtml

  6. 三角测量
  7. bundler adjustment 光束平差法

    用计算出的三维点坐标跟内参、外参矩阵参数重投影,计算与真实图像平面投影的差值。最小二乘求最小 BA现在基本都是利用LM(Levenberg-Marquardt)算法并在此基础上利用BA模型的稀疏性质来进行计算的 https://blog.csdn.net/OptSolution/article/details/64442962

20.3 EE 297

21 小技巧

21.1 电脑使用

21.1.1 ThinkPad T440 快速启动使用SSD加速

使用expresscache 查看运行状态命令:eccmd.exe -info 取消加速资料盘的命令:eccmd -exclude d 需要启用快速启动:在cmd(管理员)模式下:powercfg /H On 开启快速启动须开启休眠功能

21.1.2 笔记本外接显示器

  1. 问题描述

    如果关闭笔记本显示器,只在外接显示屏上显示,会出现卡顿问题,原因在于使用了核心显卡作为图像处理显卡

  2. 解决方案
    1. 方案一 最优解

      在英伟达显卡管理中,设置独立显卡为全局设置即可 核心显卡可以保持开启,但是一定要在管理3D设置中电源管理模式修改为最高性能有限。

    2. 方案二 禁用核心显卡即可 但是会影响夜间模式等功能

      只在外接显示屏上显示 需要禁用核心显卡

21.2 autohotkey

使用方法详见Top layers 必备操作集锦

21.3 vpn使用

21.3.1 NordVPN

最有效:使用手机热点登录 目前有效的方法,每次使用网上提供的最新的服务器

21.4 linux环境

21.4.1 ssh登录用法

ssh yangyixin@10.106.20.31

21.4.2 vim编辑器基本使用方法

Ecs 切换输入模式和命令模式

  1. 文件管理
    :q  退出
    :wq 保存并退出
    :q! 不保存并退出
    :w 保存
    :w! 强行保存
    :wq --> :x
    
  2. 编辑
    i: 在当前光标所在字符的前面,转为输入模式;
    a: 在当前光标所在字符的后面,转为输入模式;
    o: 在当前光标所在行的下方,新建一行,并转为输入模式;
    I:在当前光标所在行的行首,转换为输入模式
    A:在当前光标所在行的行尾,转换为输入模式
    O:在当前光标所在行的上方,新建一行,并转为输入模式;    
    

21.4.3 ssh之后退出当前登录

exit

21.5 git客户端更新 windows

git update-git-for-windows

21.6 只要是涉及到处理图像的问题

去除噪声太重要了!!!

gray = cv2.medianBlur(gray, 3)

21.7 cmd获取本机IP地址

ipconfig   

21.8 windows执行linux命令 bash 运行shell脚本

需要安装git bash并添加到环境变量然后即可直接bash install.sh 执行命令了

22 能力

22.1 Top Layers

学习效率 我要做什么 解决问题的标准流程 如何保持持久的兴趣

状态保持:兴趣 克制 心如止水 正反馈机制 实践出真知 状态是目标 包含了相关的能力

问题解决:分步 建立标准流程 分点-定点 两点:要解决什么问题,关键点出在哪里

能力总结:一定要越详细越具体越好

思想永远比勤奋更重要

项目 + 能力 跳出舒适区

英语

22.2 问题处理流程

22.2.1 解决问题的思想

不能只提供思路,要有方案和细节

个人价值和定位

22.3 Verify

自律 时间规划写下来 正反馈机制

22.4 Demo

  • 计划 框架 学习能力 学习效率 兴趣 正反馈机制 实践出真知
  • 劳逸结合 精力分配 休息的频率 脑力体力转换 方法>>努力
  • 规划设计

22.5 核心能力 精简版

22.5.1 效率提升 + 解决能力

带着目的去处理问题 分类 精准定位 问题到底出在哪里

信息熵

22.6 顶层设计

22.6.1 能力测试

生活=程序 尝试=验证 数字化

22.6.2 状态保持

  1. 能力检索
    • 状态调整 痛苦 专注 框架 效率 兴趣
    • 状态调整 思维永生 黑暗 兴趣
    • 状态调整 思维永生 x y fun 分类器 逻辑顺序
    • 状态调整:绝望 信仰 兴趣 证明自己
    • 思维永生:计划 脑子 放松
    • 计划 时效
    • 绝望 信仰 脑子 兴趣
    • 思维辅助:目标 提炼 细化
    • 状态辅助:认识新事物的本能 兴趣
    • 分类:学习的动力 痛苦+兴趣
    • 分类:做事的能力 效率 脑子 休息 放松
  2. 能力提升
    1. 计划

      提前做好计划,什么时候该干什么确定下来

22.6.3 神级分析能力:

  • 模仿
  • 控制变量

22.7 能力树

22.7.1 20200228-商汤最新版本

  1. Head
    • 机会是自己争取出来的
    • 多与别人交流
    • 方法比努力更重要
    • 痛苦,物有不平则鸣
    • 不要关注小细节,只抓大方向
    • 学习效率 我要做什么 解决问题的标准流程 如何保持持久的兴趣
    • 自我进化 拒绝温水煮青蛙 成为一个掌握方向的人 而不仅仅是一个干活的人
    • 学习方法+知识体系 模块化工程化
  2. 学习快速,高效获取某领域知识的方法
    1. 目标
      • 熟悉前沿进展 能够深刻理解、总结出最新工作的创新点和存在的问题。
      • 以解决问题为出发点,思考创新方法(整合或者革新)
    2. 读文章
      • 带着目的去读,核心贡献是什么,效果怎么样,有哪些不足,不足的根源出在哪里。
      • 如何快速获取文章核心思想
  3. 时间计划

    具体到任务内容,完成的时间段

22.7.2 时间规划

概览:PPT 英语 AI C++ 能力实践

Table 2: 每日计划
时间 事项
2hr 英语听力学习
   

22.7.3 分析能力

  • 提炼
  • 细化

22.7.4 处理问题

  • Google 搜索获取知识 优先找实例
  • 参考知识库
  • 控制变量

22.7.5 状态保持

  • 优先级分类
  • 能力分类检索

22.7.6 时间规划:

  • 合理分配决定体量
  • 最大化产能
  • 上限:最优绝对学习时间
  • 精力分配 取舍 分轻重缓急

22.7.7 学习效率

  • 总结:理解透彻 模仿实例 控制变量debug
  • 最高效的方法是:找实例,仿写,活用
  • 问题分类:理解类,实用类

22.7.8 学习专注

  • 绝望 足够痛苦 不惜一切代价压迫
  • 音乐兴趣 本身知识兴趣
  • 信仰永生
  • 兴趣 提升-持续投入

22.7.9 学习类型

  • 理解类:
  • 上课:特点 怎么用
  • 程序 实用 类:通过实例,程序来理解 视频或者实例
  • 做题,处理类:
  • 总结 知识归纳类:

22.7.10 作业-文本表述能力

  • 简扼描述
  • 参考paper的表述逻辑
  • 养成academic integrity习惯

22.7.11 英语听力

  • 专注语音信息
  • 实体化 音频为问题
  • 语义分析,着重提供的信息

22.7.12 乒乓球

  • 专注:预测
  • 脚步:转体
  • 借力回推:不发力

22.7.13 论文阅读、文献理解

换位思考,如果你是作者你会怎么处理你的论文

22.7.14 PPT制作

把文字内容简化、提炼 以图表,时间轴等形式图形化展示出来

22.7.15 英语听力

精听: 跟读:

23 专业知识、技能提升-牧原期间整理

23.1 思路

  1. 完成项目
  2. 核心在于自我提升,学习获取知识的方法
  3. 精准掌握意向岗位的核心需求,重新编写技能书:看招聘信息

23.2 学习优先级

  1. Emacs
  2. C++
  3. caffe等框架
  4. 深度学习框架
  5. 计算机视觉最新方法
  6. 并行计算
  7. 算法与数据结构
  8. 项目部署框架

23.3 必备技能

  • 语言:C++ python
  • 算法
  • 深度学习框架:工程:caffe tensorflow 学术:pytorch
  • 深度学习经验
  • AI理论知识

23.4 加分项

  • 模型压缩 精简 剪枝 量化
  • 算法部署到设备端、嵌入式、云端

23.5 参考模型

libfacedetection

23.6 技能树

23.6.1 深度学习框架

  1. 模型优化方向
    1. 掌握yolo,faster-rcnn等常用目标检测模型以及图像分类模型及训练技巧,熟悉分割模型
    2. 熟悉caffe/tensorflow/mxnet/pytorch框架开发深度学习模型和验证常用算法;
    3. 使用CUDA、openMP和MPI等并行编程;
    4. 深度学习在检测、分割、跟踪、3D,检索等相关经验
    5. 具有深度学习,计算机视觉,视频分析,三维重建/ SLAM和计算机图形学
    6. 深度模型训练,图像分类.物体检测与分割.视频分析.三维建模.计算机图形学等相关科研经历者
    7. 熟悉常用机器学习理论和技术,了解LR,贝叶斯,SVM,树模型和EM等常用模型和思想;了解RL和推荐系统基本原理和算法,能阅读CNN,RNN和GAN等的相关论文
    8. 神经网络模型设计与优化、强化学习、迁移学习、主动学习、推荐、随机优化等的算法和系统研发(华为)
  2. 计算机视觉方向(Computer Vision)

    学习paperswithcode网站中所有CV领域的最佳实现方法

23.6.2 C++框架

  1. 学习DLL库实现cnn的方法
  2. 算法和数据结构功底
  3. 熟悉Hadoop/Spark/Hive技术优先(华为)

23.6.3 项目部署框架

  1. docker搭建 需要代码测试
  2. 如何用C++实现神经网络
  3. 如何在服务器上面运行.ipynb
  4. 熟练掌握Flask框架,了解Django框架,熟悉 python+uwsgi+nginx部署 。熟悉docker及其 相关操作
  5. 熟悉Tensorflow,掌握Tensorflow-Serving自动部署工具 掌握hadoop集群部署
  6. 掌握模型加速和压缩的方法,有较多的TensorRT加速深度模型推理时间的经验;有ncnn在 Android端基于人脸MTCNN模型的NDK项目开发经验,熟悉TVM
  7. 掌握spark计算框架,熟悉mllib/spark sql并调优ETL/OLAP应用
  8. 使用CUDA、openMP和MPI等并行编程;
  9. 掌握spark计算框架,熟悉mllib/spark sql并调优ETL/OLAP应用
  10. 熟悉hadoop hdfs/mapreduce/yarn/hive/mysql等组件和使用,并部署和调优分布式HA系统,熟练SQL操作
  11. 了解druid/hbase/flume/kafka/zeppelin等组件并针对大数据背景下丌同的应用场景做出合理架构,了解K8S管理容器技术

23.6.4 华为任职要求

任职要求:1、精通Java、C++、python等主流开发语言的一种,熟悉Linux操作系统;2、熟练掌握常用的软件架构模式,并能熟练使用基本的编程编译工具;3、3年及以上项目开发经验,能独立承担4K规模子系统和模块开发设计工作,有以下相关经验、技能者优先考虑: 1)熟悉分布式架构、有分布式软件开发经验者; 2)熟悉大数据AI(图像分析、视频处理)、Hadoop软件者; 3)有云计算及大数据/SDN/NFV领域开发经验者; 4、具有良好的沟通能力,刻苦、敬业、有上进心,有良好的团队合作精神。对技术有激情,喜欢钻研,能快速接受和掌握新技术,有较强的独立、主动的学习能力。 5、熟悉深度学习的基本原理DNN,CNN,RNN者优先,熟悉三大主流TF、Caffe、MxNet深度学习框架者优先;

来自 https://www.zhipin.com/job_detail/f0fae3e802f3b2121nN-3di7FlI~.html?ka=comp_joblist_4

岗位职责: 1.人脸检测、人脸特征点定位、人脸特征提取和比对、人脸属性识别、活体检测等人脸相关算法的研究、开发和改进。 2.目标检测相关算法的研究、开发与改进 岗位要求: 1.硕士及以上学历,模式识别、机器学习、计算机、数学、图像处理等相关专业; 2.掌握深度学习基础知识,具备实际项目经验优先,具备与人脸识别,目标检测相关项目经验优先; 3.熟练掌握C/C++,熟悉Python,熟悉Caffe、Tensorflow等至少一种深度学习框架; 4.较强的论文检索,英文专业文献阅读、理解和算法实现能力; 5.较强的沟通表达与团队协作能力; 6.具备人脸识别、深度学习算法实习经验,或参赛并取得较好名次优先。

来自 https://www.zhipin.com/job_detail/ff204f25da7586461HR92du7F1Q~.html?ka=comp_joblist_9

24 终极写作模板 latex完美版

24.1 源代码

详情见github中的相关文件

25 待完成插件

evil-leader

  • 然后用其实现/markdown的所有功能(非常轻松)
  • 可以用其方便的实现命令行功能(其实是emacs的功能),使用linux的指令。
  • 再之后可以尝试org-mode的gtd功能
  • 再之后可以尝试下org-mode的导出功能,导出html之类的不值得提,org-mode可以导出和导出思维导图。
  • 可以尝试一下org-mode的多文件查找,以及快速捕捉系统。
  • 再之后可以尝试下org-mode的对代码块的强大处理
  • 可以直接在代码块里执行c/c++/python等等语言,输出代码执行的结果,而无须切换回来
  • 可以尝试了解下org-mode的与其它组件的配合。以及可以了解下emacs和evil。另外也可以了解下配合git实现版本管理。
  • 最后,如果你对编程有些了解,那么所有你不满意的地方,都可以自己改,而不是向作者抱怨能否再下一版本实现某某功能。

26 TODO 待办事项

26.1 临时处理

  1. 预训练模型x44 x24 重新执行
  2. 环境搭建的markdown语言
  3. 自己吃透代码
  4. 索引图片 后缀名等格式
  5. 数据保存所有汇总集合
  6. numpy 库

任务: packed数据 - unpacked数据 vivo处理工具

学习方向: 对齐 网络结构 超分 多帧 降噪 增强 画质评测-增强 去噪声 保留细节 清晰度梯度 DSRCNN 单帧超分经典算法

26.2 紧急 紧急类型

  • State "紧急" from "TODO" [2018-04-24 周二 10:49]
  • State "TODO" from "TODO" [2018-04-24 周二 10:44]

26.2.1 TODO 完成EE243 Hw3

26.2.2 TODO 完成EE147 Lab3并提交

26.2.3 TODO 开始进行EE243的project

26.2.4 TODO 复习EE147 期中考试

  • 期中考试样题
  • PPT 可能会考的题型
  • 课本前五章,不包括减法

26.2.5 TODO 完成EE297 project proposal

26.2.6 TODO 顶层能力

26.3 学习 学习知识,技能 长期任务

  • State "学习" from "TODO" [2018-04-24 周二 10:53]

26.3.1 TODO 算法 C++ 英语 深度学习

26.3.2 TODO 关于emacs Python 支持 以及jupyter notebook支持 matlab支持

  • State "TODO" from "学习" [2018-04-24 周二 10:55]

26.3.3 TODO 学习英语

26.3.4 TODO 学习Python语言 Tesoroflow

26.3.5 TODO 学习emacs orgmode中的思维导图gtd

26.3.6 TODO 学习子龙山人知乎视频中关于package自定义,加速emacs启动等相关内容

26.3.7 TODO 学习使用latex编辑公式 也即math mode

26.3.8 TODO 学习使用思维导图模式来处理Ability的demo

26.3.9 TODO 解决掉demo.org转换html文件时速度极慢的问题

26.3.10 TODO 关于emacs中的解决不了的问题,可以咨询Chen Bin在github

26.3.11 TODO 最有效的学习layer配置自定义

26.3.12 TODO 学习latex中配置begin environment的方法,对于论文写作很有帮助

26.3.13 TODO 中文字体设置 https://www.jianshu.com/p/b1751078e28e

26.4 事件 需要处理的事情

26.4.1 TODO 美国 Fall 2019

MFA GSHIP 医疗保险 I20 F-1签证 疫苗要求 9月准备国内面试 GRE及美国博士或者就业 追溯系统 租房 买车

联系bhanu 选课2019Fall 博士申请 刷题找工作LEETCODE cssa接机

26.4.2 TODO 完成州内学费申请

  • State "TODO" from "事件" [2018-04-24 周二 11:02]

26.4.3 TODO 完成Kim grad student form 截止日期 6.15

26.5 零碎 零碎的事情

  • State "事件" from [2018-04-24 周二 11:06]

26.5.1 IDEA EE243 HW3 problem 1 考虑迭代问题和K值聚类

  • State "IDEA" from "TODO" [2018-05-09 周三 11:04]

27 代码测试区

import numpy
import time

28 emacs版本控制文件位置

28.1 20191111

  1. U盘
  2. google drive 个人电脑ThinkPad X1 Extreme牧原文件夹
  3. google drive 我的云端硬盘emacs文件夹

Created: 2020-06-20 周六 18:44

Validate