我的创作纪念日:一个特别的纪念日

news2024/11/25 15:26:02

一个特别的纪念日

  • 机缘
  • 收获
  • 日常
  • 成就
  • 憧憬


💡一个热爱分享高性能服务器后台开发知识的博主,目标是通过理论与代码实践的结合,让世界上看似难以掌握的技术变得易于理解与掌握。技能涵盖了多个领域,包括C/C++、Linux、中间件、数据库、云原生、网络协议栈、分布式架构等。
👉
🎖️ CSDN实力新星、CSDN博客专家、华为云云享专家、阿里云专家博主
👉


今天收到CSDN的通知,不知不觉已经加入CSDN成为创作者5年啦。让我来写第一篇记录自己的创作之旅的文章吧。
在这里插入图片描述

机缘

2018年9月6日,那时候是一个刚毕业的小白,我一直对技术深感兴趣,认为它们能够改变世界,以及连接不同的文化和观点。怀着对技术的热爱,加入了CSDN,成为一位创作者,最开始的创作目的是为了记录学习、分享经验,在让自己变得更好的同时帮助他人;同时可以让更加优秀的人发现并指正自己的不足。

我一直热衷于学习新的事物,尤其是技术方面的知识。我希望将所学到的知识与他人分享,帮助他们解决问题,激发他们的创造力,这种愿望驱使我通过文章表达来传播我的经验和见解。

成为创作者的这五年,虽然中间出现过停更,但是基于对创作的热爱、对影响他人的渴望以及对知识分享的执着。这些初心一直激励着我坚持追随创作之路,不断成长和进步。

创作对我来说不仅是一种方式,更是一种生活的意义。它让我能够表达自己、成长、与他人互动,以及发现生活的美丽和深度。

  • 在不断地创作过程中,可以学到如何思考、如何观察、如何解决问题,以及如何不断提高自己的技能和才华。这种学习过程是持续的,让我能够不断进步,不断挑战自己,不断探索新的领域和可能性。
  • 创作提供了与他人互动和分享的机会。通过作品,能够与读者建立联系,传达经验。这种互动不仅能感到帮助的快乐,还可以理解其他人的观点。
  • 创作赋予了我的日常生活更多的色彩和深度,创作不仅是一种兴趣和爱好,更是一种生活方式,它激发了人的激情和动力。

在这里插入图片描述

收获

这五年的创作之旅也让我收获颇大。从最开始的创作小白成为了现在的博客专家
在这里插入图片描述
我不善于运维,也没有太多的时间去做这些,所以目前为止仅有四千多的读者关注,但我相信,创作的文章的影响不仅仅只有四千多,因为总的访问量高达37万+,而最近才上线的代码分享记录也达到了2000+。

此外,不得不说CSDN的电子勋章是非常好看的。
在这里插入图片描述
当然,实体的勋章和证书也少不了。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

日常

创作不仅是一种输出,还是一种输入。通过创作,我不断学习和研究各种主题。这不仅有助于在工作和学术领域中保持竞争力,还让我享受到不断学习的乐趣。现在创作基本成为了生活中的一部分,基本上每周都会写两篇文章,如果时间充裕,甚至是日更一篇。

目前对《C++从零开始到精通》专栏的更新接近了尾声,接下来的一段时间会更多的更新《Linux后台开发技术》专栏。但也会有其他的技术和经验分享。
在这里插入图片描述

成就

最好的一段代码太多了,贴一个最近的实践代码吧,红黑树的C语言实现:

#define KEY_TYPE    int

enum RB_COLOR{RED=0,BLACK};

#if 0
#define RBTREE_ENTRY(name,type)\
    struct name                         \
    {                                   \
        struct _rbtree_node*    left;   \
        struct _rbtree_node*    right;  \
        struct _rbtree_node*    parent; \
        unsigned char           color;  \
    }
    
#endif

typedef struct _rbtree_node
{
    /* data */
    KEY_TYPE                key;
    void*                   value;
    
    struct _rbtree_node*    left;   
    struct _rbtree_node*    right;  
    struct _rbtree_node*    parent; 
    unsigned char           color;  
#if 0
    RBTREE_ENTRY(,_rbtree_node) node;
    // RBTREE_ENTRY(,_rbtree_node) node2;
    // RBTREE_ENTRY(,_rbtree_node) node3;
#endif
    
}rbtree_node;

typedef struct _RedBlackTree
{
    /* data */
    rbtree_node *root;
    rbtree_node *nil;

}RedBlackTree;


static void rbtree_left_rotate(RedBlackTree *T,rbtree_node *x)
{
    rbtree_node *y = x->right;
    // 1
    x->right=y->left;
    if(y->left != T->nil)
        y->left->parent=x;

    // 2
    y->parent=x->parent;
    if(x->parent==T->nil)
        T->root=y;
    else if(x==x->parent->left)
        x->parent->left=y;
    else
        x->parent->right=y;

    // 3
    y->left=x;
    x->parent=y;
    
    
}

static void rbtree_right_rotate(RedBlackTree *T,rbtree_node *y)
{
    rbtree_node *x = y->left;
    // 1
    y->left=x->right;
    if(x->right != T->nil)
        x->right->parent=y;

    // 2
    x->parent=y->parent;
    if(y->parent==T->nil)
        T->root=x;
    else if(y==y->parent->right)
        y->parent->right=x;
    else
        y->parent->left=x;

    // 3
    x->right=y;
    y->parent=x;
    
    
}

void rbtree_insert_fixup(RedBlackTree *T,rbtree_node *z)
{
    // z->color == RED
    while(z->parent->color==RED)
    {
        if(z->parent==z->parent->parent->left)
        {
            // The parent of z is the left subtree of the grandfather
            rbtree_node *y=z->parent->parent->right;
            if(y->color==RED)
            {
                y->color=BLACK;
                z->parent->color=BLACK;
                z->parent->parent->color=RED;

                // You have to make sure Z is red every time you go through it.
                z=z->parent->parent;// z->color == RED
            }
            else
            {
                //This cannot be done in one step, it must be done in the middle:
                // The state with a large number of nodes on the left is easy to rotate.
                
                if(z->parent->right==z)
                {
                    z=z->parent;
                    rbtree_left_rotate(T,z);
                }

                // The number of nodes to the left of the root node is large
                // Especially if you have two red nodes bordering each other.
                // Need to rotate.
                
                // Change the color, and then rotate
                z->parent->color=BLACK;
                z->parent->parent->color=RED;
                rbtree_right_rotate(T,z->parent->parent);
                
            }

        }
        else
        {// The parent of z is the right subtree of the grandfather
            rbtree_node *y=z->parent->parent->left;
            if(y->color==RED)// Uncle node is red
            {
                z->parent->parent->color=RED;
                z->parent->color=BLACK;
                y->color=BLACK;

                z=z->parent->parent;// z->color == RED
            }
            else
            {
                if(z==z->parent->left)
                {
                    z=z->parent;
                    rbtree_right_rotate(T,z);
                }
                z->parent->color=BLACK;
                z->parent->parent->color=RED;
                rbtree_left_rotate(T,z->parent->parent);
            }

        }
    }
    T->root->color=BLACK;
}

void rbtree_insert(RedBlackTree *T,rbtree_node *z)
{
    rbtree_node* pre=T->nil;
    rbtree_node* cur=T->root;
    while(cur!=T->nil)
    {
        pre=cur;
        if(z->key>cur->key)
            cur=cur->right;
        else if(z->key<cur->key)
            cur=cur->left;
        else
            return;
    }
	
	z->parent=pre;
    if(pre==T->nil)
	{
        T->root=z;
	}
    else
    {
        if(pre->key>z->key)
            pre->left=z;
        else
            pre->right=z;
    }
	
    
    z->left=T->nil;
    z->right=T->nil;

    z->color=RED;
	rbtree_insert_fixup(T,z);
}

/**********************红黑树删除 start***************************/
rbtree_node *rbtree_mini(RedBlackTree *T, rbtree_node *x) {
	while (x->left != T->nil) {
		x = x->left;
	}
	return x;
}

rbtree_node *rbtree_maxi(RedBlackTree *T, rbtree_node *x) {
	while (x->right != T->nil) {
		x = x->right;
	}
	return x;
}

rbtree_node *rbtree_successor(RedBlackTree *T, rbtree_node *x)
{
	rbtree_node *y = x->parent;
	if (x->right != T->nil)
	{
		return rbtree_mini(T, x->right);
	}

	
	while ((y != T->nil) && (x == y->right)) {
		x = y;
		y = y->parent;
	}
	return y;
}
//调整
void rbtree_delete_fixup(RedBlackTree *T, rbtree_node *x) {

	while ((x != T->root) && (x->color == BLACK)) {
		if (x == x->parent->left) {

			rbtree_node *w = x->parent->right;
			if (w->color == RED) {
				w->color = BLACK;
				x->parent->color = RED;

				rbtree_left_rotate(T, x->parent);
				w = x->parent->right;
			}

			if ((w->left->color == BLACK) && (w->right->color == BLACK)) {
				w->color = RED;
				x = x->parent;
			}
			else {

				if (w->right->color == BLACK) {
					w->left->color = BLACK;
					w->color = RED;
					rbtree_right_rotate(T, w);
					w = x->parent->right;
				}

				w->color = x->parent->color;
				x->parent->color = BLACK;
				w->right->color = BLACK;
				rbtree_left_rotate(T, x->parent);

				x = T->root;
			}

		}
		else {

			rbtree_node *w = x->parent->left;
			if (w->color == RED) {
				w->color = BLACK;
				x->parent->color = RED;
				rbtree_right_rotate(T, x->parent);
				w = x->parent->left;
			}

			if ((w->left->color == BLACK) && (w->right->color == BLACK)) {
				w->color = RED;
				x = x->parent;
			}
			else {

				if (w->left->color == BLACK) {
					w->right->color = BLACK;
					w->color = RED;
					rbtree_left_rotate(T, w);
					w = x->parent->left;
				}

				w->color = x->parent->color;
				x->parent->color = BLACK;
				w->left->color = BLACK;
				rbtree_right_rotate(T, x->parent);

				x = T->root;
			}

		}
	}

	x->color = BLACK;
}

rbtree_node *rbtree_delete(RedBlackTree *T, rbtree_node *z) 
{
	rbtree_node *y = T->nil;
	rbtree_node *x = T->nil;

	if ((z->left == T->nil) || (z->right == T->nil))
	{
		y = z;
	}
	else
	{
		y=rbtree_successor(T, z);
	}

	if (y->left != T->nil)
		x = y->left;
	else if (y->right != T->nil)
		x = y->right;


	x->parent = y->parent;
	if (y->parent == T->nil)
		T->root = x;
	else if (y == y->parent->left)
		y->parent->left = x;
	else
		y->parent->right = x;


	if (y != z)
	{
		z->key = y->key;
		z->value = y->value;
	}
	// 调整
	if (y->color == BLACK) {
		rbtree_delete_fixup(T, x);
	}

	return y;
}

/**********************红黑树删除 end***************************/

/**********************红黑树查找 start***************************/
rbtree_node *rbtree_search(RedBlackTree *T, KEY_TYPE key) {

	rbtree_node *node = T->root;
	while (node != T->nil) {
		if (key < node->key) {
			node = node->left;
		}
		else if (key > node->key) {
			node = node->right;
		}
		else {
			return node;
		}
	}
	return T->nil;
}
/**********************红黑树查找 end***************************/

在这里插入图片描述

憧憬

目标是通过理论与代码实践的结合,让世界上看似难以掌握的技术变得易于理解与掌握。

  • 坚持每周至少两篇以上,把专栏好好整理一遍。
  • 运营好自己的博客,涨粉到万级,帮助更多的人,认识更多志同道合的有分享精神的朋友。
  • 推出技术视频,让分享更容易被理解。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/977795.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++学习笔记】7、常量

文章目录 【 1、常量的分类 】1.1 整型常量1.2 浮点常量1.3 字符常量1.4 字符串常量1.5 布尔常量 【 2、常量的定义 】2.1 #define 预处理器2.2 const 关键字 常量 是固定值&#xff0c;在程序执行期间不会改变。这些固定的值&#xff0c;又叫做字面量。常量可以是任何的基本数…

网络安全合规-DSMM

DSMM&#xff08;Data Security Management Model&#xff09;是一种数据安全管理模型。该模型以数据为中心&#xff0c;从数据的生命周期入手&#xff0c;从数据发布、使用、共享、存储、删除等几个方面来管理数据安全。 DSMM提供了一些有效的数据安全管理原则和策略&#xf…

ArcGIS Engine10.2 Setup 报错

00 问题重述 当我尝试安装ArcGIS Engine时弹出错误&#xff1a;ArcGIs 10,2 Engine cannot be installed on your machine.ArcGIs 10,2 Engine requires Microsoft ,NET Framework 3.5sp1, Which has not been found on your system, If you want to download and install Mic…

Ubuntu18.04系统下通过moveit控制kinova真实机械臂,并用python脚本到达固定点

测试工作空间&#xff1a;test_ws Kinova机械臂型号&#xff1a;m1n6s300 双臂模型中的左臂 测试功能包为kinova-ros官方包 一、读取kinova机械臂末端执行器位姿及tf小知识 1. tf小知识之获取两个连杆坐标系的位姿关系&#xff0c;非常有用&#xff0c;非常有用&#xff0c;非…

Unity中Shader的变体shader_feature(青莲地心火 o.o )

文章目录 前言一、变体的类型1、multi_compile —— 无论如何都会被编译的变体2、shader_feature —— 通过材质的使用情况来决定是否编译的变体 二、使用 shader_feature 来控制 shader 效果的变化1、首先在属性面板暴露一个开关属性&#xff0c;用于配合shader_feature来控制…

Flask狼书笔记 | 05_数据库

文章目录 5 数据库5.1 数据库的分类5.2 ORM5.3 使用Flask_SQLAlchemy5.4 数据库操作5.5 定义关系5.6 更新数据库表5.7 数据库进阶小结 5 数据库 这一章学习如何在Python中使用DBMS&#xff08;数据库管理系统&#xff09;&#xff0c;来对数据库进行管理和操作。本书使用SQLit…

02JVM_垃圾回收GC

二、垃圾回收GC 在堆里面存放着java的所有对象实例&#xff0c;当对象为“死去”&#xff0c;也就是不再使用的对象&#xff0c;就会进行垃圾回收GC 1.如何判断对象可以回收 1.1引用计数器 介绍 在对象中添加一个引用计数器&#xff0c;当一个对象被其他变量引用时这个对象…

软件架构之前后端分离架构服务器端高并发演进之路

软件架构之前后端分离架构&服务器端高并发演进之路 前后端分离架构服务器端关于不同并发量的演进之路1. 单体架构2. 第一次演进&#xff1a;应用服务器和数据库服务器分开部署3. 第二次演进&#xff1a;引入本地缓存和分部署缓存4. 第三次演进&#xff1a;引入反向代理和负…

SQL语句如何生成PDM文件

首先我们先了解一下什么是PDM 物理数据模型&#xff08;PDM&#xff09;是数据库设计和管理过程中的重要组成部分&#xff0c;具有以下好处&#xff1a; 可视化数据库结构&#xff1a; PDM提供了一个直观的方式来可视化数据库的结构&#xff0c;包括表、列、索引、关系等。这使…

数据结构与算法学习(day4)——解决实际问题

前言 在本章的学习此前&#xff0c;需要复习前三章的内容&#xff0c;每个算法都动手敲一遍解题。宁愿学慢一点&#xff0c;也要对每个算法掌握基本的理解&#xff01; 前面我们学习了简化版桶排序、冒泡排序和快速排序三种算法&#xff0c;今天我们来实践一下前面的三种算法。…

QT连接OpenCV库完成人脸识别

1.相关的配置 1> 该项目所用环境&#xff1a;qt-opensource-windows-x86-mingw491_opengl-5.4.0 2> 配置opencv库路径&#xff1a; 1、在D盘下创建一个opencv的文件夹&#xff0c;用于存放所需材料 2、在opencv的文件夹下创建一个名为&#xff1a;opencv3.4-qt-intall 文…

Android Glide in RecyclerView,only load visible item when page return,Kotlin

Android Glide in RecyclerView&#xff0c;only load visible item when page return&#xff0c;Kotlin base on this article&#xff1a; Android Glide preload RecyclerView切入后台不可见再切换可见只加载当前视野可见区域item图片&#xff0c;Kotlin_zhangphil的博客…

L1和L2正则

L1和L2正则 L1正则常被用来进行特征选择&#xff0c;主要原因在于L1正则化会使得较多的参数为0&#xff0c;从而产生稀疏解&#xff0c;我们可以将0对应的特征遗弃&#xff0c;进而用来选择特征。一定程度上L1正则也可以防止模型过拟合。 L2正则&#xff1a; L1损失函数相比于…

口袋参谋:淘宝卖家如何对订单实现批量标旗?

​插旗在淘宝店铺里是经常能使用到的&#xff0c;如果淘宝卖家订单量太大&#xff0c;一个一个的标旗太过于繁琐&#xff0c;而且容易出错。 那么使用批量插旗工具&#xff0c;则可以大大节省卖家时间&#xff0c;提高工作效率&#xff01; 【批量插旗】功能&#xff1a; 一键…

基于blockqueue的生产和消费模型

线程篇下讲的是基于阻塞队列的生产者消费者模型。在学习这个之前我们先了解一些其他概念&#xff1a; 同步&#xff1a;在保证数据安全的条件下&#xff0c;让线程按某种特定的顺序依次访问临界资源。 通过上一节的代码我们实现了一个多线程抢票的程序&#xff0c;但结果显示…

Pytorch学习:卷积神经网络—nn.Conv2d、nn.MaxPool2d、nn.ReLU、nn.Linear和nn.Dropout

文章目录 1. torch.nn.Conv2d2. torch.nn.MaxPool2d3. torch.nn.ReLU4. torch.nn.Linear5. torch.nn.Dropout 卷积神经网络详解&#xff1a;csdn链接 其中包括对卷积操作中卷积核的计算、填充、步幅以及最大值池化的操作。 1. torch.nn.Conv2d 对由多个输入平面组成的输入信号…

ChatGPT AIGC 完成超炫酷的大屏可视化

大屏可视化一直各大企业进行数据决策的重要可视化方式,接下来我们先来看一下ChatGPT,AIGC人工智能帮我们实现的综合案例大屏可视化效果: 像这样的大屏可视化使用HTML,JS,Echarts就可以来完成,给ChatGPT,AIGC发送指令的同时可以将数据一起发送给ChatGPT。 第一段指令加数…

Direct3D绘制旋转立方体例程

初始化文件见Direct3D的初始化_direct3dcreate9_寂寂寂寂寂蝶丶的博客-CSDN博客 D3DPractice.cpp #include <windows.h> #include "d3dUtility.h" #include <d3dx9math.h>IDirect3DDevice9* Device NULL; IDirect3DVertexBuffer9* VB NULL; IDirect3…

【C语言】入门——结构体

目录 结构体 为什么有结构体&#xff1f; 1.结构体的声明 1.2结构体变量的访问和初始化 2.结构体成员的访问 结构体 struct 结构体类型 {//相关属性; }结构体变量; 结构体和数组不同&#xff0c;同一类型的数据的集合是数组&#xff1b; 结构体是多种类型的数据的集合&…

NSV60600MZ4T1G 双极型晶体管(BJT)学习总结

双极型晶体管的起源: 双极型晶体管是在1947年发明的&#xff0c;第一个晶体管是将两条具有尖锐端点的金属线与锗衬底(germanium substrate)形成点接触(point contact)&#xff0c;以今天的水准来看&#xff0c;此第一个晶体管虽非常简陋但它却改变了整个电子工业及人类的生活方…