git 添加 .gitignore 规则无效
正常情况
如果在项目开始的时候配置了.gitignore文件,对一些文件进行忽略。
进行版本控制的时候就会忽略对这些文件的跟踪,这是正常情况。
特殊情况
但是有一种情况是,项目开始的时候 没有将一些无关文件配置进 .gitignore里面。导致文件已经进行跟踪了,但是目前想把这些文件add 到 .gitignore文件中,但是发现没有效果。 修改文件之后,Git 依然检测到了,文件改动。
规则
原来git有一条规则,“如果一个文件一开始没有添加到.gitignore里面,中途添加进去。git 将不会 忽略这个文件。”在这种情况下,必须使用 git rm --cached < file name > 这个命令 来 移除对这个文件的跟踪,然后将 这个不想被跟踪的文件 添加到 .gitignore文件里面 就可以了。
这时 做完这些工作之后 你还必须 再 commit 一次,这次commit之后 ,文件就可以被忽略了。
nginx 根据路由匹配和请求参数配置 301 重定向
nginx 重定向常用两个配置 rewrite 与 return 。
rewrite 命令
使用方法:
rewrite 正则表达式 替换目标 flag标记
flag标记可以用以下几种格式:
last – 停止处理后续rewrite指令集,跳出location作用域,并开始搜索与更改后的URI相匹配的location,URL地址不变
break – 停止处理后续rewrite指令集,不会跳出location作用域,不再进行重新查找,终止匹配,URL地址不变
redirect – 返回302临时重定向,浏览器地址栏会显示跳转后的URL地址,爬虫不会更新URL
permanent – 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址,爬虫会更新URL
示例:
if ($http_host = www.test.com) {
rewrite (.*) http://test.com$1;
}
return 命令
return是rewrite模块里的执行,执行阶段是rewrtie,可以写在 server、location、if 里面。
使用方法:
return code [text];
return code URL;
return URL; # 不带返回码,默认返回302临时重定向
示例:
if ($http_host = www.test.com) {
return 301 http://test.com$args;
}
实际应用场景
需求1:
需要将原有 v1 路径重定向到 v2 去,比如 http://127.0.0.1/v1/details/134 重定向到 http://127.0.0.1/v2/details/123
nginx 配置
server {
listen 80;
# 重定向配置
location ~* /v1/details/(.+) {
return 301 /v2/details/$1;
}
}
需求2:
由于历史原因,还有如下路径 http://127.0.0.1/page/l/?s=11&c=22&id=134 也需要重定向到 http://127.0.0.1/v2/details/134
从路径来看,以上 /page/p/ 是公用路径,通过参数不同来实现页面,跟很多的 MVC 框架控制路由思路大致一样。
所以这儿不能使用路由来匹配了,需要通过请求参数来重定向,配置如下:
server {
listen 80;
# 重定向配置
location ~* /v1/details/(.+) {
return 301 /v2/details/$1;
}
location ^~ /page/p/ {
set $flag 0;
if ($arg_c = 22) { # 表示请求参数 c === 22 时候,设置 flag 为 *1
set $flag "${flag}1";
}
if ($arg_s = 11) { # 表示请求参数 s === 11 时候,设置 flag 为 *2
set $flag "${flag}2";
}
if ($flag = "012") {
return 301 /v2/details/$arg_id; # 如果以上两个 if 全部命中,则地址重定向
}
}
}
添加以上配置,重启 nginx 之后,即可开启对应地址的 `301 重定向。
Shell实用案例:批量生成随机字符文件名
当我们需要在批量处理文件时,有时候需要为每个文件生成唯一的随机字符文件名。这种情况下,我们可以使用Shell脚本来批量生成随机字符文件名。下面是一个实用的Shell脚本案例,用于生成随机字符文件名。
#!/bin/bash
# 指定生成文件名的数量
num_files=10
# 指定生成文件名的长度
filename_length=8
# 生成随机字符文件名函数
generate_random_filename() {
cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w $filename_length | head -n 1
}
# 创建文件并重命名
for ((i=1; i<=$num_files; i++))
do
random_filename=$(generate_random_filename)
touch "file$i.txt"
mv "file$i.txt" "$random_filename.txt"
echo "Generated file: $random_filename.txt"
done
上述脚本使用/dev/urandom设备读取随机数据,并通过tr命令过滤和截取所需的字符范围。然后,使用fold命令将字符分为指定长度的行,并使用head命令选择第一行作为随机字符文件名。脚本使用循环来生成指定数量的文件,并使用touch命令创建文件,然后使用mv命令将文件重命名为生成的随机字符文件名。
你可以在命令行中执行该脚本,或将其保存为一个扩展名为.sh的文件,然后通过bash或./来执行脚本。执行脚本后,它将生成指定数量的随机字符文件名,并在输出中显示生成的文件名。
这个实用的Shell脚本案例可以帮助你在批量处理文件时生成随机字符文件名,提供了一种简单而高效的方式来处理这种需求。你可以根据自己的需求和场景进行修改和定制。
Vim快捷键整理
作为一名后端码农,常用的 vim 快捷键,你了解多少呢?

移动光标
1、 左移h,右移l,下移j,上移k
2、 向下翻页Ctrl + f,向上翻页Ctrl + b
3、 向下翻半页Ctrl + d,向上翻半页Ctrl + u
4、 移动到行尾$,移动到行首0(数字),移动到行首第一个字符处^
5、 移动光标到下一个句子),移动光标到上一个句子(
6、 移动到段首{,移动到段尾}
7、 移动到下一个词w,移动到上一个词b
8、 移动到文档开始gg,移动到文档结束G
9、 移动到匹配的{}、()、[]处%
10、 跳到第n行ngg或nG或:n
11、 移动光标到屏幕顶端H,移动到屏幕中间M,移动到底部L
12、 读取当前字符,并移动到本屏幕内下一次出现的地方*
13、 读取当前字符,并移动到本屏幕内上一次出现的地方#
查找替换
1、 光标向后查找关键字#或者g#
2、 光标向前查找关键字*或者g*
3、 当前行查找字符fx/Fx/tx/Tx
4、 基本替换:s/s1/s2(将下一个s1替换为s2)
5、 全部替换:%s/s1/s2
6、 只替换当前行 :s/s1/s2/g
7、 替换某些行 :n1,n2 s/s1/s2/g
8、 搜索模式为/string,搜索下一处为n,搜索上一处为N
9、 指定书签mx,但是看不到书签标记,而且只能用小写字母
10、 移动到某标签处x
11、 移动到上次编辑文件的位置 .
. 代表一个任意字符
* 代表一个或多个字符的重复
编辑操作
1、 光标后插入a,行尾插入A
2、 后插一行插入o,前插一行插入O
3、 删除字符插入s,删除整行插入S
4、 光标前插入i,行首插入I
5、 删除一行dd,删除后进入插入模式cc或者S
6、 删除一个单词dw,删除一个单词进入插入模式cw
7、 删除一个字符x或者dl,删除一个字符进入插入模式s或者cl
8、 粘贴p,交换两个字符xp,交换两行ddp
9、 复制y,复制一行yy
10、 撤销u,重做Ctrl + r,重复上一次命令.
11、 智能提示Ctrl + n或者Ctrl + p
12、 删除motion跨过的字符,删除并进入插入模式c{motion}
13、 删除到下一个字符跨过的字符,删除并进入插入模式,不包括x字符ctx
14、 删除当前字符到下一个字符处的所有字符,并进入插入模式,包括x字符cfx
15、 删除motion跨过的字符,删除但不进入插入模式d{motion}
16、 删除motion跨过的字符,删除但不进入插入模式,不包括x字符dtx
17、 删除当前字符到下一个字符处的所有字符,包括x字符dfx
18、 如果只是复制的情况时,将12-17条中的c或d改为y
19、 删除到行尾可以使用D或C
20、 拷贝当前行yy或者Y
21、 删除当前字符x
22、 粘贴p
23、 可以使用多重剪贴板,查看状态使用:reg,使用剪贴板使用",例如复制到w寄存器,"wyy或者使用可视模式v"wy
24、 重复执行上一个操作使用.
25、 使用数字可以跨过n个区域,如y3x,会拷贝光标到第三个x之间的区域,3j向下移动3行
26、 在编写代码的时候可以使用]p粘贴,这样可以自动进行代码缩进
27、 >>缩进所有选择的代码
28、 <<反缩进所有选择的代码
29、 gd移动到光标所处的函数或变量的定义处
30、 K在man里搜索光标所在的词
31、 合并两行J
32、 若不想保存文件,而重新打开:e!
33、 若想打开新文件:e filename,然后使用Ctrl + ^进行文件切换
窗口操作
1、 分割一个窗口:使用命令split或者:vsplit,可以在水平或垂直方向上分割窗口。
2、 创建一个窗口:使用命令new或者:vnew,可以创建一个新的空白窗口。
3、 在新窗口打开文件:使用命令sf {filename},可以在新窗口中打开指定的文件。
4、 关闭当前窗口:使用命令close,可以关闭当前的活动窗口。
5、 仅保留当前窗口:使用命令only,可以关闭除了当前窗口之外的所有其他窗口,只保留当前窗口。
6、 切换到左边窗口:使用组合键Ctrl + w, h,可以切换到左边的窗口。
7、 切换到右边窗口:使用组合键Ctrl + w, l,可以切换到右边的窗口。
8、 切换到上边窗口:使用组合键Ctrl + w, k,可以切换到上边的窗口。
9、 切换到下边窗口:使用组合键Ctrl + w, j,可以切换到下边的窗口。
10、 切换到顶部窗口:使用组合键Ctrl + w, t,可以切换到最上方的窗口。
11、 切换到底部窗口:使用组合键Ctrl + w, b,可以切换到最下方的窗口。
宏操作
1、开始记录宏操作q[a-z],按q结束,保存操作到寄存器[a-z]中
2、@[a-z]执行寄存器[a-z]中的操作
3、@@执行最近一次记录的宏操作
可视操作
1、进入块可视模式ctrl + v
2、进入字符可视模式v
3、进入行可视模式V
4、删除选定的块d
5、删除选定的块然后进入插入模式c
6、在选中的块同是插入相同的字符I<String>ESC
跳到声明
1、[[:向前跳到顶格的第一个{。
2、[]:向前跳到顶格的第一个}。
3、]]:向后跳到顶格的第一个{。
4、][:向后跳到顶格的第一个}。
5、[{:跳到当前代码块的开头。
6、]}:跳到当前代码块的结尾。
挂起操作
1、挂起 Vim:使用组合键 Ctrl + z 或者执行命令 :suspend,可以将 Vim 挂起,返回到终端或 shell。
2、查看任务:在 shell 中输入命令 jobs,可以查看当前正在运行或挂起的任务。
3、恢复任务:使用命令 fg [job number] 将后台程序放到前台运行,或者使用命令 bg [job number] 将前台程序放到后台运行。
4、执行 shell 命令:使用命令 :!command,可以在 Vim 中执行 shell 命令,command 是要执行的命令。
5、开启 shell:使用命令 :shell,可以在 Vim 中开启一个新的 shell,可以在其中执行其他命令。要退出该 shell,可以输入 exit。
6、保存 Vim 状态:使用命令 :mksession name.vim,可以将当前 Vim 状态保存到名为 name.vim 的会话文件中。
7、恢复 Vim 状态:使用命令 :source name.vim,可以从会话文件 name.vim 中恢复 Vim 的状态。
8、启动 Vim 时恢复状态:使用命令 vim -S name.vim,可以启动 Vim 并从会话文件 name.vim 中恢复状态。
来一张键位图,好好学习。

PHP 判断二进制文件的格式
最简单的方法就是判断文件后缀名,但是问题是如果修改了文件后缀名呢?
那么现在从外部文件名的后缀无法判断文件的格式,那么就从内部查找;
不同格式的文件结构 中都会有规定的标识,也是一种文件结构协议!
- 每个二进制文件的头两个字节作为文件标识;
- 每个二进制文件中都存在不同的标识符(具体未统计);
//从文件内部判断类型 取每个文件的前两个字节
$filename = "./1.png";
$file = fopen($filename, "rb");
$bin = fread($file, 2); //只读2字节
fclose($file);
// unpack() 函数从二进制字符串对数据进行解包。
$strInfo = @unpack("C2", $bin);
$typeCode = "$strInfo[1]"."$strInfo[2]";
$fileType = '';
switch ($typeCode)
{
case 7790:
$fileType = 'exe';
break;
case 7784:
$fileType = 'midi';
break;
case 8297:
$fileType = 'rar';
break;
case 255216:
$fileType = 'jpg';
break;
case 7173:
$fileType = 'gif';
break;
case 6677:
$fileType = 'bmp';
break;
case 13780:
$fileType = 'png';
break;
default:
echo 'unknown';
}
echo 'this is a(an) '.$fileType.' file:'.$typeCode;
EXIT;