AI 基础工具箱
说明:
- 来源于新手日常工作积累、踩坑,目的是方便更多新人快速上手,少像我一样走弯路。
- 默认顺序是一台新电脑开始配置,也可以直接看需要的部分。
- 不会列特别详细的内容,但是会给出链接,部分会有特别提醒注意事项。
- 涉及到的库很多是基于 Python 的。
- 不定期持续更新,有任何疑问欢迎 Issue。
目录
- 更改源
- Terminal&Bash
- 系统配置文件
- 环境变量
- TerminalMultiplexers:Screen&Tmux
- SSH&MOSH
- GIT
- 命令行工具
- 查找搜索
- 复制粘贴
- 版本控制及包管理
- 数据科学常用包
- 数据存储及快速查询
- CUDA&CUDNN
- IDE
- 代码检查
- 代码测试
- 代码部署
- 性能
- 工程
- 设计五原则
- 刷题
- 论文、会议及期刊
- 其他
- 致谢
更改源
更改 Linux 系统软件源,让下载个更新更快。常用源有以下几个:
- 阿里云镜像 http://mirrors.aliyun.com
- 网易镜像 http://mirrors.163.com
- 搜狐镜像 http://mirrors.sohu.com
- 清华大学开源软件镜像 https://mirrors.tuna.tsinghua.edu.cn
- **科学技术大学开源软件镜像 https://mirrors.ustc.edu.cn
下面例子是 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
- Terminal: iTerm2 - macOS Terminal Replacement
- Bash: oh-my-zsh,需要先安装 Zsh: Installing ZSH
系统配置文件
所有用户
/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
注意:
- 使用
source /etc/environment
可以使变量设置在当前窗口立即生效,需注销 / 重启之后,才能对每个新终端窗口都生效。 - 如果是 bash 是 zsh 或其他的,需要修改对应的配置文件。
- 建议针对当前用户修改
- 详细可移步:.bash_profile,profile,bashrc 的区别和启动顺序 和 科学网—linux 中 PATH 环境变量的作用和使用方法 - 张志斌的博文
参考至:设置 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 |
参考至:
- LIBRARY_PATH 和 LD_LIBRARY_PATH 环境变量的区别 - 大圆那些事 - 博客园
- LD_LIBRARY_PATH 与 LIBPATH - russle 的专栏 - CSDN 博客
TerminalMultiplexers:Screen&Tmux
远程会话窗口管理器,就是让你的远程连接(SSH)不中断,退出后下次登录时程序依然在运行。具体可参考:
- 使用 screen 管理你的远程会话。简单使用:
- 创建:
screen -S name(随便输一个名字)
- 查看:
screen -ls
- 进入:
screen -r name(随便输的那个名字)
- 退回到命令行,让程序在 screen 后台自动运行:
Control + a + d
- 创建:
- 更强大的 Tmux:
- 二者使用对比:Terminal Multiplexers: Screen, Tmux - Hyperpolyglot
SSH&MOSH
- SSH 原理与运用(一):远程登录 - 阮一峰的网络日志
- 优化 SSH(断网不影响连接):
- 服务器本地传输
- 推荐:SSHFS: libfuse/sshfs: A network filesystem client to connect to SSH servers
- 挂载磁盘
- RSYNC: rsync
GIT
因为很多软件都需要从 GitHub 下载,所以需要优先配置一下。Git 命令不需要专门记,常用的就几个,其他的用时查一下就可以了。
- 可以当工具用的
- 常用 Git 命令清单 - 阮一峰的网络日志
- Git 下载部分内容:DownGit
- GitHub 如何选择开源许可证?
- 一些技巧
命令行工具
- 20 Command Line Tools to Monitor Linux Performance
- 13 Linux Performance Monitoring Tools - Part 2
- 命令行使用代理:使用 shadowsocks 及 ProxyChains-NG 实现终端 (iterm) 下代理
- 快速 CD:
- 命令行处理文本(包括:显示、文件合并、去重、分割):
- 各种命令使用快查:tldr-pages/tldr: Simplified and community-driven man pages
- 应该知道的 Linux 技巧
查找搜索
- 快速查找:junegunn/fzf: A command-line fuzzy finder,这里有一些很好的例子:Examples · junegunn/fzf Wiki
- 文本搜索:Geoff Greer's site: The Silver Searcher
- 字符串搜索:pyahocorasick — ahocorasick 1.1.0 documentation
复制粘贴
- Mac: Copy to and Paste from the Clipboard on the Mac OSX Command Line
- Mac: alfred-clipboard 调出所有复制过的文本
- Mac 一键上传图片到亿方云并生成链接:jiwenxing/qimage-mac: mac 版本的 markdown 一键贴图工具,基于 alfred 实现,支持本地文件、截图、网络图片一键上传七牛云,使用简单方便
版本控制及包管理
- 虚拟机管理:Vagrant by HashiCorp
- 版本控制:pyenv/pyenv: Simple Python version management,注意 pyenv 的路径是可以改的
- 安装软件(不是安装 pyenv),举例安装 Anaconda:
wget -P $(pyenv root)/cache https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-4.0.0-MacOSX-x86_64.sh
pyenv install Anaconda3-4.0.0
- 创建:
pyenv virtualenv [version] [name]
- 激活:
pyenv activate name
orsource activate name
- 关闭:
pyenv deactivate
- 安装软件(不是安装 pyenv),举例安装 Anaconda:
- 包管理:Conda — Conda documentation
- conda 必须安装 miniconda 或 Anaconda
conda list
conda search
- 创建:
conda create -n [name] python=3.6.2
- 激活:
source activate name
- 关闭:
source deactivate
- Python 包管理:pip — pip 9.0.1 documentation
- 建议的虚拟环境:Reference Guide — virtualenv 15.1.0 documentation
- 安装:
pip install virtualenv
- 创建:
mkdir name; virtualenv --arguments [name]; cd name
- 激活:
source ./bin/activate
- 关闭:
deactivate
- 安装:
注意:安装 Conda
后,pyenv
的虚拟环境会由 Conda
接管。详见:pyenv/pyenv-virtualenv: a pyenv plugin to manage virtualenv (a.k.a. python-virtualenv)。
数据科学常用包
- IPython
- 基础运算:NumPy
- 数据清理分析:Pandas
- 画图的:Matplotlib
- 机器学习:scikit-learn
- 可以写代码 + 笔记的 NoteBook:Project Jupyter | Home
- 安装:
pip install jupyter
- jupyter_contrib_nbextensions: A collection of various notebook extensions for Jupyter(推荐,有很多安好的插件):
pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user
jupyter nbextension enable codefolding/main
- server extension: jupyter_nbextensions_configurator: A jupyter notebook serverextension providing config interfaces for nbextensions.(不太推荐):
-
pip install jupyter_nbextensions_configurator
-jupyter nbextensions_configurator enable --user
- 远程服务器 jupyter notebook 创建(如何创建参照网上教程)后,本地访问:本地创建
ssh remote_name@remote_address -L127.0.0.1:remode_port:127.0.0.1:local_port
就可以在本地用localhost:local_port
访问了 - 并行:ipython/ipyparallel: Interactive Parallel Computing in Python
-pip install ipyparallel
-ipcluster nbextension enable
- 安装:
数据存储及快速查询
- 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
- 字典存储:DAWG
- 数据存储:leveldb 资料整理 - 区块链知识库
- 数据结构:Bloom filter - Wikiwand
CUDA & CUDNN
强烈建议看官方文档,不要看各类教程。
- CUDA
- cuDNN
sudo apt-get install cuda-x-0
: 安装非最新版本- 卸载
sudo apt-get --purge remove cuda
sudo apt autoremove
sudo apt-get clean
- 找不到 5 时可以软链:
ln -s libcudnn.so.6.* libcudnn.so.5
IDE
- SublimeText:
- 设置 TAB 键为空格:
{ "tab_size": 4, "translate_tabs_to_spaces": true, }
- pep8 插件,使用:
Ctrl + Shift + 8
- 设置 TAB 键为空格:
- Vim
代码检查
- 代码检查:flake8 3.4.1 : Python Package Index
- 代码复杂度检查:rubik/radon: Various code metrics for Python code
- 统计代码行数:CLOC -- Count Lines of Code
- 代码对比:Scooter Software: Home of Beyond Compare
- 建议阅读代码整洁之道 (豆瓣),初期不需要太追求优化。
代码测试
主要分单元测试和集成测试。
- 和 github 做持续集成的服务:Continuous Integration and Delivery - CircleCI
- Python 写测试的框架,可以参考:pytest: helps you write better programs — pytest documentation
代码部署
- GitHub 至少两个分支:dev 和 master,均为通过测试的正式版
- master 为发布版
- dev 为开发版
- 自动触发:Watchman A file watching service | Watchman
性能
- 尽量使用 Numpy 或 Pandas,因为它们底层是 C
- Numpy 计算深度学习:tfdeploy
- 数据库利用索引和 Cache
- 索引是将常见的查询在数据库中建好索引表
- Cache 是数据库常用的操作
- Boost.Python Tutorial - 1.65.1
- Tutorials — Cython
工程
- 部署
- JWT
- RPC
- RestfulAPI
- 工程架构参考
- 这里是比较经典的一些各公司架构:All Time Favorites -
- Quora 做部署的架构,比较适合小公司:Continuous Deployment at Quora - Engineering at Quora - Quora
- 参考网站:Buy/Sell Digital Currency - Coinbase
- donnemartin/system-design-primer: Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards.
- High Performance Browser Networking (豆瓣)
设计五原则
- SOLID(单一功能、开闭原则、里氏替换、接口隔离以及依赖反转)
首字母 | 指代 | 概念 |
---|---|---|
S | 单一功能原则 | 对象应该仅具有一种单一功能 |
O | 开闭原则 | 软件体应该是对于扩展开放的,但是对于修改封闭的 |
L | 里氏替换原则 | 程序中的对象应该是可以在不改变程序正确性的前提下被它的子类对象所替换的 |
I | 接口隔离原则 | 多个特定客户端接口要好于一个宽泛用途的接口 |
D | 依赖反转原则 | 高层次的模块不应该依赖于低层次的模块,两者都应该依赖于抽象接口;抽象接口不应该依赖于具体实现,而具体实现则应该依赖于抽象接口。 |
来源:如何在 Python 里应用 SOLID 原则 | 阿驹
-
当考虑需要什么类以及类要有什么方法时,应该尝试下面的方法。
- (1)写下问题的描述(程序要做什么),把所有名词、动词和形容词加下划线。
- (2)对于所有名词,用作可能的类。
- (3)对于所有动词,用作可能的方法。
- (4)对于所有形容词,用作可能的特性。
- (5)把所有方法和特性分配到类。
现在已经有了面向对象模型的草图了。还可以考虑类和对象之间的关系(比如继承或协作)以及它们的作用,可以用以下步骤精炼模型。
- (1)写下(或者想象)一系列的使用实例,也就是程序应用时的场景,试着包括所有的功能。
- (2)一步步考虑每个使用实例,保证模型包括所有需要的东西。如果有些遗漏的话就添加进来。如果某处不太正确则改正。继续,直到满意为止。
刷题
- 在线编程练习
- 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 —— 经常在线举行编程竞赛,可以去练练手,找找成就感。不过,有的竞赛题目并不简单,也比较刁钻。
- 各种语言算法实现
部分参考至:有程序员专门刷题的网站吗? - 知乎
论文、会议及期刊
-
汇总
-
自然语言处理(NLP)
-
机器学习(ML)
-
人工智能(AI)
-
数据挖掘(DM)
-
推荐系统(RS)
其他
- 正版软件代理:数码荔枝 - 专注于分享最新鲜优秀的正版软件
- Spectacle: Mac 窗口拖拉
致谢
- 所有作者,是你们的智慧让我们感受到了知识的力量。
- 所有传播者,是你们的乐于分享让我们在探索路上不再孤单彷徨。
- 童老师,资深算法工程师,牛人。其实相当大一部分内容来自童老师,从他身上学到太多东西,以至于现在还才消化了一丢丢。
- 明生的博客 | Scott's Blog,自称木讷的程序猿,他的吐槽和对代码优雅的执着追求让我被迫改变了很多。