ESLint

1. 什么是 eslint

  • ESLint 是一个开源的 JavaScript 代码检查工具,由 Nicholas C. Zakas 于 2013 年 6 月创建。
  • 代码检查是一种静态的分析,常用于寻找有问题的模式或者代码,并且不依赖于具体的编码风格。对大多数编程语言来说都会有代码检查,一般来说编译程序会内置检查工具。
  • JavaScript 是一个动态的弱类型语言,在开发中比较容易出错。因为没有编译程序,为了寻找 JavaScript 代码错误通常需要在执行过程中不断调试。像 ESLint 这样的可以让程序员在编码的过程中发现问题而不是在执行的过程中。
  • ESLint 的初衷是为了让程序员可以创建自己的检测规则。ESLint 的所有规则都被设计成可插入的。ESLint 的默认规则与其他的插件并没有什么区别,规则本身和测试可以依赖于同样的模式。
  • 为了便于人们使用,ESLint 内置了一些规则,当然,你可以在使用过程中自定义规则。
  • ESLint 使用 Node.js 编写,这样既可以有一个快速的运行环境的同时也便于安装。

2. 如何使用

  • 在 vscode 中,安装插件 ESLint。eslint 的必备环境为 nodejs,这个插件能够使 vscode 自动完成一些工作,帮助我们更好地使用 eslint。如修改文件时自动检查,配置全局规则,对不同类型文件使用不同的检查策略等。
    安装好后,在编辑器的全局配置中,建议如下配置。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
"eslint.autoFixOnSave": true,//尝试在保存文件时自动修复(仅限少数简单的可自动修复错误)
"eslint.validate": [//规定需要被检查的文件类型,autofix选项规定是否自动修复
{
"language": "javascript",
"autoFix": true
},
{
"language": "javascriptreact",
"autoFix": true
},
{
"language": "html",
"autoFix": true
},
{
"language": "vue",
"autoFix": true
}
],
"eslint.alwaysShowStatus": true,//总是显示eslint状态
"eslint.run": "onSave"//在保存文件时运行eslint(而不是改变文件类型时,onType)
  • 可在全局环境安装 eslint 包,也可在单独项目中安装。
1
2
npm install eslint -g
npm install eslint
  • 在项目中可单独配置文件.eslintignore,规定让 eslint 忽略的所有文件和路径;
  • 可配置.eslintrc.js 文件规定 eslint 的全部配置。以下详细解释配置文件的各项内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
module.exports = {
root: true,//规定此目录为根级,即无需再向上匹配检查
parserOptions: {//规定使用的解析器
parser: 'babel-eslint'//这里由于用到了es6,所以推荐使用babel-eslint
},
env: {//可规定运行环境
browser: true,//此为浏览器环境
},
extends: [//规定了需要扩展应用的规则集
'plugin:vue/essential',//这里由于使用了vue,推荐加上
'standard'//这个规则集是使用较为普遍的一种,同样的还有其他规则集可以采用
],
plugins: [//提供各种功能的插件
'vue'
],
rules: {//自定义规则,优先级最高
"indent": ["error", 4],
// allow async-await
'generator-star-spacing': 'off',
// allow debugger during development
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
}
}
  • 配置文件还可为以下格式,eslint 的读取顺序如下: .eslintrc.js –> .eslintrc.yaml–>.eslintrc.yml–>.eslintrc.json–>.eslintrc–>package.json
  • 还可与 webpack 配合使用,达到打包时自动进行检查,并给出提示的效果。需要在项目中安装 eslint-loader 包,并配置相应规则。推荐配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
module: {
rules: [
{
test: /\.(js|vue)$/,//需要匹配的文件
loader: 'eslint-loader',//加载器名称
enforce: 'pre',//规定为预编译
include: [resolve('src'), resolve('test')],//指定作用目录
options: {//可选配置
formatter: require('eslint-friendly-formatter'),//错误输出格式友好
emitWarning: true//尝试报错(而不是警告)
},
}]
}

3. 代码检查相关

  • 正确地使用 eslint,能够避免我们日常开发中,大部分的书写疏忽、语法错误等,还能够对不规范的写法进行约束,久而久之能够形成良好的代码书写习惯,更会有利于团队协作开发,代码维护等。
  • 还有 htmlhint,stylelint 等工具,可对 html、css 等经常涉及到的文件进行语法或书写规范检查,后续可以进一步调研,并应用到项目开发中去。

LF & CRLF

1. 什么是 CRLF 和 LF

  • CR, ASCII 13, \r 回车
  • LF, ASCII 10, \n 换行
  • CRLF 是 Carriage-Return / Line-Feed 的缩写,意思是回车/换行
  • LF 指代换行

2. 使用场景

  • CRLF -> Windows-Style 表示句尾使用回车换行两个字符(”\r\n”)
  • LF -> Unix-Style 表示句尾只使用换行(”\n”)
  • CR -> Mac-Style 表示句尾只使用回车(”\r”)
  • 正确使用可避免 CRLF 注入攻击

3. Git 设置

  • AutoCRLF
  1. 提交时转换为 LF,检出时转换为 CRLF
1
git config --global core.autocrlf true
  1. 提交时转换为 LF,检出时不转换 (因此建议在 window 操作系统下,不要使用这个设置)
1
git config --global core.autocrlf input
  1. 提交检出均不转换
1
git config --global core.autocrlf false
  • SafeCRLF
  1. 拒绝提交包含混合换行符的文件
1
git config --global core.safecrlf true
  1. 允许提交包含混合换行符的文件
1
git config --global core.safecrlf false
  1. 提交包含混合换行符的文件时给出警告
1
git config --global core.safecrlf warn

4. 图示

1
2
3
4
5
6
core.autocrlf=true:      core.autocrlf=input:     core.autocrlf=false:
repo repo repo
^ V ^ V ^ V
/ \ / \ / \
crlf->lf lf->crlf crlf->lf \ / \
/ \ / \ / \

5. 编辑器设置

  • vs code 中,可设置 “files.eol”: “\r\n” 来修改

6. 最终解决方案

  • .editorconfig 文件中,设置 end_of_line = crlf
  • git config –global core.autocrlf true 取默认值,无需单独设置
  • 编辑器设置 User Settings 中 “files.eol”: “\r\n” 取默认值,无需单独设置

npm全局安装失效及变量设置失败

问题

win 环境下,nodejs 安装使用官网 msi 文件,npm 默认非最新版本;使用npm install -g全局安装时会失效,仍为安装在当前目录下。

可能解决方案

查资料,几种推荐的配置环境方法为:

  • npm config set prefix "C:\Program Files\nodejs" (node 安装目录)
  • npm config set cache "C:\Program Files\nodejs\cache" (先建好 cache 目录)
  • 设置系统环境变量node_pathnode_modules目录
    但是使用npm config设置变量时,出现 overridden 默认值的情况,导致设置不成功,不知道是否为用户权限等问题。
    并因此导致全局安装失效,;因为变量prefix未被设置成功,总是默认为当前目录。

dhcp服务搭建

本实验的 OS 环境-CentOS 6.2

CentOS 是 RHEL(Red Hat Enterprise Linux)源代码再编译的产物的免费版,继承了 Red Hat Linux 的稳定性,而且又提供免费更新,因此在 IDC 中装机量几乎是最大的一个 Linux 发行版.

安装 DHCP 相关软件包

1
2
3
rpm –qa|grep dhcp     //查看是否安装了DHCP相应的软件包
rpm –ivh dhcp-4.0 //安装DHCP相应的软件包(本地有相应的软件包)
yum install dhcp //在线安装DHCP软件包

配置本机的 IP 地址

修改/etc/sysconfig/network-scripts/ifcfg-eth0文件:

1
2
3
4
5
6
7
8
DEVICE=eth0
HWADDR=00:18:8B:8D:AB:49
BOOTPROTO=dhcp
IPADDR=192.168.1.10 //可任意指定
GATEWAY=192.168.1.1
BROADCAST=192.168.1.255
NM_CONTROLLED=no
ONBOOT=yes

修改 DHCP 配置文件

可以从/usr/share/doc/dhcp-4.1.1/dhcpd.conf.sample复制,也可以直接编辑/etc/dhcp/dhcp.conf(如果没有新建一个,注意 CentOS 5 中dhcpd.conf/etc目录下).
dhcpd.conf内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ddns-update-style none;                   //配置DHCP-DNS互动更新模式
ignore client-updates; //忽略客户端更新
subnet 192.168.1.0 netmask 255.255.255.0 { //设置子网声明,该子网要包含本机的IP地址
option routers 192.168.1.1; //默认网关
option subnet-mask 255.255.255.0; //子网掩码
option nis-domain "domain.org"; //NIS域名
option domain-name "it.com"; //DNS域名
option domain-name-servers 10.0.100.166; //DNS的IP地址
option time-offset -1800; //偏移时间
range dynamic-bootp 192.168.1.100 192.168.1.200; //动态的IP地址池,为DHCP客户机分配
default-lease-time 21600; //默认的地址租期
max-lease-time 43200; //最长的地址租期
host ns { //主机声明
next-server marvin.redhat.com;
hardware ethernet 00:18:8b:83:89:af;
fixed-address 192.168.1.50;
}
}

控制 DHCP 服务器

service dhcpd start          //启动DHCP服务
service dhcpd stop           //关闭DHCP服务
service dhcpd restart        //重启DHCP服务

在指定网络接口上启动 DHCP 服务器

修改/etc/sysconfig/dhcpd文件:

1
DHCPDAGRS=eth0   //在eth0网卡上启动DHCP

查看 DHCP 客户机地址的租约信息

/var/lib/dhcpd/dhcpd.leases文件中保存了客户机地址的租约信息

1
2
3
4
# The format of this file is documented in the dhcpd.leases(5) manual page.
# This lease file was written by isc-dhcp-4.1.1-P1
...
"/var/lib/dhcpd/dhcpd.leases" 3L, 128C

pxe启动环境搭建

PXE 启动简介及原理

  • PXE 简介
  1. 预启动执行环境(PXE)指的是那些使得 IBM 兼容计算机(经常是运行 Windows 系统)不需要硬盘或是启动软盘就能启动的方法.这种方法早在计算机具有内部磁盘驱动器的时代之前就已经开始发展.
  2. PXE 通常都是利用固件来启动计算机,这种固件是包含数据的只读内存(ROM)或是可编程只读内存(PROM)芯片,而不是包含数据的磁介质.这还产生了“PXE boot ROM”和“PXE boot PROM”(有时也写成“PXE bootprom”)这样的术语.
  3. 从 ROM 或 PROM 启动免除了对机电设备(物理驱动器)的依赖,同时提高了可靠性及避免了驱动器读取错误.利用当今的内存技术,从 ROM 或 PROM 能够很快地启动.PXE 也能够用于从网络启动计算机.
  • PXE 原理
  1. 客户端电脑开机后,如果 BIOS(Basic Input Output System 的缩略语,直译过来就是“基本输入输出系统”.它的全称应该是 ROM-BIOS,意思是只读存储器基本输入输出系统.其实,它是一组固化到计算机内主板上一个 ROM 芯片上的程序,它保存着计算机最重要的基本输入输出的程序、系统设置信息、开机上电自检程序和系统启动自举程序.)设置从网络启动,那么网卡中的 PXE Boot ROM 获得控制权之前先做自我测试,然后发送一个动态获得 IP 地址的广播包(请求 FIND 帧)到网络上.
  2. DHCP 服务器在收到该广播包后,发送给客户端分配 IP 地址的 DHCP 回应包.内容包括客户端的 IP 地址,TFTP 服务器的 IP 地址(DHCP 服务器的 066 选项),预设通讯通道,及开机启动文件(DHCP 服务器的 067 选项).该文件应该是一种由 PXE 启动规范规定的固定格式的可执行文件,类似于 Windows XP 正常启动时显示多重启动菜单之前的启动代码.
  3. 客户端收到 DHCP 回应后,则会响应一个 FRAME,以请求传送启动文件.之后服务端将和客户机再进行一系列应答,以决定启动的一些参数.
  4. 客户端通过 TFTP 通讯协议从服务器下载开机启动文件.启动文件接收完成后,将控制权转交给启动块,完成 PXE 启动.客户端通过这个开机影像文件开机,这个开机文件可以只是单纯的开机程式也可以是操作系统.如果是用 3Com Boot Image Editor 编辑的启动文件,系统将根据 PXE 文件中的代码决定是显示选择菜单还是直接下载预设的镜像文件启动电脑.接下来的工作就由相应的镜像文件来完成了.

实验环境

  • 服务器

CentOS 6.2, DHCP, tftp, nfs, IP 192.168.1.10

  • 客户端

支持 PXE 启动的 PC(Lenovo Thinkpad E430)

安装配置

  • 配置 DHCP 服务器

dhcp 服务搭建,在配置文件/etc/dhcp/dhcpd.conf中添加如下两行:

1
2
filename “pxelinux.0”;         //客户端要读取的启动文件
next-server 192.168.1.10; //tftp服务器的IP地址

配置 tftp 服务器

  • 安装相应的软件包:yum –y install tftp* xinetd
  • 修改 tftp 的配置文件/etc/xinetd.d/tftp,将diabale = yes修改为disable = no,此配置文件中指定了 tftp 的根目录为/tftpboot,如果没有此目录可手动创建一个,有的版本 tftp 根目录为/var/lib/tftpboot
  • 启动 xinetd 服务:service xinetd start
  • 也可以将其设为开机启动:chkconfig xinetd on

配置 nfs

  • NFS 是 Network File System 的简写,即网络文件系统,是 FreeBSD 支持的文件系统中的一种.NFS 允许一个系统在网络上与他人共享目录和文件.通过使用 NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件.
  • 安装相应的软件包:yum –y install nfs*
  • 修改配置文件/etc/exports,添加如下内容:
1
/tftpboot *(ro,sync)
  • 启动 nfs 服务:
    service rpcbind restart
    service nfslock restart
    service nfs restart

配置 PXE 启动需要的文件:pxelinux.0

  • 将安装光盘中的文件夹拷贝到/tftpboot下:cp /usr/share/syslinux/pxelinux.0 /tftpboot
  • /tftpboot下新建pxelinux.cfg目录,将安装光盘中isolinux目录下的isolinux.cfg拷贝到新建目录下,并重命名为default
  • 至此,服务器端配置完成,从网络启动客户端即可网络安装 OS.

无人值守网络安装 OS

  • 创建ks.cfg(KickStart 配置文件)
  • default文件中添加如下内容:
1
append initrd=initrd.img ks=nfs:$SERVERIP:$KS.CFG_DIR ksdevice=eth0

常见问题

  • 出现TFTP time out问题:关闭服务端的防火墙:service iptables stop
  • 出现received error from TFTP server:关闭服务端的 syslinux:setenforce 0
  • 出现arp timeout问题:确认服务器和客户端的网络可通,有的操作系统可能会因为虚拟网桥的原因能分配到 IP 地址但相互 ping 不通
  • 出现unable to read package metadata.:检查安装目录下的repodata文件夹下的文件是否有合适的后缀名,如果没有就手动添加它们的后缀名.

开发ast2400自定义ipmi命令

定义自己的NetFnCMD

  • ipmipdk_dev包中添加两个头文件SDC_CmdsHndlr.hPDK_Cmds.h,一个文件定义NetFnCMD的编码和命令处理的函数指针并声明各个函数,一个文件定义有关自定义命令需要的各种数据结构.例子如下:
    SDC_CmdsHndlr.h

  • 这个例子中定义的NetFunction为:NETFN_SDC,编码为0x3A,在这个NetFn下定义了 4 条 OEM 指令,编码分别为 0xA0, 0xA1, 0xA2, 0xA3,这四条命令对应的处理函数为SDCSetUplinkInfo, SDCGetUplinkInfo, SDCSetStorgeInfoSDCGetStorgeInfo.
    PDK_Cmds.h

  • 这个文件中定义了各个命令的请求数据结构和响应数据结构,如果命令没有请求数据,可以不定义请求数据结构,但是各个命令一定要定义响应的数据结构,至少应有一项:完成码CompletionCode.

将自定义的命令添加到网络功能表中

  • libipmipdkcmds包中的cmdselect.c中添加如下内容:
    cmdselect.c
  • libipmipdkcmds包中的PDKCmds.c中添加如下内容:
    PDKCmds.c

实现各个命令处理函数

  • libipmipdkcmds包中添加一个文件,定义自己的命令处理函数.在各个函数体中实现自己设计的功能.
    SDC_Cmds.c

makefile文件作相应的修改:

makefile

替换redhat的yum安装源

删除 redhat 原有的 yum 源

# rpm -aq | grep yum|xargs rpm -e --nodeps

下载新的 yum 安装包

  • 此处使用 CentOS 的 yum 源
1
2
3
4
# wget http://mirror.centos.org/centos/6.5/os/i386/Packages/python-iniparse-0.3.1-2.1.el6.noarch.rpm
# wget http://mirror.centos.org/centos/6.5/os/i386/Packages/yum-metadata-parser-1.1.2-16.el6.i686.rpm
# wget http://mirror.centos.org/centos/6.5/os/i386/Packages/yum-3.2.29-40.el6.centos.noarch.rpm
# wget http://mirror.centos.org/centos/6.5/os/i386/Packages/yum-plugin-fastestmirror-1.1.30-14.el6.noarch.rpm

安装 yum 软件包

1
2
3
# rpm -ivh  python-iniparse-0.3.1-2.1.el6.noarch.rpm
# rpm -ivh yum-metadata-parser-1.1.2-14.1.el6.i686.rpm
# rpm -ivh yum-3.2.27-14.el6.centos.noarch.rpm yum-plugin-fastestmirror-1.1.26-11.el6.noarch.rpm
  • 注意:最后两个安装包相互依赖,要放在一起同时安装,否则安装失败.

更改 yum 源

  • 使用网易的 CentOS 镜像源
1
2
3
# cd /etc/yum.repos.d/
# wget http://mirrors.163.com/.help/CentOS6-Base-163.repo
# vi CentOS6-Base-163.repo
  • 编辑文件,把$releasever全部替换为版本号“6”,
1
`:%s/$releasever/6/g`.
  • 或者直接把以下内容拷贝到CentOS6-Base-163.repo文件中(已修改)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#########################################################################
# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client. You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the
# remarked out baseurl= line instead.
#
#

[base]
name=CentOS-6 - Base - 163.com
baseurl=http://mirrors.163.com/centos/6/os/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=6&arch=$basearch&repo=os
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6

#released updates
[updates]
name=CentOS-6 - Updates - 163.com
baseurl=http://mirrors.163.com/centos/6/updates/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=6&arch=$basearch&repo=updates
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6

#additional packages that may be useful
[extras]
name=CentOS-6 - Extras - 163.com
baseurl=http://mirrors.163.com/centos/6/extras/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=6&arch=$basearch&repo=extras
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-6 - Plus - 163.com
baseurl=http://mirrors.163.com/centos/6/centosplus/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=6&arch=$basearch&repo=centosplus
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6

#contrib - packages by Centos Users
[contrib]
name=CentOS-6 - Contrib - 163.com
baseurl=http://mirrors.163.com/centos/6/contrib/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=6&arch=$basearch&repo=contrib
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6

#########################################################################

清理 yum 缓存

# yum clean all
# yum makecache       //将服务器上的软件包信息缓存到本地,以提高搜索安装软件的速度
# yum install vim*    //测试域名是否可用

至此,Redhat6 可以使用 CentOS 的 yum 源在线安装软件.

参考资料