认真对待工作生活中每一件事

核心能力:

  • 技术(学思练写)
  • 英语(听说读写)
  • 写作
  • 沟通
  • 刷题

技术

技术是工具,掌握学习新技术,以及使用新技术的方法更重要,当然深厚的计算机基础以及广泛的涉猎是必须的

如何学好技术

博观而约取,厚积而薄发

  • 保持好奇心

    • 对于自己不会的点,查缺补漏,要弄通透,不能只当时查了用,等闲下来还是要再研究研究
  • 不求甚解

    • 对于一时看不懂的点,先看个大概,心底有个印象,多练多用,等过段时间再遇到,说不定就能看懂了
  • 保持学习

    • 抽空多看技术博客,加深积累
  • 保持思考

    • 多倾听别人的想法,思考其中是否有可取之处,但是也要保持批判精神,不能盲信
  • 记录心得

    • 阅读以及听课,知识留存率都比较低,而思考过后,把听到的知识转化为心得输出,能掌握的更为透彻
  • 保持练习

    • 刷题,多写代码
阅读全文 »

C++服务器开发学习路线

注意: 本文不全,边学边补充

基础

熟练掌握C/C++

  • 基础语法、类及模板、C++2.0新特性、STL;
  • STL源码及底层实现(多态的实现等)
  • 宽字符
  • 位域
  • 开发-编译-调试,熟练掌握一个IDE,linux下的cmake/makefile
阅读全文 »

TCP/IP协议栈

TCP/IP协议分为五层,实际应用只有四层,数据链路层和物理层可以当作一层,后文皆只介绍四层结构,其中OSI模型的应用层、表示层和会话层对应TCP/IP的应用层,数据链路层、物理层对应TCP/IP的网络接口层。

协议栈简介

1
协议即一组规范。

  • 应用层

    • 支持协议

      HTTP、 DNS、FTP、NFS、SSH、TELNET

  • 传输层

    • 支持协议

      TCP、UDP

  • 网络层

    • 支持协议

      TCMP、IP、IGMP

阅读全文 »

环境准备

Cuda对应图

用Conda安装指定Cuda版本的Pytorch

1
conda install pytorch cudatoolkit=10.1 -c pytorch

安装多版本Cuda(用Pytorch框架不用安装Cuda)

下载安装

1
2
3
4
5
6
7
8
9
# 根据Cuda对应图下载指定版本的cuda,下载runfile文件,这里以10.1为例
wget https://developer.nvidia.com/compute/cuda/10.1/Prod/local_installers/cuda_10.1.105_418.39_linux.run
# 赋予runfile执行权限
sudo chmod a+x cuda_10.1.105_418.39_linux.run
# 执行安装,记住装过驱动了就别装驱动了,选项可以根据自己的需要进行选择
sudo ./cuda_10.1.105_418.39_linux.run
# 在用户主目录的.bashrc文件中添加(或修改成)以下两行,将执行库和cuda可执行文件写入环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-10.1/lib64
export PATH=$PATH:/usr/local/cuda-10.1/bin

使用软链接更方便切换版本

1
2
3
4
5
6
# 先将/usr/bin/cuda软链接指向指定版本
sudo rm -f /usr/bin/cuda # 删除软链接
sudo ln -s /usr/bin/cuda /usr/local/cuda-10.1 #重建软链接
# 修改环境变量如下
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64
export PATH=$PATH:/usr/local/cuda-10.1/bin

每次切换版本只需要重建软链接就可以了。

训练技巧

模型参数初始化

普通梯度下降法(SGD,Batch梯度下降)

使用普通的梯度下降方法时,初始化模型时对参数进行归一化,以防止不同参数的scale不一样,部分参数在同等学习率下无法更新

自适应学习率梯度下降法法(动量法,RMSprop算法,Adam算法)

采用自适应学习率的梯度下降方法不需要对参数进行归一化,因为会根据不同scale的梯度进行学习率的缩放,最终稳步达到lLocal optimal

梯度下降优化方法

阅读全文 »

jupyter-notebook使用配置

使用pip进行安装

1
pip install jupyter

生成配置文件

1
jupyter-notebook --generate-config

生成密码

1
jupyter-notebook password # 输入密码后会生成到一个json文件,等下复制到~/.jupyter/jupyter_notebook_config.py

配置~/.jupyter/jupyter_notebook_config.py

1
2
3
4
5
6
7
8
9
10
11
12

c.NotebookApp.ip='*' # “*”代表非本机都可以访问

c.NotebookApp.allow_remote_access = True # 若是非本机访问,还需开启远程访问

c.NotebookApp.open_browser = False # 服务器上不需要启动浏览器

c.NotebookApp.notebook_dir = '~/jupyter_workspace' # 指定notebook服务的默认打开目录

c.NotebookApp.port = 8888 # 默认服务端口

c.NotebookApp.password = u'encrypted_password' # encrypted_password是刚才生成的密码
阅读全文 »

Linux常用操作

创建sudo和ssh用户

创建用户并设置sudo权限

1
2
3
4
5
6
7
8
# 使用adduer添加用户会在home目录中添加用户,并设置shell环境(/bin/bash),而useradd不会
sudo adduser username #username是你要创建的用户名
# 使用usermod将新用户添加进sudo用户组
sudo usermod -G sudo username # username是刚才新建的用户名
# 添加sudo权限
sudo vim /etc/sudoers
# 添加如下行
username ALL=(ALL:ALL) ALL # username就是刚才新建用户名
阅读全文 »

注意: 本文基于CentOS7,由于docker镜像较大,确保磁盘空间充足

卸载已安装的Docker

1
2
3
4
5
6
7
8
9
10
yum -y remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
阅读全文 »

注:本文中的int型变量为32位,占四个字节。

本篇内容旨在对指针数组、数组指针、指针函数、函数指针进行总结,也希望能在总结的同时能有更深入的理解。

数组指针

数组指针顾名思义是个指针,定义形如(*arr)[n]的一个数组指针,由于()的优先级最高,所以定义的是一个指针,这个指针指向含有n个元素的数组。

阅读全文 »