Jiahong 的个人博客

凡事预则立,不预则废


  • Home

  • Tags

  • Archives

  • Navigation

  • Search

DL——特征交叉算子总结


内积

  • 定义 :内积是一种常见的特征交叉方法,它通过计算两个向量对应元素的乘积之和来得到一个标量值,用于衡量两个向量的相似度或相关性
  • 公式 :对于两个向量\(\mathbf{x}=(x_1,x_2,\cdots,x_n)\)和\(\mathbf{y}=(y_1,y_2,\cdots,y_n)\),它们的内积表示为:
    $$\langle\mathbf{x},\mathbf{y}\rangle=\sum_{i = 1}^{n}x_iy_i$$

Hadamard积

  • 定义 :Hadamard积是两个相同维度的向量或矩阵对应元素相乘的运算,结果是与原向量或矩阵同维度的向量或矩阵,它在一些机器学习模型中用于特征的逐元素组合
  • 公式 :若\(\mathbf{x}=(x_1,x_2,\cdots,x_n)\)和\(\mathbf{y}=(y_1,y_2,\cdots,y_n)\),则它们的Hadamard积为:
    $$\mathbf{x}\odot\mathbf{y}=(x_1y_1,x_2y_2,\cdots,x_ny_n)$$

BilinearCross积

  • 定义 :BilinearCross积是一种双线性特征交叉方式,它通过一个矩阵来对两个向量进行交叉操作,能够捕捉到特征之间更复杂的交互关系
  • 公式 :设\(\mathbf{x}\in\mathbb{R}^m\),\(\mathbf{y}\in\mathbb{R}^n\),交叉矩阵为\(\mathbf{W}\in\mathbb{R}^{m\times n}\),则BilinearCross积表示为:
    $$\mathbf{x}^T\mathbf{W}\mathbf{y}=\sum_{i = 1}^{m}\sum_{j = 1}^{n}w_{ij}x_iy_j$$
  • 以上定义也称为BilinearCross内积 ,同理可以定义BilinearCross外积 :
    $$\mathbf{x}\odot(\mathbf{W}\mathbf{y})$$

ML——SVM-支持向量机


手动推导流程

  • 假设有N样本: \(X = (x_{1}, x_{2}, x_{3},\dots x_{N})\)
    • 样本点为: \(((x_{1}, y_{1}), (x_{2}, y_{2}), (x_{3}, y_{3}),\dots (x_{N}, y_{N}))\)
  • 假设 \(x_{i}\) 等所有向量都为列向量, \(w\) 为行向量(这里是为了推到方便,与<<统计学习方法>>一致)
    • 实际代码实现时与行列向量无关,取二者的内积np.inner(w,x)即可

确定分类决策函数

  • 分类超平面
    $$w^{\star}x + b^{\star} = 0$$
    • 分类超平面由 \((w, b)\) 唯一确定(注意: LR的分类超平面由 \((w, b)\) 和阈值唯一确定)
  • 分类决策函数
    $$f(x) = sign(w^{\star}x + b^{\star})$$

确定优化目标

间隔定义
  • 函数间隔定义
    • 点 \((x_{i}, y_{i})\) 到超平面 \((w,b)\) 的函数间隔为(\(y_{i} \in \{1, -1\})\):
      $$\hat{\gamma}_{i} = y_{i}(w\cdot x_{i} + b)$$
    • 所有训练样本 \(X = (x_{1}, x_{2}, x_{3},\dots x_{m})\) 到超平面 \((w,b)\) 的函数间隔为:
      $$\hat{\gamma} = \min_{i=1,\dots,N}\hat{\gamma}_{i}$$
  • 几何间隔的定义
    • 点 \((x_{i}, y_{i})\) 到超平面 \((w,b)\) 的几何间隔为:
      $$\gamma_{i} = y_{i} (\frac{w}{||w||}\cdot x_{i} + \frac{b}{||w||})$$
    • 进一步推导得:
      $$\gamma_{i} = \frac {y_{i}(w\cdot x_{i} + b)}{||w||} = \frac{\hat{\gamma}}{||w||}$$
    • 所有训练样本 \(X = (x_{1}, x_{2}, x_{3},\dots x_{m})\) 到超平面 \((w,b)\) 的几何间隔为:
      $$\gamma = \min_{i=1,\dots,N}\gamma_{i}$$
确定优化目标
  • 求解能够正确划分训练数据集并且几何间隔最大的分类超平面(分离超平面)

  • 定义约束优化问题:
    $$
    \begin{align}
    &\max_{w,b} \quad \gamma \\
    &s.t. \quad y_{i} (\frac{w}{||w||}\cdot x_{i} + \frac{b}{||w||}) \geq \gamma, i = 1,2,\dots,N
    \end{align}
    $$

  • 将 \(\gamma = \frac{\hat{\gamma}}{||w||}\) 带入并在条件中消去分母上的 \(||w||\),得
    $$
    \begin{align}
    &\max_{w,b} \quad\frac{\hat{\gamma}}{||w||} \\
    &s.t.\quad y_{i} (w\cdot x_{i} + b) \geq \hat{\gamma}, i = 1,2,\dots,N
    \end{align}
    $$

  • 上面的式子中,函数间隔 \(\hat{\gamma}\) 的值不影响最优化问题的解,于是我们设置 \(\hat{\gamma}=1\)

    • 因为将参数 \((w,b)\) 同时扩大或缩小为 \((\lambda w,\lambda b)\),函数间隔对应变成 \(\lambda \hat{\gamma}\)
    • 两个等价的优化方法:
      • 设置 \(\hat{\gamma}=1\) 再对原始问题进行最优化得到参数 \((w^{\star},b^{\star})\)
      • 先对原始问题最优化求得参数 \((w,b)\),再将参数同时扩大或缩小为 \((\lambda w,\lambda b)\),使得 \(\lambda \hat{\gamma}=1\) 得到的最终参数 \((w^{\star},b^{\star}) = (\lambda w,\lambda b)\) 等价
        $$
        \begin{align}
        &\max_{w,b}\quad \frac{1}{||w||} \\
        &s.t.\quad y_{i} (w\cdot x_{i} + b) \geq 1, i = 1,2,\dots,N
        \end{align}
        $$
  • 进一步分析,由于最大化 \(\frac{1}{||w||}\) 与最小化 \(\frac{1}{2}||w||^{2}\) 等价(这里 \(w\) 为行向量时, \(||w||^{2} = ww^{T}\)), 最优化问题可等价表示为:
    $$
    \begin{align}
    &\min_{w,b}\quad \frac{1}{2}||w||^{2} \\
    &s.t.\quad y_{i} (w\cdot x_{i} + b) \geq 1, i = 1,2,\dots,N
    \end{align}
    $$

    • 这是一个凸二次规划问题(convex quadratic programming),凸优化问题参考Math——凸二次优化问题和拉格朗日对偶性
优化问题的求解(对偶)
  • 首先将SVM优化问题转换为一般凸优化形式
    $$
    \begin{align}
    &\min_{w,b}\quad \frac{1}{2}||w||^{2} \\
    &s.t.\quad 1 - y_{i} (w\cdot x_{i} + b) \leq 0, i = 1,2,\dots,N
    \end{align}
    $$
  • 由上述优化问题定义拉格朗日函数
    $$
    \begin{align}
    L(w,b,\alpha) = \frac{1}{2}||w||^{2} + \sum_{i=1}^{N}\alpha_{i}(1-y_{i}(w\cdot x_{i} + b))
    \end{align}
    $$
  • 根据拉格朗日对偶性,
    $$
    \begin{align}
    \min_{w,b}\max_{\alpha:\alpha_{i} \geq 0}L(w,b,\alpha) = \max_{\alpha:\alpha_{i} \geq 0}\min_{w,b}L(w,b,\alpha)
    \end{align}
    $$
    • 左边:原始问题为极小极大问题
    • 右边:对偶问题为极大极小问题
  • 解对偶问题:
  • 先求
    $$
    \begin{align}
    \min_{w,b}L(w,b,\alpha)
    \end{align}
    $$
  • 求导数为0得
    $$
    \begin{align}
    \nabla_{w}L(w,b,\alpha) &= w - \sum_{i=1}^{N}\alpha_{i}y_{i}x_{i} = 0 \\
    \nabla_{b}L(w,b,\alpha) &= \sum_{i=1}^{N}\alpha_{i}y_{i} = 0
    \end{align}
    $$
  • 解得:
    $$
    \begin{align}
    &w = \sum_{i=1}^{N}\alpha_{i}y_{i}x_{i} \\
    &\sum_{i=1}^{N}\alpha_{i}y_{i} = 0
    \end{align}
    $$
  • 代入原来的拉格朗日函数有:

$$
\begin{align}
\min_{w,b}L(w,b,\alpha) &= \frac{1}{2}\sum_{i=1}^{N}\sum_{j=1}^{N}\alpha_{i}\alpha_{j}y_{i}y_{j}(x_{i}\cdot x_{j}) + \sum_{i=1}^{N}\alpha_{i}(1-y_{i}(\left [\sum_{j=1}^{N}\alpha_{j}y_{j}x_{j}\right]\cdot x_{i} + b)) \\
&= \frac{1}{2}\sum_{i=1}^{N}\sum_{j=1}^{N}\alpha_{i}\alpha_{j}y_{i}y_{j}(x_{i}\cdot x_{j}) - \sum_{i=1}^{N}\alpha_{i}y_{i}\left [\sum_{j=1}^{N}\alpha_{j}y_{j}x_{j}\right]\cdot x_{i} + \sum_{i=1}^{N}\alpha_{i}y_{i}b + \sum_{i=1}^{N}\alpha_{i}\\
&= \frac{1}{2}\sum_{i=1}^{N}\sum_{j=1}^{N}\alpha_{i}\alpha_{j}y_{i}y_{j}(x_{i}\cdot x_{j}) - \sum_{i=1}^{N}\sum_{j=1}^{N}\alpha_{i}y_{i}\alpha_{j}y_{j}(x_{j}\cdot x_{i}) + \sum_{i=1}^{N}\alpha_{i}y_{i}b + \sum_{i=1}^{N}\alpha_{i}\\
&= -\frac{1}{2}\sum_{i=1}^{N}\sum_{j=1}^{N}\alpha_{i}\alpha_{j}y_{i}y_{j}(x_{i}\cdot x_{j}) + 0 + \sum_{i=1}^{N}\alpha_{i}\\
&= -\frac{1}{2}\sum_{i=1}^{N}\sum_{j=1}^{N}\alpha_{i}\alpha_{j}y_{i}y_{j}(x_{i}\cdot x_{j}) + \sum_{i=1}^{N}\alpha_{i}
\end{align}
$$

  • 上面的 \(\min_{w,b}L(w,b,\alpha)\) 对 \(\alpha\) 求极大值有:
    $$
    \begin{align}
    \max_{\alpha} \quad &-\frac{1}{2}\sum_{i=1}^{N}\sum_{j=1}^{N}\alpha_{i}\alpha_{j}y_{i}y_{j}(x_{i}\cdot x_{j}) + \sum_{i=1}^{N}\alpha_{i} \\
    s.t. \quad &\sum_{i=1}^{N}\alpha_{i}y_{i} = 0 \\
    \quad &\alpha_{i} \geq 0, i = 1,2,\dots,N
    \end{align}
    $$

  • 转换为一般优化问题
    $$
    \begin{align}
    \min_{\alpha} \quad &\frac{1}{2}\sum_{i=1}^{N}\sum_{j=1}^{N}\alpha_{i}\alpha_{j}y_{i}y_{j}(x_{i}\cdot x_{j}) - \sum_{i=1}^{N}\alpha_{i} \\
    s.t. \quad &\sum_{i=1}^{N}\alpha_{i}y_{i} = 0 \\
    \quad &-\alpha_{i} \leq 0, i = 1,2,\dots,N
    \end{align}
    $$

  • 假设上面的式子能够求得 \(\alpha\) 的解为:
    $$
    \begin{align}
    \alpha^{\star} = (\alpha_{1}^{\star}, \alpha_{2}^{\star},\dots, \alpha_{N}^{\star})
    \end{align}
    $$

  • 根据拉格朗日对偶问题与原始问题的解对应的条件,Math——凸优化问题和拉格朗日对偶性,如果上面的式子中存在下标 \(j\),满足 \(-\alpha_{j}^{\star} < 0\),即满足:
    $$\exists j \quad \alpha_{j}^{\star} > 0$$

  • 那么最终可求得:
    $$
    \begin{align}
    &w^{\star} = \sum_{i=1}^{N}\alpha_{i}^{\star}y_{i}x_{i} \\
    \end{align}
    $$

  • \(b^{\star}\) 的表达式由 \(\alpha_{j}^{\star} > 0\),和KKT条件 \(\alpha_{j}^{\star}(y_{j}(w^{\star}\cdot x_{j} + b^{\star})-1) = 0\) 可解得:
    $$
    \begin{align}
    y_{j}(w^{\star}\cdot x_{j} + b^{\star})-1 = 0 \\
    \end{align}
    $$

  • 注意到 \(y_{j}\in \{-1, 1\}\),所以 \(y_{j}^{2}=1\)
    $$
    \begin{align}
    y_{j}^{2}(w^{\star}\cdot x_{j} + b^{\star})-y_{j} = 0 \\
    w^{\star}\cdot x_{j} + b^{\star} = y_{j} \\
    \end{align}
    $$

  • 所以有
    $$
    \begin{align}
    b^{\star} &= y_{j} - w^{\star}\cdot x_{j} \\
    &= y_{j} - \sum_{i=1}^{N}\alpha_{i}^{\star}y_{i}(x_{i}\cdot x_{j})
    \end{align}
    $$

  • 综合 \(w^{\star}\) 和 \(b^{\star}\) 的表达式,我们有分类超平面为:
    $$
    \begin{align}
    w^{\star}x + b^{\star} &= 0 \\
    \sum_{i=1}^{N}\alpha_{i}^{\star}y_{i}(x_{i}\cdot x) + b^{\star} &= 0
    \end{align}
    $$

  • 分类决策函数为:
    $$
    \begin{align}
    f(x) &= sign(w^{\star}x + b^{\star}) \\
    f(x) &= sign\left (\sum_{i=1}^{N}\alpha_{i}^{\star}y_{i}(x_{i}\cdot x) + b^{\star}\right )
    \end{align}
    $$

    • 这就是分线性可分SVM的对偶形式
    • 分类决策函数只与待预测的样本 \(x\) 和已有训练数据 \(x_{j}\) 的输入内积 \((x_{j}\cdot x)\) 相关
      • 注意 \(b^{\star}\) 是通过原始训练样本算出来的定值, \(b^{\star}, w^{\star}\) 的值与待预测的未知样本无关,训练样本确定,参数就确定了, 内积的出现是在加入位置样本后 \(w^{\star}\cdot x\) 产生的
    • SVM的对偶形式使得我们可以用核函数来扩展SVM(非线性核函数可使得SVM能解决非线性问题)

支持向量

  • 优化问题的推导过程中,又一步,对偶问题与原始问题能够相等的条件是存在下标 \(j\),满足 \(-\alpha_{j}^{\star} < 0\),即满足:
    $$\exists j \quad \alpha_{j}^{\star} > 0$$
  • 上面的 \(j\) 对应的样本点 \((x_{j}, y_{j})\) 就是支持向量
    • 支持向量一定在间隔边界上:
      $$y_{j}(w^{\star}\cdot x_{j}+b^{\star})-1 = 0$$
    • 或者
      $$w^{\star}\cdot x_{j}+b^{\star} = \pm 1$$
      • \(y_i\) 的取值为 1 或者 -1
    • 实际上,在训练时参数 \((w^{\star}, b^{\star})\) 只依赖于 \(\alpha_{j} > 0\) 的点,即只依赖支持向量
      $$
      \begin{align}
      &w^{\star} = \sum_{i=1}^{N}\alpha_{i}^{\star}y_{i}x_{i} \\
      &b^{\star} = y_{j} - \sum_{i=1}^{N}\alpha_{i}^{\star}y_{i}(x_{i}\cdot x_{j})
      \end{align}
      $$
    • 所有非支持向量对应的 \(\alpha_{i} = 0\),所以对最终参数 \((w^{\star}, b^{\star})\) 只与支持向量相关

核函数

  • \(\phi(x)\) 定义为从输入空间到希尔伯特空间的映射
    $$
    \begin{align}
    K(x,z) = \phi(x)\phi(z)
    \end{align}
    $$
  • 将SVM对偶形式中的内积 \((x_{i}\cdot x_{j})\) 用核函数 \(K(x_{i},x_{j}) = \phi(x_{i})\phi(x_{j})\) 来替代即可在SVM中应用核技巧

常用核函数

  • 多项式核函数
    $$K(x,z) = (x\cdot z + 1)^{p}$$
  • 高斯核函数
    $$K(x,z) = e^{\left( -\frac{||x-z||^{2}}{2\sigma^{2}}\right )}$$
  • 字符串核函数
    [待更新]

序列最小最优化算法(SMO)

  • 为什么要用SMO?
    • 前面我们的推导将 SVM的参数求解 转化为了一个求解凸二次优化的问题
    • 凸二次优化问题有全局最优解(有很多优化算法可以求解凸二次优化问题)
    • 但是当样本量太大时,普通的凸二次优化算法会变得十分低效 ,导致实际操作中无法使用
    • 所以我们需要一个能高效实现的算法 SMO
  • 基本思路
    • 如果所有变量的解都满足最优化问题的KKT条件,那么这个最优化问题的解就得到了
      • 原因: KKT条件是该最优化问题的充要条件
    • 否则,存在某些解不满足KKT条件,选择两个变量,固定其他变量,
      • 两个变量中其中一个是最不满足KKT条件的变量 ,
      • 另一个在第一个确定后,自动由约束条件确定下来
    • 针对这两个变量构建二次规划问题的解,这个二次规划问题关于这两个变量的解应该更接近原始二次规划问题的解
      • 原因: 因为二次规划问题的目标函数值变得更小
      • 此时可通过解析方法求解(由于只有两个变量,比较简单),整个算法的速度会很快
    • SMO算法不断的将原问题分解为子问题,迭代更新参数,每次更新两个参数,最终得到近似解
  • 优点:
    • 训练速度快

补充说明

SVM需要特征归一化

是必要的

  • 因为SVM寻找的是所谓的间隔(margin), 就是两个支持向量的间隔
  • 如果不归一化的话, 这个间隔会因为不同特征的单位等, 数值被放大或者缩小, 从而造成无法评估间隔 , 所以归一化对于SVM很重要
  • 线性SVM依赖数据表达的距离测度,所以需要对数据先做normalization
    • 个人理解: 非线性的SVM其实也应该归一化,不然核函数映射到高位空间后以后还是可能受数值影响?

损失函数自带正则

  • 由于优化目标中就自带了参数 \(\frac{1}{2}||w||^2\),所以SVM实际上已经自己带了L2正则化了
  • 这也是SVM也叫结构风险最小化算法的原因
    • 结构风险最小化就是模型复杂度最小化

Linux——用户管理

用户管理简单笔记


用某个其他用户身份打开可视化软件

  • 说明:在某个用户不能登录桌面时,可能可以通过进入root用户创建一个新的用户,然后用该用户登录桌面
  • 不同用户之间的软件可能不共享,所以要想打开其他用户装的软件可以考虑从终端切换到其他用户,然后再打开软件
  • 不同用户的git用户信息等都不同,也需要切换到其他用户使用
  • 为了避免用户权限问题,打开软件时都从终端用文件所属用户的身份打开即可

多用户打开各自软件问题

  • 说明:在Linux系统有多个用户时,我们可能需要从一个用户界面打开终端登录另一个用户,从而使用该用户的环境和软件

问题描述

  • 在一个用户登录图形界面后,需要以另一个用户的身份打开一个图形化软件,此时直接打开图形化软件可能遇到如下错误

    No protocol specified

问题发生原因

  • 因为Xserver默认情况下禁止别的用户图形程序运行在当前用户图形界面上

解决方案

  • 在当前用户下执行命令
    1
    xhost +

Linux——远程登录相关笔记


远程登录命令

  • 常用命令:

    1
    ssh [user]@[ip] -p [port]
    • port 默认为 22
  • 远程服务器一般也默认打开 22 端口,若需要转接端口,可以在服务端执行下面的命令

    1
    ssh -fNL 0.0.0.0:[new_port]:localhost:22 localhost
    • 执行上面的命令后,连接远程服务器可以使用
      1
      ssh [user]@[ip] -p [new_port]

远程登录快捷方式配置

  • 生成 SSH 秘钥并发送到远程:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 本地终端执行
    # # 本地生成 SSH 密钥,若已经有秘钥,不需要重复生成
    # # # 公钥:~/.ssh/id_ed25519
    # # # 私钥:~/.ssh/id_ed25519.pub
    ssh-keygen -t ed25519

    # 本地终端执行命令
    # # 将本地生成的公钥发送到远程服务器,让服务器信任本地电脑,可能需要根据需要输入密码
    ssh-copy-id [user]@[ip]
    • 至此,远程已经不需要输入密码了,可以使用下面的命令快速登录
      1
      ssh [user]@[ip] -p [new_port]
  • 重命名当前服务器

    • 打开文件 ~/.ssh/config
      1
      2
      3
      4
      Host diy_user
      HostName [ip] # 远程IP
      User [user] # 用户名
      Port [port] # 端口
  • 使用新名字快速登录

    1
    ssh diy_user

MySQL——Error code 28; No space left on device

首先说明这是一个MySQL错误,描述的是MySQL临时文件不能打开,空间不足


问题源头

在Ubuntu系统中,爬取数据过多,数量百万级到千万级,而且存储都是以小文件的方式存储的,造成inode的大量使用,从而发生异常,发生异常时服务器尚有20多G的硬盘空间


解决方式

将数据打包起来,然后删除打包后的数据


总结

在做数据分析时最好不要使用小文件存储数据,如果非要存储收也尽量注意打包压缩暂时不必要使用的文件

Bash——Shell使用笔记


显示目录占用空间大小

  • 显示第一层目录大小(人类可读格式,如 M/G)

    1
    du -sh */
    • 命令解释:
      • du:统计当前目录下的第一级下,所有子目录/文件的磁盘占用;
      • -s(--summarize):只显示总大小(不列出子文件/子目录的详细大小);
      • -h(--human-readable):用人类易读的单位(K/M/G)显示;
      • */:通配符,只匹配当前目录下的「第一层子目录」(结尾的 / 是关键,排除文件,只选目录);
    • 这个命令 Mac 也可以使用
    • 在 Linux 里面,这个命令的等价命令是 du -h ./ --max-depth=1
  • 显示当前目录大小(人类可读格式,如 M/G)

    1
    du -sh ./
    • 命令解释:
      • du:统计当前目录的总磁盘占用
      • -s(--summarize):只显示总大小(不列出子文件/子目录的详细大小);
      • -h(--human-readable):用人类易读的单位(K/M/G)显示;
      • ./:只匹配当前目录
  • 显示当前目录下,指定层级的目录磁盘占用情况

    1
    2
    # 以最大 2 级子文件夹为例(包括第一级)
    du -h ./ --max-depth=2
    • 命令解释:
      • du:统计当前目录下的第一级下,所有子目录/文件的磁盘占用;
      • -h(--human-readable):用人类易读的单位(K/M/G)显示;
      • ./:只匹配当前目录
      • --max-depth=2:最深到两级目录

递归删除某个文件夹下的某个名称文件

  • 假设目标文件夹是 /path/to/dir

  • 在执行删除前,先用 -print 检查匹配结果,确保不会误删:

    1
    find /path/to/dir -type f -name "xxx.pt" -print
    • find:递归查找文件
    • /path/to/dir:替换为你的目标目录路径
    • -type f:只匹配普通文件
    • -name "xxx.pt":匹配文件名为 xxx.pt
    • -print:输出匹配结果
  • 删除上述匹配的文件:

    1
    find /path/to/dir -type f -name "xxx.pt" -delete
    • -delete:直接删除匹配到的文件
  • 补充:如果需要匹配所有以 .pt 结尾的文件(比如 model.pt、xxx.pt 等),可以这样写:

    1
    find /path/to/dir -type f -name "*.pt" -delete

搜索符合预期规则的文件并合并

  • 以合并前缀相同的 .jsonl 文件为例:

    1
    ls -1 /user/prefix_* | grep -E "/user/prefix_[0-9]+\.jsonl" | sort -V | xargs cat > path_to_output
    • 单独使用 ls -1 /user/prefix_* | grep -E "/user/prefix_[0-9]+\.jsonl" | sort -V 可以按照顺序打印文件名称
    • 如果不需要排序可以删除 sort -V 参数

Bash——awk和xargs命令的使用

用于在linux bash中设计处理terminal输出自动删除等问题


使用实例

  • 示例:下面的代码是删除所有名字为<none>的docker镜像
    1
    sudo docker images | grep '<none>' | awk '{print $3}' | xargs sudo docker rmi

awk

  • 示例:读取每一行的第三列的值
    1
    awk '{print $3}'

xargs

  • 示例:将管道传递过来的所有行添加到后面的命令后面,等价于sudo docker rmi <rows>
    1
    xargs sudo docker rmi

Bash——命令分隔符

在 Linux Bash 命令中,有;,&&,||三种命令链接方式,本文将介绍他们之间的区别


三种连接方式的区别

  • ;:各个命令之间相互独立,不管前面的语句是否成功执行,所有命令都将被执行
  • &&:命令依次被执行,只有当前面的命令执行成功后,后面的命令才会被执行
  • ||:命令依次被执行,只有当前面的命令执行失败后,后面的命令才会被执行

MySQL——引擎比较说明


关于引擎

  • 查看各种引擎 show engines;
  • 查看当前默认引擎 show variables like '%storage_engine%';
  • 查看指定表的引擎 show create table tableName;
  • 修改指定表的引擎 alter table tableName engine = innodb;
  • 创建表时指定引擎 create table mytable (id int, titlechar(20)) engine = innodb
  • 修改默认存储引擎
    在mysql配置文件(linux下为/etc/my.cnf),在mysqld后面增加default-storage-engine=INNODB即可

不同引擎的事务支持说明

  • MySQL数据库有多种引擎,一般使用的是InnoDB(从MySQL5.5.5以后,InnoDB是默认引擎),InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比Myisam的存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引
  • 其他的引擎不支持事务等,但是存储空间占的比较小,而且操作比较快一些
  • MySQL有多种存储引擎,每种存储引擎有各自的优缺点,可以择优选择使用:MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE
  • 虽然MySQL里的存储引擎不只是MyISAM与InnoDB这两个,但常用的就是两个
    • InnoDB支持事务,MyISAM不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了
  • MyISAM适合查询以及插入为主的应用,InnoDB适合频繁修改以及涉及到安全性较高的应用
  • InnoDB支持外键,MyISAM不支持
  • 从MySQL5.5.5以后,InnoDB是默认引擎
  • InnoDB不支持FULLTEXT类型的索引
  • InnoDB中不保存表的行数,如select count(*) from table时,InnoDB需要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含where条件时MyISAM也需要扫描整个表
  • 对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引
  • 清空整个表时,InnoDB是一行一行的删除,效率非常慢。MyISAM则会重建表
  • InnoDB支持行锁(某些情况下还是锁整表,如 update table set a=1 where user like ‘%lee%’

附录:事务的理解

  • 变量 @@autocommit

    1
    2
    select @@autocommit;
    set @@autocommit = 0;
  • @@autocommit 为0时表示不以显示事务开头的语句或者以事务开头(begin; 或者 start transaction;)都会被缓存起来并且在commit;提交前都可以用rollback;回滚

  • @@autocommit 为1时表示必须以事务开头的语句才会被缓存,否则一个sql语句将会被当做一个事务提交,将不能使用rollback;语句回滚

  • 说明:不是所有引擎都支持事务,常用的支持事务的引擎是InnoDB

Hexo——命令总结

Hexo命令归纳整理


init

hexo init [folder]

# 在cmd命令下,cd到你所需要建立博客的文件夹,执行此命令,其中folder为可选指令,若不写,则默认当前目录


hexo new

hexo new [layout] \<title\>

#layout为可选项,默认使用_config.yml中的default_layout。新建文章的指令


generate

hexo generate

# 生成静态文件,

# 可选参数:

-d ,–deploy 文件生成后立即部署网站

-w , –watch 件事文件变动


deploy

hexo deploy

# 发布到网站,这里就是发布到 _config.yml中deploy中设置的网址上。

# 参数

-g , –generate 部署前生成静态文件


npm install

每一个rn项目都有一个package.json文件,里面有很多组件信息,使用npm install将按照package.json安装所需要的组件放在生成的node_modules文件夹中,rn项目下的每一个文件中都可以通过import引入node_modules的组件来加以使用


hexo clean

hexo clean 清除缓存文件(db.json)和已生成的静态文件(public),通常更换主题后,无效时,可以运行此命令


hexo server

hexo server

# 启动server,就可以在本地预览效果。

#参数,默认网址http://localhost:4000/

-p , –port 重设端口

-s , –static 只是用静态文件

-l , –log 启动日志记录,使用覆盖记录格式

-i , –ip 重新制定服务器ip

1…646566
Joe Zhou

Joe Zhou

Stay Hungry. Stay Foolish.

659 posts
53 tags
GitHub E-Mail
© 2026 Joe Zhou
Powered by Hexo
|
Theme — NexT.Gemini v5.1.4