工具效率

工具效率

工欲善其事,必先利其器

「工具效率法宝篇」

收录日常开发、测试、运维、办公中提升效率的神器与技巧。善用工具者,事半功倍。


💻 「开发利器」

🛠️ 「IDE 神器」

「Visual Studio Code」
  • VS Code 高效配置指南 —— 快捷键、插件组合、调试技巧
  • 计划:多语言开发环境配置、远程开发最佳实践
  • 计划:代码片段自定义、主题与界面优化
「IntelliJ IDEA」
  • IDEA 高级用法揭秘 —— 重构技巧、代码模板、插件生态
  • 计划:性能调优配置、团队协作设置
  • 计划:数据库工具集成、微服务调试

🔧 「开发辅助」

「Git 时空术」
  • Git 高级工作流 —— 分支策略、后悔药、二分排查
  • 计划:子模块管理、Hooks 自动化、大型仓库优化
「命令行神器」

🧪 「测试宝典」

📡 「API 测试」

「Postman」
  • Postman 自动化测试 —— 集合运行、数据驱动、监控告警
  • 计划:API 文档生成、团队协作、Mock Server
「JMeter」
  • JMeter 性能测试实战 —— 场景设计、分布式测试、结果分析
  • 计划:BeanShell 脚本、自定义插件、CI/CD 集成

🚀 「负载测试」

「LoadRunner」
「性能监控」
  • 计划:APM 工具对比、全链路追踪、性能基线建立

🏗️ 「运维部署」

🔄 「CI/CD 流水线」

「Jenkins」
  • Jenkins 流水线设计 —— Pipeline as Code、多分支流水线
  • 计划:插件开发、集群部署、权限管理
  • 计划:制品库管理、质量门禁设计
「Docker & K8s」
  • 容器化部署大全 —— 镜像优化、编排技巧、故障排查
  • 计划:Service Mesh 集成、监控日志方案

☁️ 「云原生工具」

「基础设施即代码」
  • 计划:Terraform 模块设计、Ansible Playbook 最佳实践
  • 计划:云平台 CLI 工具集、跨云管理方案

🌐 「网页收藏」

📚 「开发资源」

「文档与教程」
「工具网站」
  • 在线工具集锦 —— 编码解码、格式转换、正则测试
  • 计划:图表生成、API 调试、数据可视化

🎨 「设计与灵感」

「UI/UX 资源」
  • 设计工具与资源 —— 配色方案、字体库、原型工具
  • 计划:动效设计、交互模式、设计系统

📝 「办公软件」

📄 「Word 高级技巧」

「长文档排版」
  • Word 论文排版指南 —— 样式管理、目录生成、参考文献
  • 计划:模板设计、批量处理、协作评审
「自动化处理」
  • 计划:VBA 宏编程、邮件合并、表单设计

📊 「Excel 数据处理」

「公式与函数」
  • Excel 函数大全 —— 查找引用、文本处理、数组公式
  • 计划:Power Query 数据清洗、Power Pivot 建模
「数据分析」
  • Excel 图表与透视表 —— 动态图表、数据看板、高级筛选
  • 计划:条件格式高级用法、数据验证技巧

🎯 「PPT 演示艺术」

「设计与动画」
  • PPT 专业设计 —— 版式设计、色彩搭配、动画时序
  • 计划:模板制作、演讲者模式、协作技巧

⚡ 「效率心法」

🧠 「工作流优化」

「时间管理」
  • GTD 实践指南 —— 任务分解、优先级划分、番茄工作法
  • 计划:日历管理、习惯养成、专注技巧
「知识管理」

🔗 「跨工具协作」

「自动化流程」
  • 计划:浏览器自动化、RPA 工具应用、脚本联动
  • 计划:通知集成、数据同步、工作流引擎

工具虽多,适者为佳。此处持续更新实际验证过的高效工具与技巧,去芜存菁。

DeepSeek

实时查看 AI 助手的流式响应

DeepSeek 智能助手

法宝篇

工欲善其事,必先利其器

◀ 返回

创建脚本

创建

创建socket script

录制

  • 截取报文 报文

  • 替换空格和换行替换空格和换行

  • 创建socket ![创建socket](/images/工具效率-测试工具-创建socket.png

  • loadrunner gennerator 中ctrl+r 录制发送报文 生成如下内容

参数化流水号,右健所选内容,命名为seqNum_6 格式为%lu6 提取参数

在Action.c 中添加代码

/*********************************************************************
 * Created by Windows Sockets Recorder
 *
 * Created on: Wed Jun 16 11:06:06
 *********************************************************************/

#include "lrs.h"


Action()
{
   
    int rc=0;

	char *Data, *p,*q;
	int Size;
	char index[2];
	char hexStr[20]={0};
	char strByte[20]={0};
	unsigned char hexByte[20]={0};
	unsigned char *unitptr;
	char rSeqNum[20] = {0};
	int len = 0;
	int i,j,k,ret;
	int z = 0;

 
    //设定开始事务
 
    len = strlen(lr_eval_string("{seqNum_6}"));
  
    p = lr_eval_string("{seqNum_6}") ;
    ret = str2hex(rSeqNum,6,p);
    lr_output_message("str=%s, len = %d",p, ret);
    lr_output_message("str=%s, len = %d",rSeqNum, ret);
    HexStrTobyte(p,hexByte,&len);
    for (i =0;i < len ; i++){
    	lr_output_message("str=%02x,",hexByte[i]);
    }
    q = hexStr;
  
   lr_output_message("str=%s",p);
   len = strlen(p);
   for (j=0; j<len/2 ; j++){
   		memcpy(q,"\\x",2);  
   		memcpy(q+2, p,2);  		
   		p+=2;
   		q+=4;	
   }
   
  lr_output_message("str=%s",hexStr);
  lr_save_string(hexStr,"seqN");
  
 #if 1
    lrs_startup(257);
    //创建socketS
    lr_start_transaction("create_socket");
	//
    rc = lrs_create_socket("socket0", "TCP", "RemoteHost=127.0.0.1:32001",  LrsLastArg);
	//判断套接字创建是否成功
 
	if (rc==0){
	
		lr_end_transaction("create_socket", LR_PASS); 
    	lr_output_message("Socket was successfully send ");
		
	}
	else{
		lr_end_transaction("create_socket", LR_FAIL); 
    	lr_output_message("An error occurred while closing the socket, Error Code: %d", rc);
    	
	}
	//判断socket是否链接成功的事务,0表示创建成功 
	lr_start_transaction("send_socket");   
	//发送安全会话建立请求buf0为在data.ws中定义的发送变量     
	lrs_send("socket0", "buf0", LrsLastArg);
 	//设置连接超时时间为1秒
	lrs_set_recv_timeout(45,0);

	if (rc==0){
	
		lr_end_transaction("send_socket", LR_PASS); 
    	lr_output_message("Socket was successfully send ");
		
	}
	else{
		lr_end_transaction("send_socket", LR_FAIL); 
    	lr_output_message("An error occurred while send the socket, Error Code: %d", rc);
    	
	}
	//设置接收超时时间为1秒
    //lrs_set_recv_timeout2(45,0);
	lr_output_message("Socket was successfully send");

	//接收消息,存放在buf1中,buf1是在data.ws中定义的接收数组,注意数组长度一定要大于等于实际接收长度
    lrs_receive("socket0", "buf1", LrsLastArg); 
    //把Socket最后接收的字节数组,长度放在recvlen中,内容放在recvbuf中
    //lrs_get_last_received_buffer("socket0",&recvbuf,&recvlen);
	
	 lr_start_transaction("received_socket");
	//lrs_save_param("socket0", NULL, "F39", 39, 2);
	//lr_message ("F39: %s", lr_eval_string("{F39}"));
    lrs_get_last_received_buffer("socket0",&Data,&Size);
	//lr_message("报文内容:%s",Data);
	//lr_message("应答码第39位:%x",Data[39]);
	//lr_message("应答码第40位:%x",Data[40]);
		//获取流水号000000
    if(Size == 116){
	
		lr_output_message("接收报文长度 116 == %d", Size);
		lr_end_transaction("received_socket", LR_PASS);
	}else{
		
		lr_output_message("接收报文长度不够116 != %d", Size);
		lr_end_transaction("received_socket", LR_FAIL);
	}

	//memcpy(F39,lr_eval_string("{F39}"),2);
	//lr_output_message("recvbuf: %X",recvbuf);
	 lr_start_transaction("ITMP-9121-A0-33");	
	//获取流水号000000
    //if(Data[32]==0x45&&Data[33]==0x34){
    memcpy(rSeqNum, Data+31,3);
    if(!memcmp(Data+31,hexByte,3)){
    	
		lr_log_message("流水号位:%3.3s",Data+32);
		lr_output_message("交易流水一致");
		lr_end_transaction("ITMP-9121-A0-33", LR_PASS);
	}else{
		lr_log_message("流水号4位:%x",Data[33]);
		lr_output_message("交易流水不一致");
		lr_end_transaction("ITMP-9121-A0-33", LR_FAIL);
	}
	 lr_start_transaction("ITMP-9121-A0");
	
	//获取应答码000000
    if(Data[39]==0x41&&Data[40]==0x30){
		lr_output_message("交易成功");
		lr_end_transaction("ITMP-9121-A0", LR_PASS);
	}else{
		
		lr_output_message("交易失败");
		lr_end_transaction("ITMP-9121-A0", LR_FAIL); 
	}
	//关闭socket
	lrs_close_socket("socket0");
	//lrs_free_buffer(lseqNum);
	#endif
	return 0;
} 
void test_printf5(char *str, int length)
{
    int iii;
    printf("the str is:");
    for (iii = 0; iii < length; iii++)
    {
        printf("%02x ", str[iii]);
    }
    printf("\n");
}
/*str to hex,
字符串转换为16进制
利用snprintf 函数
int snprintf(char* dest_str,size_t size,const char* format,...);
功能:将可变参数以format的格式转换到dest_str中,并可以用%s打印出来。
1、dest_str:目标字符串,即输出字符串
2、size: 转换字符控制长度。
(1) 如果格式化后的字符串长度 < size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符('\0');
(2) 如果格式化后的字符串长度 >= size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串结束符('\0'),返回值为欲写入的字符串长度。
3、format :转换为某个格式,例如:%2d,%04X,%02X。
4、...:需要转换的字符串
*/
int str2hex(char *out_string, int length, char *in_string)
{
    int index;
    char *fmt = "%02x";

    for (index = 0; index < length; index++)
    {
        snprintf((char *)&out_string[index << 1], 3, fmt, in_string[index]);
    }
    return (length << 1);
}


int HexStrTobyte(char *str, unsigned char *out, unsigned int *outlen)
{
    char *p = str;
    char high = 0, low = 0;
    int tmplen = strlen(p), cnt = 0;
    tmplen = strlen(p);
    while (cnt < (tmplen / 2))
    {
        high = ((*p > '9') && ((*p <= 'F') || (*p <= 'f'))) ? *p - 48 - 7 : *p - 48;
        low = (*(++p) > '9' && ((*p <= 'F') || (*p <= 'f'))) ? *(p)-48 - 7 : *(p)-48;
        out[cnt] = ((high & 0x0f) << 4 | (low & 0x0f));
        p++;
        cnt++;
    }
    if (tmplen % 2 != 0)
        out[cnt] = ((*p > '9') && ((*p <= 'F') || (*p <= 'f'))) ? *p - 48 - 7 : *p - 48;

    if (outlen != NULL)
        *outlen = tmplen / 2 + tmplen % 2;
    return tmplen / 2 + tmplen % 2;
}
int byteToHexStr(unsigned char byte_arr[], int arr_len, char *HexStr, int *HexStrLen)
{
    int i, index = 0;
    for (i = 0; i < arr_len; i++)
    {
        char hex1;
        char hex2;
        int value = byte_arr[i];
        int v1 = value / 16;
        int v2 = value % 16;
        if (v1 >= 0 && v1 <= 9)
            hex1 = (char)(48 + v1);
        else
            hex1 = (char)(55 + v1);
        if (v2 >= 0 && v2 <= 9)
            hex2 = (char)(48 + v2);
        else
            hex2 = (char)(55 + v2);
        if (*HexStrLen <= i)
        {
            return -1;
        }
        HexStr[index++] = hex1;
        HexStr[index++] = hex2;
    }
    *HexStrLen = index;
    return 0;
}

◀ 返回