git操作经验谈

一、代码从远程仓库拉取到本地(更新本地代码为最新)

涉及命令:git fetch / git pull

Q:区别?

A:git pull = git fetch + merge to local

使用场景:

1、本地分支aaa无修改,远程仓库分支aaa有修改,需要更新本地代码:

git pull

2、本地分支aaa有一些改动(通过git status查看是否有改动),远程仓库分支aaa有修改,需要更新本地代码:

方案1(推荐):git fetch更新远程分支→git merge(→ 解决冲突后,git merge –continue)

方案2:git stash暂存本地改动→git pull拉取远程分支合并到本地→git stash pop恢复本地改动

(以上操作可能需要合并冲突(命令行提示CONFLICT (content): xxxxxx),请参考下边的冲突处理)

其他场景待补充

二、冲突处理

展现内容:

gaudi:scenario-test (paycashier)$ git merge master
Auto-merging src/main/java/com/caocao/testgroup/scenariotest/component/AbstractTcpClient.java
Auto-merging pom.xml
CONFLICT (content): Merge conflict in pom.xml
Auto-merging conf/33.properties
Automatic merge failed; fix conflicts and then commit the result.
gaudi:scenario-test (paycashier *+|MERGING)$

Q:冲突发生的原因?

A:某文件的第n行内容在本地有改动或提交:local_commit(修改或删除),且合并的分支的提交:origin_commit中也对此行做了改动,并且local_commit和origin_commit不在一条提交链上(没有祖先/子孙关系)。

当合并两个提交时,则这一行被视为有冲突,不能被auto merging。

1、处理方法1–手动编辑:

编辑器打开冲突的文件,通过查找“=====”内容查找到冲突所在行,如下:

<<<<<<<<HEAD

other code

========

your code

>>>>>>>>your branch name

上方是远程分支上的更改内容,下方是本地分支的更改内容,需要你进行内容抉择,决定保存的内容(将<<<<<至>>>>>的内容替换为合并内容)修改完内容后,命令行git merge –continue。

2、处理方法2–IDE编辑:

推荐使用IDEA自带的Resolve Conflict进行可视化的冲突编辑。点击项目根目录,点击右键 → Git → Resolve Conflict,对每一个文件依次双击处理:

处理完毕后,点击Apply→ OK,即可保存此次文件内容。处理好所有文件内容后,命令行git merge –continue

三、推送本地分支到远程仓库分支中(提交本地代码到仓库)

一般来说master分支是禁止直接push的,正确的处理方式是将改动push到自己的分支中,然后在gitlab中提交PR,由他人(例如leader、有经验的团队成员)做code review后同意合并。

当你需要修改代码时可以通过:

git checkout -b dev_xxx_version (即git branch dev_xxx_version; git checkout dev_xxx_version)

进行开发分支的创建(当你已经在master分支上进行改动且未提交时,也可以执行以上操作,切换到新分支)。

进行一系列的commit后,通过

git push origin dev_xxx_version

的方式将自己的开发分支push到远程仓库中

四、自己的开发分支在日常操作时需要注意以下几点:

1、自己的开发分支在代码实现完成,且功能稳定后,要及时提PR,合并到master分支中,避免后续合并出现难以处理的冲突

2、不稳定的开发分支(实现未完成、测试期、BUG较多等)不要合并到master中,要时刻保证master分支的稳定

3、如果master分支有变更,需要定期地将master分支的内容merge到自己的开发分支中,避免①和主干分支的关键配置或者组件脱节严重,造成代码编译或运行出错;②后续合并出现难以处理的冲突

4、推荐的周期操作:git pull origin master, git pull origin 你的开发分支→ master合并到开发分支→ 开发分支上做代码实现、提交、测试→ master合并到开发分支(可选操作,当你开发周期较长时)→ 主流程测试→ push→ 提交PR

性能测试分析

一、场景设计

场景设计需具备以下共同要素:

以下是针对不同测试场景的名词术语说明

1.  单接口基准测试

使用1个用户或者一个线程,不限制tps值,对单一接口进行压测,执行时间为10分钟左右,获取无压力情况下的响应时间与资源使用情况,作为性能基线以及其他场景下的参考依据。基准测试 错误率为 零 , 能说明脚本与数据无任何错误。

(更多…)

研发团队一般架构

众所周知,在一个IT企业中,研发部门是不可或缺的重要部门,而一个研发部门是由很多相关业务部门组成的。对于很多非IT从业者而言,做一个app是很简单的,所以有个经典的段子就叫做,万事俱备,只差一个程序员和一个投资人我们就可以在星辰大海中遨游了。

其实举个例子来说,对于一个app,他涉及到的人员,最少也是需要有以下几个方面(以下排名不分先后):

(更多…)

Jmeter Socket Closed

使用Jmeter Client端压测的时候会报Socket Closed

问题原因:在JMeter下,发送http 请求时,一般都是默认选择了use keepAlive,这个是连接协议,JMeter坑就在这里,默认勾选了这个(如果不勾选的话,也不会保存),但其配置JMeter.properties中的时间设置默认却是注销的,也就是说,不会等待,一旦连接空闲,则立马断开了,导致我们压测中出现了事务失败的情形。

解决:
httpclient4.retrycount=1 (默认被注销)
hc.paramters.file=hc.paramters(默认被注销)
在hc.paramters.file下面添加http.connection.stalecheck$Boolean=true
修改httpclient4.idletimeout=<time in ms>设置成自己觉得合理的时间,一般可设置成10-60s(表示连接空闲10s后才会断开),注意这边单位是ms。

修改完成后再次压测,错误不再有了。

资料查询:https://wiki.apache.org/jmeter/JMeterSocketClosed

11年的时候对于教育的看法

教育这个东西,主要是培养思想的,这在我们国家是有伟大的历史的,大家都知道孔子乃是一代宗师,教育大家。而孔子生活在2500多年前,由此可见,从那个时候开始,教育就已经很有规模了。
大家都知道,我国教育的始祖,或者说是第一个出名的大教育教,就是孔子了,孔子的教育理论影响中国接近2500年,只有在多灾多难的20世纪,它才短暂的消失了一段时间,后来我们的执政者像古代的那帮家伙一样,发现孔子的教育理论有利于统治,于是,孔子就上演了王者归来。
(更多…)

linux常用基础指令

系统信息

cat /proc/cpuinfo 显示CPU info的信息
cat /proc/interrupts 显示中断
cat /proc/meminfo 校验内存使用
cat /proc/swaps 显示哪些swap被使用
cat /proc/version 显示内核的版本
cat /proc/net/dev 显示网络适配器及统计
cat /proc/mounts 显示已加载的文件系统

spci -tv 罗列 PCI 设备
lsusb -tv 显示 USB 设备
date 显示系统日期
cal 2007 显示2007年的日历表
date 041217002007.00 设置日期和时间 – 月日时分年.秒

以上指令一般不常用 了解即可

关机 (系统的关机、重启以及登出 ) 
shutdown -h now 关闭系统(1)
init 0 关闭系统(2)
telinit 0 关闭系统(3)
shutdown -h hours:minutes & 按预定时间关闭系统
shutdown -c 取消按预定时间关闭系统
shutdown -r now 重启(1)
reboot 重启(2)
logout 注销

以上指令一般不常用 了解即可

文件和目录

cd /home 进入 ‘/ home’ 目录’
cd .. 返回上一级目录
cd ../.. 返回上两级目录
cd 进入个人的主目录
cd ~user1 进入个人的主目录
cd – 返回上次所在的目录
pwd 显示工作路径
ls 查看目录中的文件
ls -F 查看目录中的文件
ls -l 显示文件和目录的详细资料
ls -a 显示隐藏文件
ls *[0-9]* 显示包含数字的文件名和目录名
tree 显示文件和目录由根目录开始的树形结构(1)
lstree 显示文件和目录由根目录开始的树形结构(2)
mkdir dir1 创建一个叫做 ‘dir1′ 的目录’
mkdir dir1 dir2 同时创建两个目录
mkdir -p /tmp/dir1/dir2 创建一个目录树
rm -f file1 删除一个叫做 ‘file1′ 的文件’
rmdir dir1 删除一个叫做 ‘dir1′ 的目录’
rm -rf dir1 删除一个叫做 ‘dir1’ 的目录并同时删除其内容
rm -rf dir1 dir2 同时删除两个目录及它们的内容
mv dir1 new_dir 重命名/移动 一个目录
cp file1 file2 复制一个文件
cp dir/* . 复制一个目录下的所有文件到当前工作目录
cp -a /tmp/dir1 . 复制一个目录到当前工作目录
cp -a dir1 dir2 复制一个目录
ln -s file1 lnk1 创建一个指向文件或目录的软链接
ln file1 lnk1 创建一个指向文件或目录的物理链接
touch -t 0712250000 file1 修改一个文件或目录的时间戳 – (YYMMDDhhmm)

cd,pwd,ls三条相关指令是重点了解对象。其他的文件相关操作指令也要使用的非常熟悉

文件搜索
find / -name file1 从 ‘/’ 开始进入根文件系统搜索文件和目录
find / -user user1 搜索属于用户 ‘user1’ 的文件和目录
find /home/user1 -name \*.bin 在目录 ‘/ home/user1′ 中搜索带有’.bin’ 结尾的文件
find /usr/bin -type f -atime +100 搜索在过去100天内未被使用过的执行文件
find /usr/bin -type f -mtime -10 搜索在10天内被创建或者修改过的文件
find / -name \*.rpm -exec chmod 755 ‘{}’ \; 搜索以 ‘.rpm’ 结尾的文件并定义其权限
find / -xdev -name \*.rpm 搜索以 ‘.rpm’ 结尾的文件,忽略光驱、捷盘等可移动设备
locate \*.ps 寻找以 ‘.ps’ 结尾的文件 – 先运行 ‘updatedb’ 命令
whereis halt 显示一个二进制文件、源码或man的位置
which halt 显示一个二进制文件或可执行文件的完整路径

了解即可

查看文件内容
cat file1 从第一个字节开始正向查看文件的内容
tac file1 从最后一行开始反向查看一个文件的内容
more file1 查看一个长文件的内容
less file1 类似于 ‘more’ 命令,但是它允许在文件中和正向操作一样的反向操作
head -2 file1 查看一个文件的前两行
tail -2 file1 查看一个文件的最后两行
tail -f /var/log/messages 实时查看被添加到一个文件中的内容

此处也需要重点了解,尤其是与grep 一起使用,大部分时候我们都要通过日志文件来查看问题,因此掌握对文件内容的筛选非常重要 尤其是tail -f + grep的操作

文本处理 
cat file1 file2 … | command <> file1_in.txt_or_file1_out.txt general syntax for text manipulation using PIPE, STDIN and STDOUT
cat file1 | command( sed, grep, awk, grep, etc…) > result.txt 合并一个文件的详细说明文本,并将简介写入一个新文件中
cat file1 | command( sed, grep, awk, grep, etc…) >> result.txt 合并一个文件的详细说明文本,并将简介写入一个已有的文件中
grep Aug /var/log/messages 在文件 ‘/var/log/messages’中查找关键词”Aug”
grep ^Aug /var/log/messages 在文件 ‘/var/log/messages’中查找以”Aug”开始的词汇
grep [0-9] /var/log/messages 选择 ‘/var/log/messages’ 文件中所有包含数字的行
grep Aug -R /var/log/* 在目录 ‘/var/log’ 及随后的目录中搜索字符串”Aug”
sed ‘s/stringa1/stringa2/g’ example.txt 将example.txt文件中的 “string1” 替换成 “string2”
sed ‘/^$/d’ example.txt 从example.txt文件中删除所有空白行
sed ‘/ *#/d; /^$/d’ example.txt 从example.txt文件中删除所有注释和空白行
echo ‘esempio’ | tr ‘[:lower:]’ ‘[:upper:]’ 合并上下单元格内容
sed -e ‘1d’ result.txt 从文件example.txt 中排除第一行
sed -n ‘/stringa1/p’ 查看只包含词汇 “string1″的行
sed -e ‘s/ *$//’ example.txt 删除每一行最后的空白字符
sed -e ‘s/stringa1//g’ example.txt 从文档中只删除词汇 “string1” 并保留剩余全部
sed -n ‘1,5p;5q’ example.txt 查看从第一行到第5行内容
sed -n ‘5p;5q’ example.txt 查看第5行
sed -e ‘s/00*/0/g’ example.txt 用单个零替换多个零
cat -n file1 标示文件的行数
cat example.txt | awk ‘NR%2==1’ 删除example.txt文件中的所有偶数行
echo a b c | awk ‘{print $1}’ 查看一行第一栏
echo a b c | awk ‘{print $1,$3}’ 查看一行的第一和第三栏
paste file1 file2 合并两个文件或两栏的内容
paste -d ‘+’ file1 file2 合并两个文件或两栏的内容,中间用”+”区分
sort file1 file2 排序两个文件的内容
sort file1 file2 | uniq 取出两个文件的并集(重复的行只保留一份)
sort file1 file2 | uniq -u 删除交集,留下其他的行
sort file1 file2 | uniq -d 取出两个文件的交集(只留下同时存在于两个文件中的文件)
comm -1 file1 file2 比较两个文件的内容只删除 ‘file1’ 所包含的内容
comm -2 file1 file2 比较两个文件的内容只删除 ‘file2’ 所包含的内容
comm -3 file1 file2 比较两个文件的内容只删除两个文件共有的部分

此部分内容稍作了解即可

网络 – (以太网和WIFI无线
ifconfig eth0 显示一个以太网卡的配置
ifup eth0 启用一个 ‘eth0’ 网络设备
ifdown eth0 禁用一个 ‘eth0’ 网络设备
ifconfig eth0 192.168.1.1 netmask 255.255.255.0 控制IP地址

稍作了解即可

app的灰度测试

最近在工作中有个任务是对我司app进行灰度测试。

对于一项任务进行测试,我们首先要对其进行需求的分析。

那么何谓灰度升级?

灰度升级是一种升级时候的平滑切换,当有些服务器的客户端要进行升级,这时就得先升级其中的一个客户端, 作为测试, 以确保升级无误. 也就是说所有服务器不同步更新升级.(例如这次只是广东更新).升级完成后.再升级其他地区的服务器.

简单的来说就是通过给定的条件,对部分用户进行app升级测试。

那么侧重点就有3个

1.给定的条件

2.部分用户

3.升级成功

我们逐步来分析。

首先是给出的条件。比如说,假设有三个条件,那么这三个条件的关系是与关系还是或关系?其次这个条件的边界值如何处理?比如说我们给出的条件是指定配置的城市升级,那么这个城市的checkbox如果是全部未勾选,或者勾选了全部,应该产生何种效果?

其次是部分用户,要看看我们有没有指定升级的数量,比如说我只希望升级1000个用户,那么第1000个之后的客户,即使满足了前文的需求,也不应该升级成功。

最后是升级成功,这个要确保升级成功。且能使用。

反思

本周四,我负责的一个业务模块-财务中心的计算器功能,在上线的时候被我自己发现了一个严重的问题,那就是0*9计算的结果会变成9而不是0.我赶紧把这个异常告诉了项目经理和研发人员,最终在第二天的中午1点左右,终于顺利的让计算器这个功能上线, 而这个是紧急发布,对我司的形象及声誉造成了很大的影响,也害的苏亮加班到大半夜,在此我非常的自责,事情虽然已经过去了两天左右,但是这两天我一直在反思,正所谓前事不忘后事之师,吃一堑长一智,如果不反思的话,那么这次过错,以后肯定还会出现。

首先分析这次事情产生的原因,主要有以下几点

(更多…)