/AIBasicToolBox

AI 基础工具箱

BSD 2-Clause "Simplified" LicenseBSD-2-Clause

AI 基础工具箱

说明

  1. 来源于新手日常工作积累、踩坑,目的是方便更多新人快速上手,少像我一样走弯路。
  2. 默认顺序是一台新电脑开始配置,也可以直接看需要的部分。
  3. 不会列特别详细的内容,但是会给出链接,部分会有特别提醒注意事项。
  4. 涉及到的库很多是基于 Python 的。
  5. 不定期持续更新,有任何疑问欢迎 Issue。

目录

更改源

更改 Linux 系统软件源,让下载个更新更快。常用源有以下几个:

下面例子是 Ubuntu16.04(xenial)的。不同的系统版本源不同,注意更换。

# 备份原文件
mv /etc/apt/sources.list /etc/apt/sources.list.bak

# 修改镜像源
cat > /etc/apt/sources.list << END  
deb https://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
END

# 更新源列表(Ubuntu)
sudo apt-get update

参考至(好网站):

Terminal&Bash

系统配置文件

所有用户

  • /etc/profile: 此文件为系统的每个用户设置环境信息。当用户登录时,该文件被执行一次,并从 /etc/profile.d 目录的配置文件中搜集 shell 的设置。一般用于设置所有用户使用的全局变量。
  • /etc/bashrc: 当 bash shell 被打开时,该文件被读取。也就是说,每次新打开一个终端 shell,该文件就会被读取。
  • /etc/paths

单个用户

  • ~/.bash_profile: 登录之后在 /etc/profile 载入之后载入, 十分重要的配置文件
  • ~/.bash_login: 登录之后如果 ~/.bash_profile 不存在的话, 载入这个文件
  • ~/.profile: 登录之后 ~/.bash_login 不存在的话, 才载入这个文件

只对单个用户生效,当用户登录时该文件仅执行一次。

  • ~/.bashrc: bash shell 只对单个用户生效,当登录以及每次打开新的 shell 时,该文件被读取。
  • ~/.bash_logout

注意:

参考至:设置 Linux 环境变量的方法和区别_Ubuntu_给力星

环境变量

  • LIBRARY_PATH
    • 环境变量用于在程序编译期间查找动态链接库时指定查找共享库的路径
    • 例如,指定 gcc 编译需要用到的动态链接库的目录。设置方法如下(其中,LIBDIR1 和 LIBDIR2 为两个库目录):export LIBRARY_PATH=LIBDIR1:LIBDIR2:$LIBRARY_PATH
  • LD_LIBRARY_PATH
    • 环境变量用于在程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径
    • 注意,LD_LIBRARY_PATH 中指定的路径会在系统默认路径之前进行查找。
    • 设置方法如下(其中,LIBDIR1 和 LIBDIR2 为两个库目录):export LD_LIBRARY_PATH=LIBDIR1:LIBDIR2:$LD_LIBRARY_PATH
  • 概括
    • 开发时,设置 LIBRARY_PATH,以便 gcc 能够找到编译时需要的动态链接库。
    • 发布时,设置 LD_LIBRARY_PATH,以便程序加载运行时能够自动找到需要的动态链接库。
  • 不同操作系统的名称
OS Environment Variable Name
Linux LD_LIBRARY_PATH
Solaris 32-bit ruby LD_LIBRARY_PATH_32 or LD_LIBRARY_PATH
Solaris 64-bit ruby LD_LIBRARY_PATH_64 or LD_LIBRARY_PATH
HP-UX PA-RISC 32-bit ruby SHLIB_PATH
HP-UX PA-RISC 64-bit ruby LD_LIBRARY_PATH
HP-UX IA64 LD_LIBRARY_PATH
Mac OS X DYLD_LIBRARY_PATH
AIX LIBPATH

参考至:

TerminalMultiplexers:Screen&Tmux

远程会话窗口管理器,就是让你的远程连接(SSH)不中断,退出后下次登录时程序依然在运行。具体可参考:

SSH&MOSH

GIT

因为很多软件都需要从 GitHub 下载,所以需要优先配置一下。Git 命令不需要专门记,常用的就几个,其他的用时查一下就可以了。

命令行工具

查找搜索

复制粘贴

版本控制及包管理

注意:安装 Conda 后,pyenv 的虚拟环境会由 Conda 接管。详见:pyenv/pyenv-virtualenv: a pyenv plugin to manage virtualenv (a.k.a. python-virtualenv)

数据科学常用包

数据存储及快速查询

  • TAR,GZIP, BZIP2, XZ 对比
    • 需要在内存很小的机器(如小于 128 MB)上解压缩时,选择 gzip 格式。
    • 需要在很简单、沒有什么工具可用的机器上解压缩时,选择 gzip 格式。
    • 需要节省带宽、缩短下载所需时间时,选择 xz 格式。
    • 推荐用 gz 压缩:
      • tar zcvf test.tar test 仅打包,不压缩
      • tar zcvf test.tar.gz test 打包后以 gzip 压缩
      • tar zxvf test.tar.gz -C /to/your/path 解压缩到某目录
      • 存储用 xz(速度慢,压缩效率高):
        • tar Jcvf file_name.tar.xz dir_name 压缩
        • tar Jxvf file_name.tar.xz 解压缩

参考至:Linux 中最佳的壓縮格式:為什麼 bzip2 會被 xz 取代?那 gzip 又如何? - G. T. Wang

CUDA & CUDNN

强烈建议看官方文档,不要看各类教程。

IDE

代码检查

代码测试

主要分单元测试和集成测试。

代码部署

性能

工程

设计五原则

  • SOLID(单一功能、开闭原则、里氏替换、接口隔离以及依赖反转)
首字母 指代 概念
S 单一功能原则 对象应该仅具有一种单一功能
O 开闭原则 软件体应该是对于扩展开放的,但是对于修改封闭的
L 里氏替换原则 程序中的对象应该是可以在不改变程序正确性的前提下被它的子类对象所替换的
I 接口隔离原则 多个特定客户端接口要好于一个宽泛用途的接口
D 依赖反转原则 高层次的模块不应该依赖于低层次的模块,两者都应该依赖于抽象接口;抽象接口不应该依赖于具体实现,而具体实现则应该依赖于抽象接口。

来源:如何在 Python 里应用 SOLID 原则 | 阿驹

  • 当考虑需要什么类以及类要有什么方法时,应该尝试下面的方法。

    • (1)写下问题的描述(程序要做什么),把所有名词、动词和形容词加下划线。
    • (2)对于所有名词,用作可能的类。
    • (3)对于所有动词,用作可能的方法。
    • (4)对于所有形容词,用作可能的特性。
    • (5)把所有方法和特性分配到类。

    现在已经有了面向对象模型的草图了。还可以考虑类和对象之间的关系(比如继承或协作)以及它们的作用,可以用以下步骤精炼模型。

    • (1)写下(或者想象)一系列的使用实例,也就是程序应用时的场景,试着包括所有的功能。
    • (2)一步步考虑每个使用实例,保证模型包括所有需要的东西。如果有些遗漏的话就添加进来。如果某处不太正确则改正。继续,直到满意为止。

来源:如何设计好一个 python 的类? - 知乎

刷题

  • 在线编程练习
    • LeetCode
    • hihoCoder
    • Train with Programming Challenges/Kata | Codewars
    • LintCode:在线刷题网站,汇集了各大公司的算法面试题。有阶梯式训练题库,帮你选好应该刷的题目,特别适合小白和懒人。评测数独很快,最大的中文在线题库。
    • geeksforgeeks.org —— 据说是印度人搞的刷题网站,上面有很多公司的面试题,也有论坛。不过上面都是英文,估计很多印度人在上面放面经,科科。
    • Codecademy.com —— 包含在线编程练习和课程视频。比较适合小白入门编程语言。网页界面也比较友好。但是,没有算法方面的在线测试。
    • Codehs.com —— 包含数据结构、游戏设计、动画类编程题。
    • programmingpraxis.com —— 此网站编程练习不保存分数、不排名、不竞赛
    • projecteuler.net —— 有 590 道题,会显示难度水平和提交完成率
    • hackerearth.com —— 注册帐号后可参与编程练习(有内推到知名企业的机会)
  • 编程竞赛
    • hackerrank.com ——包含编程题和项目开发挑战
    • Codeforces.comtopcoder.com —— 包含大量题库,对解答者进行排名。
    • codechef.com —— 包含编程竞赛、在线程序设计挑战,题目难度从入门、简单、中等到挑战都有,会举办竞赛,获胜者会有奖金。
    • topcoder.com —— 经常在线举行编程竞赛,可以去练练手,找找成就感。不过,有的竞赛题目并不简单,也比较刁钻。
  • 各种语言算法实现

部分参考至:有程序员专门刷题的网站吗? - 知乎

论文、会议及期刊

其他

致谢

  • 所有作者,是你们的智慧让我们感受到了知识的力量。
  • 所有传播者,是你们的乐于分享让我们在探索路上不再孤单彷徨。
  • 童老师,资深算法工程师,牛人。其实相当大一部分内容来自童老师,从他身上学到太多东西,以至于现在还才消化了一丢丢。
  • 明生的博客 | Scott's Blog,自称木讷的程序猿,他的吐槽和对代码优雅的执着追求让我被迫改变了很多。