根据本人学习经验,对于shell编程来说,如果不是专门的shell编程人员,系统的学习这方面知识很容易忘记,收效甚微。所以我根据日常使用过程中的积累,不断添加使用范例,来达到学习和积累的目的。
所以本文会持续的添加内容。
awk使用
- 统计一个像矩阵一样的文件有多少列: 1head -n 1 <filename> | awk -F <separator> '{print NF}'
注:1. 本次搭建环境为archlinux arm平台, 但是通过本人多次实践以及对不同平台的了解,基本操作和原理完全相同。
2.OpenVPN 需要内核模块tun支持。使用命令 modprobe tun 检测是否有此模块,若无可能需要重新便宜linux kernel.
Step 1: 安装
安装openvpn和easy-rsa。
Step 2:证书生成
至此,便生成了说需要的所有证书和密钥。
Step 3: server conf配置
以下为我的配置,可作为参考:
Step 4: 测试
到目前为止,server基本配置完毕。临时启动server进行测试。
然后查看是否有tun0网卡,以及网卡信息与配置是否一致。
Step 5: 通过VPN上网
现在我们的openvpn server已经可以接受client连入了,但是client还不能上网。所以需要将openvpn子网的连接转发到可上网的网卡,如eth0.
配置如下:
然后就可以用iptable进行转发了。
Step 6: 开机启动
OpenVPN在安装时自带system service,但是使用的是模板语法。在我的平台上,该模板名称为openvpn-server@.service。具体可到/usr/lib/systemd/system目录下查看。该模板使用%i对conf文件进行输入,所以在本平台上创建开机启动项如下(可根据实际情况修改):
Step 7: Client配置
我的client配置采用windows上openvpn目录下sample-config中的client.ovpn作为模板,下面是我的配置,可作为参考,根据自身情况修改。
在client使用前,需要将之前easy-rsa生成的ca.crt, client.key, client.crt, ta.key拷贝到客户端openvpn config目录下。
查看当前locale设置:
查看系统目前可用的locale配置:
如果某种locale不在上述列表中出现,可以使用locale-gen命令来安装该种locale。
上述命令会安装 zh_CN.UTF-8。
修改当前locale配置:
可以直接编辑/etc/default/locale文件,也可以使用如下命令来修改该文件:
en_US.UTF-8… cannot open locale definition file ‘translit_neutral’: No such file or directory failed
解决:
从别的机器上copy /usr/share/i18n 覆盖本机。
1. 全新字符库编码信息位于 /usr/share/i18n目录下面,其中SUPPORTED中包含可用的所用字符集。其中的charmaps存的每种字符集的映射信息。使用localedef可以生成字符集,就是locales里面那些东西。但这些并不是系统中能用的字符集。刚才描述的这些/usr/share/i18n里面的文件只能算是可用的字符集,locale -m可以看到列表。
2. 为了让系统能使用,原始的/usr/share/i18n中的文件要经过处理(complile),能用的字符编码在/usr/lib/locale/下面,成为complied字符集。
3. 使用locale-gen可以把原始的/usr/share/i18n中的文件complie成系统能用的/usr/lib/locale/地字符集。所以当使用locale-gen 命令出现由某些文件确实而失败的情况,往往是由/usr/share/i18n下缺少相应文件导致的。
4. /usr/share/i18n里面的东西操作系统无关,不同体系结构不同系统可以通用,若有缺失,从其他地方复制来便可。
reference: http://blog.csdn.net/yunhuang2010/article/details/8109578
隐马尔克夫模型可以用两组状态集合和三组概率集合来描述:
(1) 隐藏状态: 隐藏在观察状态后的状态
(2) 观察状态: 表象看到的状态
(3) 初始概率集合: 包含了隐状态在t=1时刻的初始选择概率
(4) 状态转移矩阵: 包含了隐藏状态到另一个隐藏状态的概率
(5) 混淆矩阵: 包含了隐马尔克夫模型的某一个隐藏状态观察到某个观察状态的概率。
● HMM有一个最重要也是非常不符合实际的假设:以上各种概率不随时间的迁移而改变。
● 因此一个HMM是在一个马尔克夫过程中引入一组隐藏状态以及与其相关的观察状态的概率关系。
一个HMM是一个三元组(pi, A, B)。
其中xij表示j时刻的隐藏状态为xi, i ∈ {1…n}, n为隐藏状态的书目。
Pr(yi | xj)表示在隐藏状态xj下观察到观察状态yi的概率。
一旦一个系统可以作为HMM来描述,就可以解决三个基本问题:
(1) 评估
问题描述: 这种情况知道一些(pi, A, B)的HMM模型,对于给定的观察状态序列,计算最有可能产生该序列的HMM。即计算HMM产生观察序列的概率。
解决方法: 前向算法(forward algorithm)
算法描述:
(2) 解码
问题描述: 这种情况知道观察序列以及对应的HMM模型,计算与观察序列对应的最有可能的隐藏序列。
解决方法: Viterbi算法
算法描述:
(3) 学习
问题描述: 根据一个观察序列(来自于已知的集合),以及与其有关的一个隐藏状态集,估计一个最合适的隐马尔科夫模型(HMM),也就是确定对已知序列描述的最合适的(pi,A,B)三元组。
解决方法: 前向-后向算法
算法描述:
a.后向算法
b.前向后向算法
在linux系统中,如果想了解系统中CPU的相关信息,可以通过/proc/cpuinfo文件找到。本文章针对该文件某些输出项进行介绍。
processor :系统中逻辑处理核的编号
vendor_id :CPU制造商
cpu family :CPU产品系列代号
model :CPU属于其系列中的哪一代的代号
model name:CPU属于的名字及其编号、标称主频
cpu MHz :CPU的实际使用主频
cache size :CPU二级缓存大小
physical id :单个CPU的标号
siblings :单个CPU逻辑物理核数
core id :当前逻辑核所在的物理核在其所处CPU中的编号
cpu cores :该逻辑核所处CPU的物理核数
apicid :用来区分不同逻辑核的编号,系统中每个逻辑核的此编号必然不同,此编号不一定连续
fpu :是否具有浮点运算单元(Floating Point Unit)
fpu_exception :是否支持浮点计算异常
cpuid level :执行cpuid指令前,eax寄存器中的值,根据不同的值cpuid指令会返回不同的内容???
wp :表明当前CPU是否在内核态支持对用户空间的写保护(Write Protection)
flags :当前CPU支持的功能
bogomips :在系统内核启动时粗略测算的CPU速度(Million Instructions Per Second)
clflush size :每次刷新缓存的大小单位
cache_alignment :缓存地址对齐单位
address sizes :可访问地址空间位数???
根据以上内容,我们则可以很方便的知道当前系统关于CPU、CPU的核数、CPU是否启用超线程等信息。
1. 查询系统具有多少个逻辑核: cat /proc/cpuinfo | grep "processor" | wc -l
2. 查询系统单个CPU的物理核数:cat /proc/cpuinfo | grep "cpu cores" | uniq
3. 查询系统CPU是否启用超线程:cat /proc/cpuinfo | grep -e "cpu cores" -e "siblings" | sort | uniq
如果cpu cores数量和siblings数量一致,则没有启用超线程,否则超线程被启用。
4. 查询系统CPU的个数:cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l
|
|