编程人生
文章平均质量分 62
大囚长
大丈夫遗世独立,孑然一身。
展开
-
使用anaconda管理多python版本环境
因此,如果需要一个轻量级的、可定制的Python环境,或者磁盘空间有限,那么Miniconda可能是一个更好的选择。如果需要一个全面的、方便的Python环境,或者不想花时间安装其他的包,那么Anaconda可能是一个更好的选择。原创 2024-03-08 11:46:48 · 532 阅读 · 0 评论 -
代码的陋习
正如食物要腐坏之前,经常会发出一些异味一样, 我们管这些痕迹叫做 “代码异味”。如果一段代码是不稳定或者有一些潜在问题的,那么代码往往会包含一些明显的痕迹。今天让我们一起来熟悉开发中经常出现的22种坏味道情形和解决方法。4.Long Parameter List(过长参数列)原创 2024-01-17 11:52:50 · 818 阅读 · 0 评论 -
当前页面一键回关
CSDN博客关注页面当前页面一键回关所有fans代码。f12打开控制台,输入以下代码。原创 2024-01-15 14:02:54 · 582 阅读 · 0 评论 -
微服务设计的十条参考指南
微服务的内聚性越高,设计模型的可理解性就越强,根据业务流程和场景识别所有实体后,需对实体间进行关系分析,优先识别出生命周期一致的实体进行归类,然后根据实体与聚合根的区别,明确每个聚合根的边界,微服务的最小单元通常是一个聚合根,可根据技术成本来评估并确定一个微服务中包括几个聚合根,但不建议对一个聚合根进行割裂。微服务内部应确保为无状态,即:将有状态信息从微服务中进行剥离,从而单纯的成为一个无状态的计算节点,以便可快速实现动态伸缩的横向扩展能力,同时对应用系统不产生额外的成本投入或代码侵入。转载 2023-02-03 15:21:33 · 175 阅读 · 0 评论 -
SOA(面向服务的架构)
SOA 是面向服务的架构,即企业的 IT 系统是由服务组成的,也即企业的各个应用系统是由许多标准的服务件“组装”起来的,组成应用系统中的各个服务之间是一种非常松耦合的关系。服务基于简单的“问/答”模型——我问你问题,你给我答案,那么对于“我”来说,“你”就是“服务”。但是答案反馈有同步和异步之分,同步就是我问你问题并在线等待你答复,而异步就是我问完你问题就去忙其他事情了,你有了答案之后再通知我。在软件行业,基于这种服务的编程思想最早表现为函数,即把经常用到的代码块定义成一个函数并取一个函数名,再用函数名替换转载 2022-12-07 11:47:43 · 1162 阅读 · 0 评论 -
程序员必备的 40 个 VSCode 扩展
在编写代码时,一个富有成效的工作空间不仅仅是要找到合适的代码编辑器。开箱即用的VS Code是为开发人员制作的。根据2021年StackOverflow的调查,71.06%的受访者将Visual Studio Code作为首选的IDE。使得VS Code如此受欢迎的是市场中可用的扩展程序的数量。有超过30,000个扩展在流通,选择几乎是无限的 - 同时也是压倒性的。根据程序员的时间跟踪工具WakaTime,Visual Studio Code在2020年的开发工作中超过1800万小时。转载 2022-12-02 09:34:15 · 1625 阅读 · 0 评论 -
Rust 所有权
计算机程序必须在运行时管理它们所使用的内存资源。大多数的编程语言都有管理内存的功能:C/C++ 这样的语言主要通过手动方式管理内存,开发者需要手动的申请和释放内存资源。但为了提高开发效率,只要不影响程序功能的实现,许多开发者没有及时释放内存的习惯。所以手动管理内存的方式常常造成资源浪费。Java 语言编写的程序在虚拟机(JVM)中运行,JVM 具备自动回收内存资源的功能。但这种方式常常会降低运行时效率,所以 JVM 会尽可能少的回收资源,这样也会使程序占用较大的内存资源。转载 2022-10-20 15:14:33 · 101 阅读 · 0 评论 -
Rpc 和 gRpc 简介汇总
protocolbuffers是google推出的一种数据序列化格式,简称protobuf。优点支持多种编程语言序列化数据体积小反序列化速度快序列化和反序列化代码自动生成缺点可读性差,缺乏自描述性下图(左JSON,右Protobuf)是同样的一段数据,用json和protobuf分别描述(仅表示描述方式,并不是最终生成的序列化数据)。可以看出,protobuf是把json中的key去掉了,用数字代替key,从而实现了减小了序列化后的数据大小。}...转载 2022-07-29 15:14:30 · 5441 阅读 · 0 评论 -
PE文件结构详解
Windows程序的各种界面称为资源,包括加速键(Accelerator)、位图(Bitmap)、光标(Cursor)、对话框(DialogBox)、图标(Icon)、菜单(Menu)、串表(StringTable)、工具栏(Toolbar)和版本信息(VersionInformation)等。执行PE文件前,加载程序在进行重定位的时候,会用PE文件在内存中的实际映像地址减PE文件所要求的映像地址,根据重定位类型的不同将差值添加到相应的地址数据中。...转载 2022-07-20 11:13:57 · 10526 阅读 · 4 评论 -
Linux ELF 详解1 -- ELF Header
ABI全称ApplicationBinaryInterface,针对不同系统有不同规范,比如i386-ABI对应的是x86系列,x86-64-ABI对应x86-64系列。这个字节很重要,因为不论是数据类型还是ELFHeader的定义,以及后面会讲到的其他信息都是划分为32位和64位的,因此必须根据这个字节来进行不同的解析。我们写的程序,如果要运行,都有一个main方法(C/C++/Java/Python),但这个并非是程序入口,真正的入口是。......转载 2022-07-20 10:32:03 · 488 阅读 · 0 评论 -
Linux内核如何启动并装载一个可执行程序
首先来看一下在C语言程序是如何经过处理变成可执行程序的生成可执行程序的过程C代码(.c)-经过编译器预处理,编译成汇编代码(.asm)-汇编器,生成目标代码(.o)-链接器,链接成可执行文件(.out)-OS将可执行文件加载到内存里执行.EXECUTABLEANDLINKABLEFORMAT可执行的和可链接的格式(是文件格式的标准).o文件和可执行文件,都是目标文件,一般使用相同的文件格式目标文件也叫做ABI,应用程序二进制接口。一个。...转载 2022-07-20 09:58:59 · 882 阅读 · 0 评论 -
ASCII码与16进制转换表
每个ASCII字符转化成16进制是两位的16进制数,同样,把16进制数转化成ASCII时是两位一起转化成一个ASCII字符,然后把他们联结起来。ASCII是针对字符的编码,几乎是键盘上的字符的编码。所以,45的ASCII表示就是4的ASCII表示和5的ASCII表示联结起来的。转换应该是输出的转换,同样是一个数,在计算机内存中表示是一样的,只是输出不一样。关于这张表,主要是键盘上的键值字符在计算机中的。都只是概念上的东西,在计算机中通通是二进制。存储,为了方便,转化成的16进制表示。...转载 2022-07-19 19:44:57 · 23507 阅读 · 0 评论 -
堆栈的区别
_栈是机器系统提供的数据结构,计算机会在底层对栈提供支持(有专门的寄存器存放栈的地址,压栈出栈都有专门的机器指令执行),这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的(可以了解侯捷老师的内存管理的视频,关于malloc/realloc/free函数等)。例如分配一块内存,堆会按照一定的算法,在堆内存中搜索可用的足够大小的空间,如果没有(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。...转载 2022-07-19 14:05:58 · 323 阅读 · 0 评论 -
gdb使用详细介绍
gdb是GNU开源组织发布的一个强大的Linux下的程序调试工具gdb除支持c/c++语言外还支持go、D、object-c、fortran等语言GDB主要帮助你完成下面四个方面的功能启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)当程序被停住时,可以检查此时你的程序中所发生的事。你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。...转载 2022-07-18 13:37:53 · 12338 阅读 · 1 评论 -
PDB 常用命令
远程调试Python程序主要使用logging和PDB进行调试。一方面没有权限安装IPDB,另一方面是没法在本地IDE调试。转载 2022-07-15 16:07:22 · 557 阅读 · 0 评论 -
linux 下core dump文件的生成以及错误定位
这就是为什么我们使用Ctrl+z来挂起一个进程或者Ctrl+C结束一个进程均不会产生coredump,因为前者会向进程发出SIGTSTP信号,该信号的默认操作为暂停进程(StopProcess);实验证明是不能的,那么什么情况会产生呢?包,包含崩溃时的堆栈信息,是一个二进制文件,无法使用记事本打开,一般会在指定目录下生成一个core文件。默认情况下,linux系统是不会生成coredump文件,可以使用命令ulimit-c来查看,如果输出为0则表示不会生成coredump文件。...转载 2022-07-15 15:53:55 · 1895 阅读 · 0 评论 -
汇编语言指令大全
它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.ADD 加法.ADC 带进位加法.INC 加 1.AAA 加法的ASCII码调整.DAA 加法的十进制调整.SUB 减法.SBB 带借位减法.DEC 减 1.NEC 求反(以 0 减之).CMP 比较.(两**作数作减法,仅修改标志位,不回送结果).AAS 减法的ASCII码调整.DAS 减法的十进制调整.MUL 无符号乘法.IMUL 整数乘法.以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),AAM 乘法转载 2022-07-13 14:01:11 · 5669 阅读 · 0 评论 -
GDB或delve调试Go程序查看变量显示<optimized out>解决办法
调试程序代码test.goGDB原创 2022-07-13 12:38:28 · 898 阅读 · 0 评论 -
GDB常用指令
GDB:run,执行程序:next,下一步,不进入函数:step,下一步,会进入函数:breakponit,设置断点:list,查看源码:continue,继续执行到下一断点:backtrace,查看当前调用栈:print,打印查看变量:quit,退出 GDB:查看对象类型:查看所有的断点:查看局部变量:查看函数的参数值及要返回的变量值:堆栈帧信息:查看 goroutines 信息。在使用前 ,需要注意先执行 source /usr/local/go/src/runtime/runtime-gdb.py:查原创 2022-07-13 10:30:43 · 2838 阅读 · 0 评论 -
完整恢复Linux误删数据
完整恢复被删除的Linux数据,包含文件名和目录结构保存文件路径和MD5值模拟删除文件发现误删之后要立即卸载数据盘,防止inode被覆盖,导致无法恢复使用testdisk恢复文件根据MD5文件恢复路径和文件名验证.........原创 2022-06-30 14:57:01 · 2021 阅读 · 0 评论 -
深入虚拟内存(Virtual Memory,VM)
我们应该知道物理内存(Physical Memory)指的是硬件上的内存,即 RAM。它通常指的是插在主板上的内存条,给进程提供临时数据存储的设备。因为 CPU 可以直接从物理内存中读取数据和指令,所以物理内存又叫做主存。虚拟内存(virtual memory,VM)又叫做虚拟存储(virtual storage),是一种内存管理技术。它是操作系统提供的一种对主存的抽象。虚拟内存的实现由操作系统软件和硬件结合完成,包括硬件异常、地址翻译、磁盘文件、内核程序等。本文将深入虚拟内存的实现机制,讨论它是怎么将磁盘转载 2022-06-27 15:35:55 · 1149 阅读 · 0 评论 -
Python导入模块的3种方式(超级详细)
很多初学者经常遇到这样的问题,即自定义 Python 模板后,在其它文件中用 import(或 from…import) 语句引入该文件时,Python 解释器同时如下错误:ModuleNotFoundError: No module named ‘模块名’意思是 Python 找不到这个模块名,这是什么原因导致的呢?要想解决这个问题,读者要先搞清楚 Python 解释器查找模块文件的过程。通常情况下,当使用 import 语句导入模块后,Python 会按照以下顺序查找指定的模块文件:以上所有涉及到的目录转载 2022-06-27 15:27:54 · 4232 阅读 · 0 评论 -
PM2使用
PM2使用pm2是一个进程管理工具,可以用它来管理你的node进程,并查看node进程的状态,当然也支持性能监控,进程守护,负载均衡等功能pm2需要全局安装npm install pm2@latest -g# 更新pm2pm2 update一个简单的app.js测试用示例const http = require('http');const hostname = '0.0.0.0';const port = 3000;const server = http.createServe原创 2022-04-08 17:02:47 · 1288 阅读 · 0 评论 -
警惕VSCode Copilot合规风险
Copilot是第一个基于OpenAI GPT-3的商业应用,目前处于小规模的测试阶段,之前就被人诟病窃取了很多github的源码,无视许可证协议等问题。从https://copilot.github.com/可以得知copilot的工作流程,从中可以看到它上传了你的代码!如果是工作代码,切记不要打开copilot插件!有一定合规风险!...原创 2022-03-10 15:41:50 · 2645 阅读 · 0 评论 -
golang实现p2p之UDP打洞
当今互联网到处存在着一些中间件(MIddleBoxes),如NAT和防火墙,导致两个(不在同一内网)中的客户端无法直接通信。 这些问题即便是到了IPV6时代也会存在,因为即使不需要NAT,但还有其他中间件如防火墙阻挡了链接的建立。 目前部署的中间件多都是在C/S架构上设计的,其中相对隐匿的客户机主动向周知的服务端(拥有静态IP地址和DNS名称)发起链接请求。 大多数中间件实现了一种...转载 2022-01-26 15:22:48 · 2613 阅读 · 3 评论 -
图解开源许可证
转载 2022-01-18 10:53:13 · 149 阅读 · 0 评论 -
python编写游戏修改器
在 Windows 下的修改器主要需要用到四个函数:OpenProcess, CloseHandle, WriteProcessMemory, ReadProcessMemory。这几个都是C++的函数,在Python中可以通过ctypes来直接调用。然后接下来介绍一下基本的操作流程。1.通过 任务管理器 或者其他方式得到需要修改的游戏进程。然后通过 OpenProcess 注入该进程。PROCESS_QUERY_INFORMATION=0x0400PROCESS_VM_OPERATION=0x0转载 2021-12-23 18:57:44 · 3514 阅读 · 4 评论 -
Golang Socket Server自定义协议的简单实现方案
在Server和Client通讯中,由于网络等原因很可能会发生数据丢包的现象。如果数据缺失,服务端接收的信息不完整,就会造成混乱。我们需要在Server和Client之间建立一个通讯协议,通过协议中的规则,判断当前接收到的信息是否完整。根据信息的完整情况,采取不同的处理方式。通讯协议protocol的核心就是设计一个头部。如果传来的信息不包含这个头部,就说明当前信息和之前的信息是同一条。那么就把当前信息和之前的那条信息合并成一条。而协议主要包含的功能是封装(Enpack)和解析(Depack)。Enp转载 2021-12-23 15:22:49 · 873 阅读 · 0 评论 -
游戏里的帧同步机制
游戏同步机制 在多人对战的游戏中,游戏的每一方客户端需要保持每一个时刻大家的数据是一致的,常见的同步方式分为帧同步和状态同步,帧同步服务器不需要知道游戏逻辑,只是将客户端的操作进行转发,然后客户端自己计算逻辑,状态同步是服务器计算游戏逻辑,并将角色状态返回给客户端,客户端直接使用服务器返回的状态即可。常见的RTS,Moba一般是帧同步,mmorpg一般是状态同步。 帧同步的概念 总所周知,游戏是一帧一帧渲染在屏幕上的,我们一般称之为渲染帧,渲染帧是不稳定的,如...转载 2021-12-22 17:20:02 · 3638 阅读 · 0 评论 -
简单的cocos2d客户端和leafserver网游学习验证
客户端向leafserver传输玩家所在位置,废话不多说,上码!#!/usr/bin/python#coding=utf8import socketimport structclient = socket.socket(socket.AF_INET, socket.SOCK_STREAM)client.connect(("127.0.0.1", 3563))msg_data = b'''{"PLAYER_POSITION": {"pos_x": 300.13233, "pos_y":原创 2021-12-20 15:45:31 · 2527 阅读 · 2 评论 -
游戏服务器架构通识
前言这节讲座里,我们将从游戏服务器发展的简单历程出发,鸟瞰一下目前大多数的游戏服务器架构。这里尽可能的避免陷入细节的技术问题,而是从技术进化的结果状态,反推原始问题是什么。希望能通过这个过程,解释清楚游戏服务器是在解决什么问题,痛点到底在哪里。一、早期网游服务器。蛮荒时期的游戏服务器框架我们一笔带过,那时的游戏服务器和一个小Web服务没有区别。蛮荒时代的服务器只负责存储玩家账号、数据、转发场景内其他玩家的行为。很多移动、使用技能等关键逻辑在服务器上根本没有。随意就能用变速齿轮改变游戏速度。从《传奇》的时代开转载 2021-12-16 10:27:32 · 3270 阅读 · 0 评论 -
python2.7安装gcs python sdk操作google storage
全网找一圈都没有正确姿势,只能自己动手丰衣足食了google-cloud-storage模块已经不支持python2了,很多依赖模块安装甚至会报错,以下总结了python2.7如何正确安装google-cloud-storage模块按照以下顺序安装,使用txt文件和pip install -r 的方式无效pip install cffi==1.13.0pip install google-crc32c==1.0.0pip install google-resumable-media==0.5..原创 2021-12-06 09:55:56 · 880 阅读 · 0 评论 -
网络编程十宗罪
文章目录 1、TCP没考虑粘包分包2、UDP没考虑丢包3、长连接没考虑应用层心跳4、大数据没考虑分片和流量控制5、客户端没考虑断线重连6、外网没考虑加密通信7、没有处理SIGPIPE8、大小端字节序问题9、多线程发送乱序问题10、串包问题 1、TCP没考虑粘包分包 ...转载 2021-11-16 10:38:11 · 453 阅读 · 0 评论 -
LDAP概念和原理介绍
LDAP概念和原理介绍相信对于许多的朋友来说,可能听说过LDAP,但是实际中对LDAP的了解和具体的原理可能还比较模糊,今天就从“什么是LDAP”、“LDAP的主要产品”、“LDAP的基本模型”、“LDAP的使用案例”四个方面来做一个介绍。我们在开始介绍之前先来看几个问题:1. 我们日常的办公系统是不是有多个?2. 每个系统之间是不是都有独立的账号密码?3. 密码多了,有时候半天想不起来哪个密码对应哪个系统?4. 每次新项目的开发,都需要重.转载 2021-10-22 14:32:55 · 348 阅读 · 0 评论 -
git恢复被删除并提交得文件
查看git log --diff-filter=D --summary恢复git checkout $commit~1 path/to/file.ext$commit为上回提交的id例如git checkout 0ca928603699bdd1335ac9727b250993ad31321d~1 ./filelist.txt另外中文显示问题git config --global core.quotepath false...原创 2021-08-31 16:46:16 · 467 阅读 · 0 评论 -
jinja2语法
本文只是官方文档的部分摘录,只记录了常用语法,和python非常类似,方便快速理解使用语法{% ... %} for Statements{{ ... }} for Expressions to print to the template output{# ... #} for Comments not included in the template output# ... ## for Line Statements获得属性{{ foo.bar }}{{ foo['bar'] }}转载 2021-08-19 15:04:09 · 361 阅读 · 0 评论 -
企业微信应用类
用于发送消息,图片和文件#!/usr/bin/python# -*- coding: UTF-8 -*-# python3import _locale_locale._getdefaultlocale = (lambda *args: ['zh_CN', 'utf8'])# python2# import sys# reload(sys)# sys.setdefaultencoding('utf8')import jsonimport timeimport requests.原创 2021-07-20 17:58:57 · 241 阅读 · 0 评论 -
python一句话对dict排序
1.按key排序#最简单的方法,这个是按照key值排序:def sortedDictValues1(adict):items = adict.items()items.sort()return [value for key, value in items]#又一个按照key值排序,貌似比上一个速度要快点def sortedDictValues2(adict):keys = adict.keys()keys.sort()return [dict[key] for key in keys]原创 2021-07-06 11:31:06 · 145 阅读 · 0 评论 -
vscode使用正则表达式和变量批量替换不同内容
有如下几行文本,替换为python3标准语法print "aaaaaaaaaaa"print "bbbbbbbbb"print "cccccccccccccc"print "ddewefqwedw"ctrl+h批量替换,点击正则(print )(.*)print($2)原创 2021-06-21 17:03:16 · 1798 阅读 · 0 评论 -
base64 gzip配合加密解密
加密:def encode_info(info): import base64 import gzip from cStringIO import StringIO puredata = info buf=StringIO() f=gzip.GzipFile(mode="wb", fileobj=buf) f.write(puredata) f.close() info = buf.getvalue() info = base原创 2021-06-21 11:18:54 · 702 阅读 · 0 评论