0%

1
2
3
4
5
6
typedef struct {
int age;
char const *name; // 8 byte,指向外部地址
char intro[]; // 类似指针,但是指向固定的地方(结构体的末尾)
} Person;

如何构建这个结构体呢?

1
2
3
4
5
6
7
8
9
10
11
Person *person(char const *name, int age, char const *intro) {
size_t intro_len = (intro ? strlen(intro) : 0) + 1; // char数组以'\0'结尾
Person *p = (Person *) malloc(sizeof(Person) + intro_len);
p->age = age;
p->name = name;
if (intro) {
strcpy(p->intro, intro);
} else {
p->intro[0]=0;
}
}

什么是正则表达式?

在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。

元字符

我的硬件环境

  • Home-pc
  • Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz 3.70 GHz
  • DDR3 1600HMz Dual 16.00 GB
  • Nvidia Geforce GTX1660 Super 6G GDDR6

我的软件环境

  • Ubuntu 20.04(系统自带python3.8.5)
  • NV Driver 450
  • CUDA 10.1 — 243_426.00
  • cudnn v7.6.5(因为网速原因,暂时没装,考虑到只是替换文件,或许对环境不影响,于是就跳过这一步了,慢慢下载,来日再装)
  • Miniconda3-py38_4.9.2-Linux-x86_64
    • opencv
    • pytorch

安装过程

  • CUDA:https://developer.nvidia.com/cuda-toolkit-archive
  • cuDNN:https://developer.nvidia.com/rdp/cudnn-archive
  • Miniconda:https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/

安装过程一波三折,先说显卡驱动问题,CSDN博客90%都是错误的,Ubuntu20.04安装系统过程中如果勾选了安装第三方驱动,那么会把显卡驱动直接装好(至少我在第一次折腾的时候是这样,之后的几次都会陷入循环登录Bug)

驱动

回归到安装Ubuntu的老思路,断网、不装第三方驱动,这样是最快的。此时系统调用的是核显驱动(我很好奇如果是无核显的CPU会怎么样,回想起这4年来接触Ubuntu的场景,我似乎从未在不带核显的机子上安装过Ubuntu,显卡驱动的Bug的众多解释中,其中一条便是和核显有关,建议早日转manjaro)

进入系统以后,按照流程换源,然后在 Software Update 里鼠标勾选安装 NVIDIA 显卡驱动即可,注意系统不要设置成自动登录,按照网上的说法之一,循环登录和该设置有关。我没有时间和精力去验证。至少在安装Ubuntu20.04这一步,如果是安装过程联网安装NVIDIA显卡驱动,那么自动登录和密码登录没有区别,该循环Bug还是循环Bug,该正常启动还是正常启动。(于是,我非常好奇我第一次安装Ubuntu是如何做到自动登录+联网安装显卡驱动的)

Manjaro的口碑这两年非常好,按照网友们的说法,Manjaro对显卡驱动的支持不知道比Ubuntu高到哪里去了。但是我从来没用过Arch系的Linux,目前在自己的备用机上装了Manjaro还在感受当中,等玩熟练了,或许会转Manjaro。(我在Ubuntu16.04停留了几年之久,如今用上了Ubuntu20.04,感觉已经比以前好了许多)

CUDA

很久之前安装过CUDA,依稀记得在终端界面下复古的文字说明,以及刻在DNA里的“弹出询问是否安装显卡驱动?一定要输入No”。这次安装CUDA,终端界面是及其先进的GUI,比以前清晰很多。至于为什么安装CUDA不要再安装显卡驱动,说法很多,我没有亲自验证过。

因为网速原因,没有选择CUDA11.1_450,然而选择了CUDA10.1,下载还挺快的。但是cuDnn因为网速原因,一直没下载成功,只好暂时跳过了。

这一部分请参考:

  • https://cyfeng.science/2020/05/02/ubuntu-install-nvidia-driver-cuda-cudnn-suits/
  • https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html

里面有提到gcc版本兼容问题,其实Ubuntu系统自带gcc版本高于CUDA已经是老生长谈,甚至误传已久的问题了。考虑到Linux和CUDA都在不停更新,建议只看官方文档。

Conda

我是先练手安装的Win10,后安装的Ubuntu20.04。在原来的Win10 上,Anaconda遇到了一些难以描述的问题(和openssl有关,总之不要太推崇Anaconda这个东西,包管理太乱),于是我直接卸载干净,选择了miniConda,世界清净了。

在Ubuntu20.04上我也选择了miniConda,等于就是一个只含有python的环境,啥额外的软件包都没有,很干净,体积很小。现在回头仔细想,我已经使用Vscode开发项目很久了,python也用的是VScode,唯一留在Anconda的理由就是有个jupyter、jupyter NoteBook。其实miniConda可以安装一切,又到再装也一样。(在这里吐槽一下Ancodna的卸载速度,可能是因为软件包全是小文件,卸载极慢)

安装路径

我要吐槽一下miniconda的默认安装路径是/root/miniconda/,这样其实不是不行,但是用vscode的时候,因为不是root权限,没办法选择到root目录下的python解释器,于是我硬着头皮用root权限来运行vscode这么一个代码编辑器,发现不行,至少需要折腾一下,这种方法是在是太不优雅了。于是我卸掉了/root/miniconda/,重新装了一次,按照惯用路径,选择/opt/miniconda/(安装过程中会询问你选择路径)。

镜像源

我自以为从清华源下载的miniconda默认的源就是https://mirrors.tuna.tsinghua.edu.cn/,这么想没什么不对,但是唯一的源在装软件的时候就遇到问题,是源的问题。查看conda源,使用命令:

1
conda info

编辑conda源,使用命令:
1
vim ~/.condarc

里面大概长这样:
1
2
3
4
5
6
channels:
- https://mirrors.ustc.edu.cn/anaconda/pkgs/main/
- https://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
- defaults
show_channel_urls: true

顺带一提,我放弃/root/miniconda/的另一个原因就是因为~/.condarc,这应该是个用户级的文件,但是如果把conda装在/root/miniconda/,就得编辑对应的root级文件才算写入环境,然后从此终端打开干点儿啥,都得是root。vscode无法选择到/root/miniconda/bin/python大概率是因为这个原因。我的理解并不完善,大概率错误。有时间专门学习Linux系统知识再把这一块儿补上。

目前有中科大源https://mirrors.ustc.edu.cn/和清华源https://mirrors.tuna.tsinghua.edu.cn/可以用,末尾需要加上:

  • /anaconda/pkgs/main/
  • /anaconda/pkgs/free/
  • /anaconda/cloud/

这个可以网页打开镜像源的文件目录,自己看着添加进去,尽量不要抄别人的博客,可能会错。我参考的是:https://blog.csdn.net/wujialaoer/article/details/84977796

Pytoch

值得一提的是,你可以从网页端把对应的包下载下来,然后离线安装。比如我在安装pytorch的时候,死活下载不下来,要么慢,那么卡住。于是我用浏览器打开网页找到对应的包pytorch-1.7.1-py3.8_cuda10.1.243_cudnn7.6.3_0.tar.bz2下载,发现清华源的下载逻辑和百度云很像,会限制你的流量和网速,我以40MB/s的网速下载几秒就会断,必须等一两分钟,才允许你继续下载。盲猜是为了减小服务器负担。

离线安装可以输入:

1
conda install --offline pytorch-1.7.1-py3.8_cuda10.1.243_cudnn7.6.3_0.tar.bz2

但是这样装完以后,需要再输入一次在线安装,离线安装的包要进行一次验证。在线安装输入:
1
conda install pytorch torchvision torchaudio cudatoolkit = 10.1 -c pytorch

这句话原话是:

注意: Python 3.9用户将需要添加’-c = conda-forge
进行安装 conda install pytorch torchvision torchaudio cudatoolkit = 10.1 -c pytorch

类似的安装指南,请官网找 https://pytorch.org/,不要抄博客。不是说别人的博客写的不对,而是配环境这种事情,你看别人的博客就是刻舟求剑,即使这篇博客在几个月、几年前无比正确。但是现在它就不对了,可能只需要微调某个指令,但你照搬就是会出错。

使用国内源,就把-c pytorch去掉,一开始我并不知道-c pytorch依然会使用国外官方源,但是敲完这行指令,会显示出每个要安装的软件包来自的源,所有的包都是清华源,但是pytorch这几个源和上面一堆长得不一样,就足以引起思考了。盲猜在安装过程中,显示安装包所来自的源可以通过~/.condarcshow_channel_urls: true来控制显示or不显示,我没有验证过,也没有看过文档,仅仅是经验推测。

在安装过程中,遇到的其他犄角旮旯的问题,大多数都可以从这里找到:https://tools-platform-guide.readthedocs.io/zh_CN/latest/

Opencv

其实,到了上一步已经可以用了,CUDA + CuDnn + Pytorch 三件套已经OK。但是项目需要用到opencv,于是就必须继续往下装。这一步遇到了很多蛋疼的问题:源有问题、conda有问题、opencv有问题、python有问题。最后总结:我有问题。

其实有了conda,安装任何东西都是conda insatll xxx,无脑一行指令的事情。但是当一切方法都不管用,我提供一个不是办法的办法:打开 Links for opencv-python:https://pypi.tuna.tsinghua.edu.cn/simple/opencv-python/ 找到对应的版本下载,比如opencv_python-4.2.0.34-cp38-cp38-manylinux1_x86_64.whl

注意:opencv是有版本的,比如opencv3.x、opencv4.x,python也是有版本的,在这里,请选择和你conda内的python一样的版本,也就是python3.8,另外注意是linux_x86_64,这三个版本都对了才能装。话说回来:

  • CUDA和cuDNN之间也是有版本对应关系的,写全了就是 cudnn v7.6.5 for CUDA10.1
  • 显卡驱动和CUDA之间也有对应关系,比如CUDA 10.1_243_426.00,要求显卡驱动版本不低于243

最后,怎么装这个opencv_python-4.2.0.34-cp38-cp38-manylinux1_x86_64.whl?用pip install,而且注意了,是给conda的python装,不是给系统自带的python装。

Docker

配环境最优雅的方式: https://www.jianshu.com/p/da1c7dc4217a

ST-GCN 搭建

参考:

  • https://zhuanlan.zhihu.com/p/143969876
  • https://www.pythonf.cn/read/104012

ST-GCN 理解

  • https://blog.csdn.net/qq_41727666/article/details/84640549
  • https://www.zhihu.com/question/54504471/answer/611222866
  • https://zhoef.com/2019/08/24/14_ST-Gcn/

数据介绍

本次练习所用的数据集有5000个训练样本,每个样本对应于20x20大小的灰度图像。这些训练样本包括了9-0共十个数字的手写图像。这些样本中每个像素都用浮点数表示。加载得到的数据中,每幅图像都被展开为一个400维的向量,构成了数据矩阵中的一行。完整的训练数据是一个5000x400的矩阵,其每一行为一个训练样本(数字的手写图像)。数据中,对应于数字”0”的图像被标记为”10”,而数字”1”到”9”按照其自然顺序被分别标记为”1”到”9”。数据集保存在NN_data.mat.
image

阅读全文 »

本次作业的目的是建立一个逻辑回归模型,用于预测一个学生是否应该被大学录取。

简单起见,大学通过两次考试的成绩来确定一个学生是否应该录取。你有以前数届考生的成绩,可以做为训练集学习逻辑回归模型。每个训练样本包括了考生两次考试的成绩和对应的录取决定。

你的任务是建立一个分类模型,根据两次考试的成绩来估计考生被录取的概率。
本次实验需要实现的函数

  • plot_data 绘制二维的分类数据。
  • sigmoid函数
  • cost_function 逻辑回归的代价函数
  • cost_gradient 逻辑回归的代价函数的梯度,无正则化
  • predict 逻辑回归的预测函数
  • cost_function_reg 逻辑回归带正则化项的代价函数
  • cost_gradient_reg 逻辑回归的代价函数的梯度,带正则化
阅读全文 »

了解ROS的几种通信方式以后,对于ROS通信延迟有一些困惑,更多的是想追究背后原理,这篇博客《ROS之topic和service通信比较》起到了抛砖引玉的作用。

更多可以参考2013年的这一篇论文《A lightweight Opensource communication framework for native integration of resource constrained robotics devices with ROS》,目前网上关于ROS通信模型的中文资料大部分都是对这篇文章的翻译。

阅读全文 »

ROS之前看过一遍,但是过于复杂,我就很快忘记了;现在重新梳理一遍。
http://wiki.ros.org/cn/ROS/Tutorials

阅读全文 »

这篇文章数学公式推得有点儿长。。。。提前预警= =

阅读全文 »

频率学派 - Frequentist - Maximum Likelihood Estimation (MLE,最大似然估计)
贝叶斯学派 - Bayesian - Maximum A Posteriori (MAP,最大后验估计)

频率学派和贝叶斯学派对世界的认知有本质不同:
频率学派认为世界是确定的,有一个本体,这个本体的真值是不变的,我们的目标就是要找到这个真值或真值所在的范围;
而贝叶斯学派认为世界是不确定的,人们对世界先有一个预判,而后通过观测数据对这个预判做调整,我们的目标是要找到最优的描述这个世界的概率分布。

阅读全文 »

约束规划问题一般形式:

阅读全文 »