0%

字节序,顾名思义就是字节的顺序。说详细点,就是大于一个字节类型的数据在内存中存放的顺序。 通常情况下,开发时不会直接和字节序打交道,只有在跨平台或网络传输字节数据时会使用到。

字节序按类型分为两种:Little-EndianBig-Endian

  • Little-Endian:低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
  • Big-Endian:高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
  • 网络字节序:TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。

例:如果将0x1234abcd写入到以0x0000开始的内存中,则结果为:

1
2
3
4
5
         BE    LE
0x0000 0x12 0xcd
0x0001 0x34 0xab
0x0002 0xab 0x34
0x0003 0xcd 0x12

参数化测试本身是不支持多线程测试的,对于一些测试结果没有依赖的测试来说,单线程的测试执行效率相当低下。

通过在测试用例中添加线程租,开启多个线程同时执行测试用例,并且在线程租中线程都执行完的时候结束测试,来达到优化测试效率的目的。

Read more »

参数化测试的编写稍微有点麻烦(当然这是相对于JUnit中其它特性而言):

  1. 为准备使用参数化测试的测试类指定特殊的运行器org.junit.runners.Parameterized
  2. 为测试类声明几个变量,分别用于存放期望值和测试所用数据。
  3. 为测试类声明一个使用注解org.junit.runners.Parameterized.Parameters修饰的, 返回值为java.util.Collection的公共静态方法,并在此方法中初始化所有需要测试的参数对。
  4. 为测试类声明一个带有参数的公共构造函数,并在其中为第二个环节中声明的几个变量赋值。
  5. 编写测试方法,使用定义的变量作为参数进行测试。
Read more »

项目驱动——描述了项目的理由和动机

  1. 项目的目标——投资构建产品的理由以及这样做我们希望取得的业务上的好处
  2. 客户、顾客和其他的利益相关者——产品涉及他们的利益或对他们产生影响
  3. 产品的用户——预期的最终用户,以及他们对产品可用性的影响

项目限制条件——加在项目和产品上的约束条件

  1. 需求限制条件——项目的局限性和产品设计的约束条件
  2. 命名标准和定义——项目的词汇表
  3. 相关事实和假定——对产品产生一定影响的外部因素,或开发者所作的假定

功能需求——产品的功能

  1. 工作的范围——针对的业务领域
  2. 产品的范围——定义预期产品的边界,以及它与相邻系统的连接情况
  3. 功能与数据需求——产品必须做的事情以及功能所操作的数据
Read more »

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
alias.s=status
alias.a=!git add . && git status
alias.au=!git add -u . && git status
alias.aa=!git add . && git add -u . && git status
alias.c=commit
alias.cm=commit -m
alias.ca=commit --amend
alias.ac=!git add . && git commit
alias.acm=!git add . && git commit -m
alias.l=log --graph --all --pretty=format:'%C(yellow)%h%C(cyan)%d%Creset %s %C(white)- %an, %ar%Creset'
alias.ll=log --stat --abbrev-commit
alias.lg=log --color --graph --pretty=format:'%C(bold white)%h%Creset -%C(bold green)%d%Creset %s %C(bold green)(%cr)%Creset %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
alias.llg=log --color --graph --pretty=format:'%C(bold white)%H %d%Creset%n%s%n%+b%C(bold blue)%an <%ae>%Creset %C(bold green)%cr (%ci)' --abbrev-commit
alias.last=log --stat --abbrev-commit -1
alias.d=diff
alias.master=checkout master
Read more »

  1. 使用git config设置:

    1
    2
    git config --global core.editor vim     # 全局设置
    git config core.editor vim # 当前项目设置
  2. 使用环境变量GIT_EDITOR

    1
    export GIT_EDITOR=vim

通过使用SSH连接来建立的通道,它被称之为SSH隧道。

本地SSH隧道

1
2
ssh -N -f -L 8080:234.234.234.234:80 123.123.123.123    # 通过SSH服务器(123.123.123.123)将远程机器(234.234.234.234)的80端口映射到本地8080端口
curl -i http://localhost:8080 # 访问本地8080端口相当于访问远程机器(234.234.234.234)的80端口

参数介绍:

  • -N: 不执行远程指令
  • -f: 后台执行ssh指令
  • -L: 做本地端口转发,冒号(:)分隔的三个参数分别是
    • 本地端口号
    • 目标机器IP地址
    • 目标机器端口号
  • 最后一个参数是远程SSH服务器地址

远程SSH隧道

1
2
3
ssh -N -f -C -R 8080:234.234.234.234:80 123.123.123.123      # 将本地的80端口映射到远程服务器(123.123.123.123)的8080端口
# 切换到机器123.123.123.123上
curl -i http://127.0.0.1:8080 # 访问127.0.0.1的8080端口相当于访问机器234.234.234.234的80端口

参数介绍:

  • -N: 不执行远程指令
  • -f: 后台执行ssh指令
  • -C: 压缩请求数据
  • -R: 做远程端口转发,冒号(:)分隔的三个参数分别是:
    • 目标机器端口号
    • 需要映射内部机器的IP地址
    • 本地端口号
  • 最后一个参数是远程SSH服务器地址

Socks代理

1
ssh -qtfnNC -D 0.0.0.0:7070 123.123.123.123  # 通过123.123.123.123建立socks代理,并绑定到0.0.0.0的7070端口上

参数介绍:

  • -q: 静默模式
  • -t: 为远程系统上的ssh进程分配一个伪tty(终端)
  • -f: 后台执行ssh指令
  • -n: 将标准输出重定向到/dev/null
  • -N: 不执行远程指令
  • -C: 压缩请求数据
  • -D: 绑定地址

注意

  • 如果经常发现过一段时间SSH连接自动断开,可能原因是SSH客户端的TCPKeepAlive被关闭了,可以使用参数-o TCPKeepAlive=yes来开启。
  • 自动检查连接,-o ServerAliveInterval=30,表示每30s检查一次连接, -o ServerAliveCountMax=3表示服务器没有响应次数达到3次,则断开连接。

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
def date_range(start_dt, end_dt):
"""
:type start_dt: date | datetime
:type end_dt: date | datetime
:rtype:
"""
start_date = start_dt.strftime('%Y%m%d')
end_date = end_dt.strftime('%Y%m%d')
while start_date <= end_date:
yield start_date
start_dt += timedelta(days=1)
start_date = start_dt.strftime('%Y%m%d')


def month_range(start_dt, end_dt):
"""
:type start_dt: date | datetime
:type end_dt: date | datetime
:rtype:
"""
start_month = start_month2 = start_dt.strftime('%Y%m')
end_month = end_dt.strftime('%Y%m')
while start_month <= end_month:
yield start_month
while start_month == start_month2:
start_dt += timedelta(days=28)
start_month2 = start_dt.strftime('%Y%m')
start_month = start_month2


def year_range(start_dt, end_dt):
"""
:type start_dt: date | datetime
:type end_dt: date | datetime
:rtype:
"""
start_year = start_year2 = start_dt.strftime('%Y')
end_year = end_dt.strftime('%Y')
while start_year <= end_year:
yield start_year
while start_year == start_year2:
start_dt += timedelta(days=365)
start_year2 = start_dt.strftime('%Y')
start_year = start_year2

HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码。 它由RFC2616规范定义的,并得到RFC2518RFC2817RFC2295RFC2774RFC4918等规范扩展。

1xx: 信息

消息 描述
100 Continue 服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求。
101 Switching Protocols 服务器转换协议:服务器将遵从客户的请求转换到另外一种协议。
102 Processing 由WebDAV(RFC2518)扩展的状态码,代表处理将被继续执行。

2xx: 成功

消息 描述
200 OK 请求成功(其后是对GET和POST请求的应答文档。)
201 Created 请求被创建完成,同时新的资源被创建。
202 Accepted 供处理的请求已被接受,但是处理未完成。
203 Non-authoritative Information 文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝。
204 No Content 没有新文档。浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。
205 Reset Content 没有新文档。但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容。
206 Partial Content 客户发送了一个带有Range头的GET请求,服务器完成了它。
207 Multi-Status 由WebDAV(RFC2518)扩展的状态码,代表之后的消息体将是一个XML消息,并且可能依照之前子请求数量的不同,包含一系列独立的响应代码。
Read more »

安装最新稳定内核

首先通过命令uname -r查看当前系统的内核版本号,我的是:

1
3.10.0-123.4.2.el7.x86_64

安装ELRepo仓库:

1
2
sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
sudo rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

安装最新稳定的内核版本:

1
sudo yum --enablerepo=elrepo-kernel install -y kernel-ml

使用命令rpm -qa | grep kernel查看是否安装成功,我的系统显示如下:

1
2
3
4
5
6
kernel-ml-4.16.2-1.el7.elrepo.x86_64
kernel-tools-libs-3.10.0-514.26.2.el7.x86_64
kernel-tools-3.10.0-514.26.2.el7.x86_64
kernel-3.10.0-123.4.2.el7.x86_64
kernel-3.10.0-123.el7.x86_64
kernel-3.10.0-514.26.2.el7.x86_64

可以看到里面的kernel-ml-4.*,证明安装成功。

Read more »