Linux 过滤器
管道线中一个个的命令就是过滤器(从标准输入中接受数据,然后再传到标准输出中),但是在最前面的和在最后面的不一定是过滤器。
基础cat 复制cat的用途就是把标准输入中的数据复制到标准输出中
应用:可以与重定向结合。cat > data,这样从键盘中输入的数据将直接传到data文件中
此外还可以让文件内容显示在控制台上,有 cat < data,标准输入变成了data文件,标准输出是屏幕。为了方便,直接cat 文件名也是可以的
此外,tail也有类似的功能,但是它只能显示最后的十行
另外一个应用就是把一个文件复制到另一个文件。例如,cat < data > newdata
增强cat功能cat < file…= cat file …
有三个点说明了可以同时输入多个文件,这样就为组合多个文件提供了途径
cat data1 data2 data3 >file
后缀:
-n 在每行后面加一个行号
-b 与-n一起使用,不要对空白行加行号
-s 将多个连续的空白行变成一个空白行
split 分为不同文件语法 split [-d] [-a num] [- ...
汇编指令 AT&T版 64位
用g++ -Og -S -masm=intel name.c 可以生成intel格式的汇编代码,-S是生成汇编代码,-Og是省去不重要的部分,如果不加这个,可能5条指令要变成十多条指令
-fno-if-conversion 分支语句不要采用条件传输的方式,条件跳转的方式
-g debug
objdump -d 反汇编
gdb 调试 b+ 标号 设置断点 info register 查看寄存器 r 执行到断点出
n(next) 执行下一条命令
gdb调试更多可看
mov 移动指令格式: movq a,b
a是原操作数,b是目标操作数
这个指令中的q代表的是64位
长度
类型
别名
缩写
1
char
byte
b
2
short
word
w
4
int
double word(long word)
l
8
long
quad word
q
8
char*
quad word
q
4
float
…
s
8
double
…
l
源操作数
目标操作数
立即数(idata)
寄存器 ,地址
寄存器
寄存器,地址
地址
...
元字符的使用
元字符元字符指的是Linux中有特殊含义的字符,例如 ; 换行符等。
字符引用和转义如果不想用元字符内在含义,只想打出这个字符,那么就需要用到引用字符。
字符引用的方法有三种,使用反斜线,使用一对单引号或者使用一对双引号
例如 echo a ; b 这样就会把他们当成不同的指令,但是如果 echo a\; b这样就会当成同一个指令,实际上\是转义字符,转义字符指的是把一个字符从一中状态转移到另一种状态
单引号会将一切字符引用,这样有时例如我需要引用其中一个变量的值的时候就会出现问题
这时我们就可以用到双引号,双引号不会引用 $ , \ , `(反引号),
引用能力强弱 \>''>""
如果输入换行字符,单引号并不会转义它,但是\会转义它。
反引号作用是输出程序结果。例如echo " There are `ps aux | wc -l` processes "输出 there are 268 processes反引号可以用 $(…)替代
进程和作业控制
进程就是加载到内存中准备执行的程序。当进程创建的时候,内核赋予了唯一的标识号,这个标识号叫做进程ID或PID。
进程同一时间内可达数百个之多,为了管理这么多的进程。系统提供了一个调度器来维护。调度器维护一个所有进程的列表,每次选择一个进程(实际上可以一次选择多个进程),然后执行一个短暂的时间(时间片)。
典型的时间片是10毫秒。为了为了下一个时间片还可以顺利的执行,系统必须要保存下一条指令的位置,环境的副本等。
进程分叉到死亡当进程需要使用内核的服务时,会使用系统调用发送请求。在编写程序时,系统调用的使用方法取决于语言。例如,c语言使用标准库中的函数进行调用。
下面列举一些常见的系统调用函数
系统调用
作用
进程控制
fork
创建当前进程的一个副本
wait
等待另一个程序结束后执行(强制暂停当前进程)
exec
在当前进程中执行一个新进程
exit
中止当前进程
kill
杀死子进程
文件I/O
open
打开一个用于读取或写入的文件
read
从文件中读取数据
write
向文件中写入了数据
close
关闭文件
...
linux目录操作
目录名和工作目录斜杠表示根目录,如果最后一个名称代表的是文件名。当然,这个文件名也可以是一个目录。
工作目录又叫当前目录,也是进行操作的根目录(但不是系统的根目录),如果命令后面直接输入一个文件名,那么就是代表这个目录在工作目录中,系统也只会在当前目录中搜寻。
绝对目录和相对目录绝对目录就是从根目录开始。在Linux系统中,根目录是home(这个根目录是当前用户的根目录)目录。
相对目录就是从工作目录(当前目录)开始。大多数时候我们输入一个文件名其实都是输入相对目录,我们也可以输入绝对目录,但那样过于麻烦。
路径名缩写第一个: ..(两个点号)。这个符号的含义是父目录,也就是上级目录。用..可以回到上级目录然后在进入子目录
例:现在绝对目录是 /home/abcd/ceshi,如果我想进入abcd的gongzuoqu目录,那么输入cd ../gongzuoqu即可。这是从左向右读的, ..代表进入父目录,然后再进入父目录中的工作区目录。
第二个: .(一个点号)。代表的是当前目录,注意任何不以/开头的路径名都被认为相对于工作目录。所以大部分情况下直接输入文件名即可,但是在某些情况下必须 ...
shell内部命令与外部命令与搜索路径
有些命令是shell外部的,shell会解析参数然后调用外部的程序去处理它,另外还有一些是对shell起作用的,叫shell内置命令
如果先查看内部命令,需要 man + shell名称 ,例如,man bash
外部命令和搜索路径shell是如何知道那些程序都在哪呢? 实际上shell是检查PATH环境变量,PATH包含一串字符,这串字符就是一系列目录名称,称作搜索路径。如果输入一个命令,shell会依次按这些目录去搜索命令
先要看PATH 直接 echo $PATH即可
修改搜索路径可以用export命令,export命令可以使PATH变量变成环境变量,这就意味着shell和随后所有进程都可以使用它,例如export PATH="/bin:/usr/bin:/usr/ucb:/usr/local/bin"
如果希望在搜索路径的末尾加上一条路径,可以 export PATH="$PATH:$HOME/bin"如果想在最后加上一条指令,可以export PATH="$HOME/bin:$PATH"
如果把自己写的date命令放 ...
java 多线程
java线程运行机制java虚拟机中,执行程序是由线程完成的,每个线程都有独立的程序计数器(PC或rip)和栈
栈中有三个区,局部变量区,操作数栈和栈数据区。
操作数栈是线程的工作区,用来存放运算过程产生的临时变量(怎么有种寄存器的感觉)。
栈数据区为线程执行指令提供相关信息,例如定位到堆区和方法区的特定数据(类成员变量),正常退出方法等(存放地址信息)。
每次java虚拟机启动一个虚拟机进程时,虚拟机都会创建一个主线程。该线程从main开始执行。
例如在一个类中定义了一个实例变量a,然后再main函数中调用了这个类的成员函数A(),这个函数会让成员变量加一。首先进入这个方法,然后发现a++;就去栈数据区取出a的地址,之后定位到堆区取出a进行操作。
方法区存放了字节码
堆区存放了线程所需要长时间保存的数据(类)
栈区存放了临时数据,栈帧和跳转到其他区域地址。
线程的创建和启动我们现在免费有了一个主线程,如果我们还想要创建其他线程的话,有两种方式。
扩展java.lang.Thread类
实现Runnable接口
要注意一点,创建了线程并启动之后会有自己的栈区,堆区,方法区,也就 ...
神经网络(NN)
多层向前神经网络该神经网络的层数大的有三层:输入层, 隐藏层(隐藏层可以有多层), 输出层。
该图是两层神经网络(输入层不算)
每层由单元组成(例如决策树算法中的一和零) 。输入层就是传入一些特征向量。
理解:
下一层的神经元可以看成y,然后每个w可以看成k,那么其实就是一条直线。有些层次用来做 && 或 || 的操作,这样就可以用多条直线对区域进行划分.
权重: 每两层有线进行连接,线上的数值就是权重,我们是通过特征向量和权重相乘求和再用非线性方程转化得到下一层的
3. 设计神经网络结构 3.1 使用神经网络训练数据之前,必须确定神经网络的层数,以及每层单元的个数 3.2 特征向量在被传入输入层时通常被先标准化(normalize)到0和1之间 (为了加速学习过程) 3.3 离散型变量可以被编码成每一个输入单元对应一个特征值可能赋的值 比如:特征值A可能取三个值(a0, a1, a2), 可以使用3个输入单元来代表A。 如果A=a0, 那么代表a0的单元值就取1, 其他取0; ...
层次聚类
概念层次聚类(hierarchical clustering)就是不断把最近的类合并知道达到要求为止。这是一种树形结构
大致过程:
初始化,每个实例看做一类
合并, 算出每两个类之间的距离,然后把距离最近的两个类合并成一个类
终止条件可以是最近两个类之间的距离
计算两个类之间距离的方法
SingleLinkage: 这种方法是以两个类中最短距离代表两个类之间的距离。但是这种方法可能出现链式反应,即抓到了一个离其他点十分近的点就抓到了一群点,但实际上分属两团
CompleteLinkage: 这种方法是找两个类中最长点距离
AverageLinkage: 这种方法是把两个类中所有点的距离求出来再求平均值,或者也可以取中值
应用from numpy import *"""Code for hierarchical clustering, modified from Programming Collective Intelligence by Toby Segaran (O'Reilly Media 2007, page 33). " ...
支持向量机
引入
上图中黑色和白色的点分别代表一类事物,我们想用一条直线把这两类事物区分开,显而易见红线区分最好,那么为什么红线区分最好呢?
这里引入了一个概念,边际。边际指的是做一个超平面,使得两侧离的最近的点的距离。
如何选取使边际(margin)最大的超平面 (Max Margin Hyperplane)?
超平面到一侧最近点的距离等于到另一侧最近点的距离,两侧的两个超平面平行。
选取最大超平面 超平面可以定义为: W * X + b = 0
W是一个类似于权重的向量, X是我们给出的实例的特征向量, b是偏好
超平面方程也可以写成这是二维的,b也就是w0.
上方的点满足大于零,下方的点小于零
H1就是上边界,也就是两个图中上面的这条线,至于为什么后面是1?这只是用来区分上边界还是下边界,可以通过w0进行调节。我们输入其实就是(x1,x2,…, yi),yi就是类别标记
两个公式可以合并
在边界上的点叫做支持向量
我们可以得出一个结论:分界的超平面和H1/H2之间的距离是1/||W||。
也就是先平方再开方
所以最大边界距离是2/||W||
所以我们要 ...