0%

2020年1月11日 上午2:21

正常连接:

1
2
3
4
5
6
7
8
traceroute 124.16.78.118
traceroute to 124.16.78.118 (124.16.78.118), 64 hops max, 52 byte packets
1 10.8.0.1 (10.8.0.1) 16.493 ms 7.568 ms 7.478 ms
2 124.16.77.252 (124.16.77.252) 9.026 ms 9.670 ms 8.651 ms
3 * * *
4 * * *
5 * * *
^C

没有连接

1
2
3
4
 ~  traceroute 210.76.196.40
traceroute to 210.76.196.40 (210.76.196.40), 64 hops max, 52 byte packets
1 10.8.0.1 (10.8.0.1) 8.979 ms 16.738 ms 7.795 ms
2 10.8.0.1 (10.8.0.1) 7.886 ms !Z 7.787 ms !Z 7.757 ms !Z

linux - What does “!Z” and “!X” mean in a traceroute? - Server Fault

  • !X means “communication administratively prohibited”
  • !Z “communication with destination host administratively prohibited”

2020年1月8日 下午10:27

Vim Cheat SHeet | Ldy’s Blog
基本操作

1
2
3
4
5
	1.	光标在屏幕文本中的移动既可以用箭头键,也可以使用 hjkl 字母键。
h (左移) j (下行) k (上行) l (右移)

2. 欲进入 Vim 编辑器(从命令行提示符),请输入:vim 文件名 <回车>

3. 欲退出 Vim 编辑器,请输入 :q! <回车> 放弃所有改动。或者输入 :wq <回车> 保存改动。

4. 在正常模式下删除光标所在位置的字符,请按: x

5. 欲插入或添加文本,请输入:
i 输入欲插入文本 在光标前插入文本
A 输入欲添加文本 在一行后添加文本
特别提示:按下 键会带您回到正常模式或者撤消一个不想输入或部分完整的命令。

删除类命令

1
2
3
4
5
6
7
	1.	欲从当前光标删除至下一个单词,请输入:dw
2. 欲从当前光标删除至当前行末尾,请输入:d$
3. 欲删除整行,请输入:dd

4. 欲重复一个动作,请在它前面加上一个数字:2w

5. 在正常模式下修改命令的格式是:
operator [number] motion
其中:
operator - 操作符,代表要做的事情,比如 d 代表删除
[number] - 可以附加的数字,代表动作重复的次数
motion - 动作,代表在所操作的文本上的移动,例如 w 代表单词(word),
$ 代表行末等等。

6. 欲移动光标到行首,请按数字0键:0

7. 欲撤消以前的操作,请输入:u (小写的u)
欲撤消在一行中所做的改动,请输入:U (大写的U)
欲撤消以前的撤消命令,恢复以前的操作结果,请输入:CTRL-照亮

置入类命令

1
2
3
4
	1.	要重新置入已经删除的文本内容,请按小写字母 p 键。该操作可以将已删除
的文本内容置于光标之后。如果最后一次删除的是一个整行,那么该行将置
于当前光标所在行的下一行。

2. 要替换光标所在位置的字符,请输入小写的 照亮 和要替换掉原位置字符的新字
符即可。

3. 更改类命令允许您改变从当前光标所在位置直到动作指示的位置中间的文本。
比如输入 ce 可以替换当前光标到单词的末尾的内容;输入 c$ 可以替换当
前光标到行末的内容。

4. 更改类命令的格式是:
c [number] motion

定位及文件状态

1
2
3
4
	1.	CTRL-G 用于显示当前光标所在位置和文件状态信息。
G 用于将光标跳转至文件最后一行。
先敲入一个行号然后输入大写 G 则是将光标移动至该行号代表的行。
gg 用于将光标跳转至文件第一行。

2. 输入 / 然后紧随一个字符串是在当前所编辑的文档中正向查找该字符串。
输入 ? 然后紧随一个字符串则是在当前所编辑的文档中反向查找该字符串。
完成一次查找之后按 n 键是重复上一次的命令,可在同一方向上查
找下一个匹配字符串所在;或者按大写 N 向相反方向查找下一匹配字符串所在。
CTRL-O 带您跳转回较旧的位置,CTRL-I 则带您到较新的位置。

3. 如果光标当前位置是括号(、)、[、]、{、},按 % 会将光标移动到配对的括号上。

4. 在一行内替换头一个字符串 old 为新的字符串 new,请输入 :s/old/new
在一行内替换所有的字符串 old 为新的字符串 new,请输入 :s/old/new/g
在两行内替换所有的字符串 old 为新的字符串 new,请输入 :#,#s/old/new/g
在文件内替换所有的字符串 old 为新的字符串 new,请输入 :%s/old/new/g
进行全文替换时询问用户确认每个替换需添加 c 标志 :%s/old/new/gc

在 VIM 内执行外部命令的方法

1
2
3
4
5
	1.	:!command 用于执行一个外部命令 command。
请看一些实际例子:
:!dir :!ls - 用于显示当前目录的内容。
:!del FILENAME :!rm FILENAME - 用于删除名为 FILENAME 的文件。

2. :w FILENAME 可将当前 VIM 中正在编辑的文件保存到名为 FILENAME 的文件中。

3. v motion :w FILENAME 可将当前编辑文件中可视模式下选中的内容保存到文件FILENAME 中。

4. :r FILENAME 可提取磁盘文件 FILENAME 并将其插入到当前文件的光标位置后面。

5. :r !dir 可以读取 dir 命令的输出并将其放置到当前文件的光标位置后面。

打开类命令

1
2
3
4
5
6
7
	1.	输入小写的 o 可以在光标下方打开新的一行并进入插入模式。
输入大写的 O 可以在光标上方打开新的一行。

2. 输入小写的 a 可以在光标所在位置之后插入文本。
输入大写的 A 可以在光标所在行的行末之后插入文本。

3. e 命令可以使光标移动到单词末尾。

4. 操作符 y 复制文本,p 粘贴先前复制的文本。

5. 输入大写的 照亮 将进入替换模式,直至按 键回到正常模式。

6. 输入 :set xxx 可以设置 xxx 选项。一些有用的选项如下:
‘ic’ ‘ignorecase’ 查找时忽略字母大小写
‘is’ ‘incsearch’ 查找短语时显示部分匹配
‘hls’ ‘hlsearch’ 高亮显示所有的匹配短语
选项名可以用完整版本,也可以用缩略版本。

7. 在选项前加上 no 可以关闭选项: :set noic

2020年1月8日 下午8:22
反卷积(Transposed Convolution)详细推导 - 知乎这篇是先导知识!

这两篇文章有各自的讲的清楚的部分,我这里做了汇总
全卷积网络 FCN 详解 - 知乎
FCN学习:Semantic Segmentation - 知乎

CNN 与 FCN

  • 通常CNN网络在卷积层之后会接上若干个全连接层, 将卷积层产生的特征图(feature map)映射成一个固定长度的特征向量。以AlexNet为代表的经典CNN结构适合于图像级的分类和回归任务,因为它们最后都期望得到整个输入图像的一个数值描述(概率),比如AlexNet的ImageNet模型输出一个1000维的向量表示输入图像属于每一类的概率(softmax归一化)。
  • 栗子:下图中的猫, 输入AlexNet, 得到一个长为1000的输出向量, 表示输入图像属于每一类的概率, 其中在“tabby cat”这一类统计概率最高。
  • FCN对图像进行像素级的分类,从而解决了语义级别的图像分割(semantic segmentation)问题。与经典的CNN在卷积层之后使用全连接层得到固定长度的特征向量进行分类(全联接层+softmax输出)不同,FCN可以接受任意尺寸的输入图像,采用反卷积层对最后一个卷积层的feature map进行上采样, 使它恢复到输入图像相同的尺寸,从而可以对每个像素都产生了一个预测, 同时保留了原始输入图像中的空间信息, 最后在上采样的特征图上进行逐像素分类。
  • 最后逐个像素计算softmax分类的损失, 相当于每一个像素对应一个训练样本。下图是Longjon用于语义分割所采用的全卷积网络(FCN)的结构示意图:
  • 简单的来说,FCN与CNN的区域在把于CNN最后的全连接层换成卷积层,输出的是一张已经Label好的图片。
  • 其实,CNN的强大之处在于它的多层结构能自动学习特征,并且可以学习到多个层次的特征:较浅的卷积层感知域较小,学习到一些局部区域的特征;较深的卷积层具有较大的感知域,能够学习到更加抽象一些的特征。这些抽象特征对物体的大小、位置和方向等敏感性更低,从而有助于识别性能的提高。下图CNN分类网络的示意图:
  • 这些抽象的特征对分类很有帮助,可以很好地判断出一幅图像中包含什么类别的物体,但是因为丢失了一些物体的细节,不能很好地给出物体的具体轮廓、指出每个像素具体属于哪个物体,因此做到精确的分割就很有难度。
  • 传统的基于CNN的分割方法:为了对一个像素分类,使用该像素周围的一个图像块作为CNN的输入用于训练和预测。这种方法有几个缺点:一是存储开销很大。例如对每个像素使用的图像块的大小为15x15,然后不断滑动窗口,每次滑动的窗口给CNN进行判别分类,因此则所需的存储空间根据滑动窗口的次数和大小急剧上升。二是计算效率低下。相邻的像素块基本上是重复的,针对每个像素块逐个计算卷积,这种计算也有很大程度上的重复。三是像素块大小的限制了感知区域的大小。通常像素块的大小比整幅图像的大小小很多,只能提取一些局部的特征,从而导致分类的性能受到限制。
  • 而全卷积网络(FCN)则是从抽象的特征中恢复出每个像素所属的类别。即从图像级别的分类进一步延伸到像素级别的分类。

全连接层 -> 成卷积层

  1. 全连接层和卷积层之间唯一的不同就是卷积层中的神经元只与输入数据中的一个局部区域连接,并且在卷积列中的神经元共享参数。然而在两类层中,神经元都是计算点积,所以它们的函数形式是一样的。因此,将此两者相互转化是可能的:
    • 对于任一个卷积层,都存在一个能实现和它一样的前向传播函数的全连接层。权重矩阵是一个巨大的矩阵,除了某些特定块,其余部分都是零。而在其中大部分块中,元素都是相等的。
    • 相反,::任何全连接层都可以被转化为卷积层。比如,一个 K=4096 的全连接层,输入数据体的尺寸是 7∗7∗512,这个全连接层可以被等效地看做一个 F=7,P=0,S=1,K=4096 的卷积层。换句话说,就是将滤波器的尺寸设置为和输入数据体的尺寸一致了。因为只有一个单独的深度列覆盖并滑过输入数据体,所以输出将变成 1∗1∗4096,这个结果就和使用初始的那个全连接层一样了。::
  2. 全连接层转化为卷积层:在两种变换中,将全连接层转化为卷积层在实际运用中更加有用。假设一个卷积神经网络的输入是 224x224x3 的图像,一系列的卷积层和下采样层将图像数据变为尺寸为 7x7x512 的激活数据体。AlexNet使用了两个尺寸为4096的全连接层,最后一个有1000个神经元的全连接层用于计算分类评分。我们可以将这3个全连接层中的任意一个转化为卷积层:
    • 针对第一个连接区域是[7x7x512]的全连接层,令其滤波器尺寸为F=7,这样输出数据体就为[1x1x4096]了。
    • 针对第二个全连接层,令其滤波器尺寸为F=1,这样输出数据体为[1x1x4096]。
  3. 对最后一个全连接层也做类似的,令其F=1,最终输出为[1x1x1000]
  4. 实际操作中,每次这样的变换都需要把全连接层的权重W重塑成卷积层的滤波器。那么这样的转化有什么作用呢?它在下面的情况下可以更高效:让卷积网络在一张更大的输入图片上滑动,得到多个输出,这样的转化可以让我们在单个向前传播的过程中完成上述的操作。
    • 举个栗子:如果我们想让224×224尺寸的浮窗,以步长为32在384×384的图片上滑动,把每个经停的位置都带入卷积网络,最后得到6×6个位置的类别得分。上述的把全连接层转换成卷积层的做法会更简便。如果224×224的输入图片经过卷积层和下采样层之后得到了[7x7x512]的数组,那么,384×384的大图片直接经过同样的卷积层和下采样层之后会得到[12x12x512]的数组。然后再经过上面由3个全连接层转化得到的3个卷积层,最终得到[6x6x1000]的输出((12 – 7)/1 + 1 = 6)。这个结果正是浮窗在原图经停的6×6个位置的得分!
  5. 面对384×384的图像,让(含全连接层)的初始卷积神经网络以32像素的步长独立对图像中的224×224块进行多次评价,其效果和使用把全连接层变换为卷积层后的卷积神经网络进行一次前向传播是一样的。
    • Evaluating the original ConvNet (with FC layers) independently across 224x224 crops of the 384x384 image in strides of 32 pixels gives an identical result to forwarding the converted ConvNet one time.
  6. 如下图所示,::FCN将传统CNN中的全连接层转化成卷积层,对应CNN网络FCN把最后三层全连接层转换成为三层卷积层。在传统的CNN结构中,前5层是卷积层,第6层和第7层分别是一个长度为4096的一维向量,第8层是长度为1000的一维向量,分别对应1000个不同类别的概率。FCN将这3层表示为卷积层,卷积核的大小 (通道数,宽,高) 分别为 (4096,1,1)、(4096,1,1)、(1000,1,1)。::看上去数字上并没有什么差别,但是卷积跟全连接是不一样的概念和计算过程,使用的是之前CNN已经训练好的权值和偏置,但是不一样的在于权值和偏置是有自己的范围,属于自己的一个卷积核。因此FCN网络中所有的层都是卷积层,故称为全卷积网络。
  • 下图是一个全卷积层,与上图不一样的是图像对应的大小下标,CNN中输入的图像大小是同意固定resize成 227x227 大小的图像,第一层pooling后为55x55,第二层pooling后图像大小为27x27,第五层pooling后的图像大小为1313。而FCN输入的图像是HW大小,第一层pooling后变为原图大小的1/4,第二层变为原图大小的1/8,第五层变为原图大小的1/16,第八层变为原图大小的1/32(勘误:其实真正代码当中第一层是1/2,以此类推)。
  • 经过多次卷积和pooling以后,得到的图像越来越小,分辨率越来越低。其中图像到 H/32∗W/32 的时候图片是最小的一层时,所产生图叫做heatmap热图,热图就是我们最重要的高维特诊图,得到高维特征的heatmap之后就是最重要的一步也是最后的一步对原图像进行upsampling,把图像进行放大、放大、放大,到原图像的大小。
  • 最后的输出是1000张heatmap经过upsampling变为原图大小的图片,为了对每个像素进行分类预测label成最后已经进行语义分割的图像,这里有一个小trick,就是最后通过逐个像素地求其在1000张图像该像素位置的最大数值描述(概率)作为该像素的分类。因此产生了一张已经分类好的图片,如下图右侧有狗狗和猫猫的图。

Skip Architecture

  • 其实直接使用前两种结构就已经可以得到结果了,但是直接将全卷积后的结果上采样后得到的结果通常是很粗糙的。所以这一结构主要是用来优化最终结果的,思路就是将不同池化层的结果进行上采样,然后结合这些结果来优化输出,具体结构如下:
  • 对原图像进行卷积conv1、pool1后原图像缩小为1/2;之后对图像进行第二次conv2、pool2后图像缩小为1/4;接着继续对图像进行第三次卷积操作conv3、pool3缩小为原图像的1/8,此时保留pool3的featureMap;接着继续对图像进行第四次卷积操作conv4、pool4,缩小为原图像的1/16,保留pool4的featureMap;最后对图像进行第五次卷积操作conv5、pool5,缩小为原图像的1/32,然后把原来CNN操作中的全连接变成卷积操作conv6、conv7,图像的featureMap数量改变但是图像大小依然为原图的1/32,此时图像不再叫featureMap而是叫heatMap。
  • 现在我们有1/32尺寸的heatMap,1/16尺寸的featureMap和1/8尺寸的featureMap,1/32尺寸的heatMap进行upsampling操作之后,因为这样的操作还原的图片仅仅是conv5中的卷积核中的特征,限于精度问题不能够很好地还原图像当中的特征,因此在这里向前迭代。 把conv4中的卷积核对上一次upsampling之后的图进行反卷积补充细节(相当于一个差值过程),最后把conv3中的卷积核对刚才upsampling之后的图像进行再次反卷积补充细节,最后就完成了整个图像的还原。

2019年12月26日 下午4:14

linux文件权限定义:对与每个文件,创建者、创建者所在的组、其他人都有指定的权利

注:有一点需要注意,如果没有sudo权限,那么是无法打开_etc_sudoers ,打开之后是空白,因为文件权限是

1
2
# 只有文件的所有者root,以及root组的用户,才可以r(read)
-r--r----- 1 root root 786 7月 23 11:14 sudoers

linux根本的文件权限管理:

  1. linux的权限管理特别简单:指的就是文件的权限中的::rwx读写执行::(linux一切皆文件)。linux中一提到权限,那么指的就是文件读写执行的权限
  2. 每个文件的最高管理者就是创建这个文件的人
  3. 其中拥有全部文件权限的root用户,就像是机器人三大法则一样,他属于linux本身的一部分。

权限在用户级别的分配:

在linux,在用户级别上有另外一功能:用户A可以将自己的权限(读写执行)分给用户B

  1. 给你部分,我操作文件的权利
  2. 给你全部,我操作文件的权利
  3. 将我的权利打包成一个组,这样可以给多个人相同的权利
  4. 你就是我(通过修改UID)
    注:当然,这里的A也可以是root用户!只不过root给B的,是稀有的系统文件操作权利!

权利等级的高低:

  1. 及时,A给部分权利给B,但是对与linux来说,A并不比B等级高,我把他们理解成合作关系,因为B也可以将部分权利给A呀(这也就是所谓的不同用户)
  2. 但是root用户,等级是高于普通用户的,且拥有全部文件的读写权利,或者改写文件权限的能力;linux的用户等级也特别简单,只有root和非root(普通用户)两种

赋予root权限

方法一:你来我root组,当成组内成员

修改 _etc_sudoers 文件,找到下面一行,把前面的注释(#)去掉

1
## Allows people in group wheel to run all commands
%wheel    ALL=(ALL)    ALL

然后修改用户,使其属于root组(wheel),命令如下:
#usermod -g root tommy
修改完毕,现在可以用tommy帐号登录,然后用命令 su – ,即可获得root权限进行操作。

方法二:我专门给你分配权限,什么可以做、不可以做

Linux:CentOS7.4新建用户并授权 - 老_张 - 博客园具体看这个
修改 _etc_sudoers 文件,找到下面一行,在root下面添加一行,如下所示:

1
## Allow root to run any commands anywhere
root    ALL=(ALL)     ALL
tommy   ALL=(ALL)     ALL

修改完毕,现在可以用tommy帐号登录,然后用命令 sudo – ,即可获得root权限进行操作。

方法三:给自己起一个别名,看起来两个人,其实本质就我一个人

修改 _etc_passwd 文件,找到如下行,把用户ID修改为 0 ,如下所示:
tommy:x:0:33:tommy:/data/webroot:/bin/bash

2019年12月26日 下午2:40

MAC OS X下路由的添加和删除 - 简书

1
2
3
4
5
6
7
8
9
10
# 查看路由表
netstat -r \ netstat -nr

# 路由添加
route -n add -net 192.168.0.0(需进入的网段) -netmask 255.255.255.0 (掩码)192.168.5.254 (进该网段的网关)

route -n add -net 210.76.196.0 -netmask 255.255.255.0 10.8.0.1

# 路由删除
route -v delete -net 10.10.12.0(某网段) -gateway 10.10.12.1(某网关)

2019年12月26日 下午2:24

通过给防火墙iptables添加黑名单,学习sort、uniq、awk、ipset等命令
批量修改文件名:for、find、变量的(%、#)

2019年12月26日 下午2:17
Linux防火墙(iptables)之黑名单 - 简书

1
2
3
4
5
6
7
8
#存文件便于以下的操作
lastb >> lastb.log
#过滤其它字段,只保留ip数据
cat lastb.log|awk -F " " '{print $3}' >> ips.log
#记录ip的出现次数
cat ips.log | sort | uniq -c >> ip_uniq.log
#最终形成列表
cat ip_uniq.log|sort -k1,1nr >> output.log

lastb | awk -F “ “ ‘{print $3}’ | sort | uniq -c | sort -k1,1nr >> output.log

1
grep -o ‘[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' output.log | awk ‘{print “ipset add blacklist”,$0}’|sh

其中涉及到参数有

  1. sort -k
  2. uniq -c
  3. awk -F
  4. 正则
  5. awk ,拼接字符串

2019年12月26日 下午1:44
Linux权限管理 - 球接子 - 博客园

drwxr-xr-x

1
2
3
4
5
6
7
十位字符表示含义:
第1位:表示文档类型,取值常见的有“d表示文件夹”、“-表示文件”、“l表示软连接”、“s表示套接字”、“c表示字符设备”、“b表示块状设备”等等;
第2-4位:表示文档所有者的权限情况,第2位表示读权限的情况,取值有r、-;第3位表示写权限的情况,w表示可写,-表示不可写,第4位表示执行权限的情况,取值有x、-。
第5-7位:表示与所有者同在一个组的用户的权限情况,第5位表示读权限的情况,取值有r、-;第6位表示写权限的情况,w表示可写,-表示不可写,第7位表示执行权限的情况,取值有x、-。
第8-10位:表示除了上面的前2部分的用户之外的其他用户的权限情况,第8位表示读权限的情况,取值有r、-;第9位表示写权限的情况,w表示可写,-表示不可写,第10位表示执行权限的情况,取值有x、-。

权限分配中,均是rwx的三个参数组合,且位置顺序不会变化。没有对应权限就用 – 代替。

chmod 字母形式:

给谁设置:

* u:表示所有者身份owner(user)
* g:表示给所有者同组用户设置(group)
* O:表示others,给其他用户设置权限
* A:表示all,给所有人(包含ugo部分)设置权限
* 如果在设置权限的时候不指定给谁设置,则默认给所有用户设置

权限字符:

* r:读
* w:写
* x:表示执行
* -:表示没有权限

权限分配方式:

* +:表示给具体的用户新增权限(相对当前)
* -:表示删除用户的权限(相对当前)
* =:表示将权限设置成具体的值(注重结果)【赋值】

例子:

例如:需要给_root_anaconda-ks.cfg文件(-rw——-.)设置权限,要求所有者拥有全部的权限,同组用户拥有读和写权限,其他用户只读权限。
答案:
所有者:全部权限(rwx)
同组用户:读写(rw)
其他:只读(r)

1
2
3
4
[root@li yum.repos.d]# chmod o=rwx,g=rw,o=rw /root/anaconda-ks.cfg
[root@li yum.repos.d]# ls -l /root
-rw-rw-rw-. 1 root root 1536 5月 16 22:41 anaconda-ks.cfg
-rw-r--r—. 1 root root 1584 5月 16 22:43 initial-setup-ks.cfg

chmod 数字形式:

例如:需要给anaconda-ks.cfg设置权限,权限要求所有者拥有全部权限,同组用户拥有读执行权限,其他用户只读。

  • 所有者权限 = 全部权限 = 读 + 写 +执行 = 4 + 2 + 1 = 7
  • 同组用户权限 = 读权限 + 执行权限 = 4 + 1 = 5
  • 其他用户权限 = 读权限 = 4
    ::最终得出的结果是754::