- 博客(18)
- 收藏
- 关注
原创 数字图像处理(图像增强)——拉普拉斯算子
二阶微分与微积分中定义的微分略有不同,数字图像中处理的是离散的值,因此对于一维函数的一阶微分的基本定义是差值: ∂f∂x=f(x+1)−f(x)∂f∂x=f(x+1)−f(x) \frac{\partial f}{\partial x} = f(x+1) - f(x) 类似的,二阶微分定义为: ∂2f∂x2=f(x+1)+f(x−1)−2f(x)∂2f∂x2=f(x+1)+f(x−1)...
2018-07-09 12:11:26 17699 3
原创 从零开始的Socket编程 零
介绍Socket的概念,了解Socket是什么以及Socket被设计出来是为了做什么的;然后介绍Socket的原理
2022-11-05 15:29:40 527
原创 《软件设计的哲学》读后感
引言在知乎上看到有人推荐《软件设计的哲学》,遂找来读了。或许是由于个人水平有限,虽然感觉确实不错,但是却没有推荐的那么好。复杂度书中的核心观点认为软件开发的关键在于控制复杂度,以便后续的维护和扩展功能。类似的观点在《代码大全》中也有看到过——《代码大全》提到,管理软件实质上是管理复杂度。《软件设计的哲学》认为,复杂度会导致:修改放大、增加认知负荷和“未知的未知”,这三种现象最终导致了软件的难以维护。而软件的复杂度不是一下子就变得很复杂的,而是在开发的过程中不断积累,最终导致整个软件变得越来越复杂,
2022-05-16 23:06:30 332
原创 Go的声明语法
Go的声明语法引言Go的声明语法与C家族的声明语法不同,在Go’s Declaration Syntax中解释了为什么Go要选择这种与众不同的语法。本文为该文的翻译,个人水平有限,权做参考,如有错误,欢迎指出C 语法先来看看C语言的语法。C语言采用了一种不寻常但是巧妙地声明语法——不是用特殊语法描述类型,而是编写一个包含要声明的项的表达式,并声明该表达式的类型。如:int x;将x声明为int类型:表达式x的类型是int。一般来说,要声明一个新变量的类型,需要写一个包含该变量的表达式,该表达式
2021-10-24 12:00:38 165
原创 uuid与自增id的区别与使用
最近在使用数据库要建表选择主键的时候,突然想到经常使用的两类主键id——自增id和UUID有什么区别,用那种更好?之前使用MySql的时候通常直接就选择了自增id了,工作的时候也看到有些项目使用UUID做主键,但是都没怎么考虑两者的区别,优缺点之类的。现在要键新表选择主键的时候,就需要考虑选择哪种做主键了,因此就有了这篇文章本文首先分别简单为什么数据库需要主键,然后介绍自增id和UUID,接着比较两者的区别,最后给出何时使用哪种类型做主键更好。关系型数据库中的主键在关系型数据库模型中,关系型数据库是一
2021-10-10 17:50:49 7557
原创 C++解析multipart/form-data
背景使用boost.beast实现简单的HTTP服务,但是boost.beast没有提供对表单数据的解析,为此需要自己实现解析表单数据。application/x-www-form-urlencoded的格式与URL的查询字符串格式一样,只是会被URL编码,比较容易处理但multipart/form-data相对而言比较复杂multipart/form-datamultipart/form-data主要是为了解决application/x-www-form-urlencoded编码格式在传输大量二
2021-08-03 15:01:22 6821 13
原创 基于mongocxx实现对MongoDB存储的文件的随机读取
背景最近所开发的项目使用MongoDB的GridFS保存文件,且文件大部分均大于500M,在程序运行过程中需要读取文件数据进行处理。但是MongoDB提供的mongocxx只能将整个文件下载下来或者暂时保存在内存中。每次处理数据都需要下载到本地是比较耗时的,且每次处理完还需要删除临时文件。GridFS是将一个大文件分成多个chunk进行保存的,因此考虑每次进下载文件的一个chunk到内存中。总体设计为了对读取MongoDB中的文件与读取本地文件的接口统一起来,增加了一个抽象基类,对本地文件的读取也通
2021-08-03 08:55:47 429
原创 C++ const的使用
摘要在C++中,const可以用在很多的场合,本文尝试说明const常用的几种场景,并解释为什么要这样使用。const的含义在进行讨论之前,先说明const是个什么东西。const其实是一个语义约束,告诉编译器和其他程序员某值应该保持不变。在程序编译的过程中该约束由编译器保证,如果违反了const约束,编译报错。函数形参数列表最常使用const的大概就是在函数的参数列表了吧,如:int max(const int a, const int b);通常应该将函数的参数声明为const,告诉编
2021-03-28 21:15:22 540
原创 C++编程注意事项——构造函数
C++ 编程注意事项 —— 构造函数摘要构造函数使用explicit阻止隐式类型转换区分拷贝构造函数和赋值运算符的不同使用引用传递,避免值传递构造函数对于自定义的类型,使用explicit阻止执行隐式类型初始化对于用户自定义的类型,初始化由构造函数执行。将构造函数声明为explicit可以阻止隐式类型转换。被声明为explicit的构造函数通常比non-explicit的构造函数更好,除非有充分的理由,否则所有的构造函数都应该声明为explicit在显式类型转换使得程序员真的知道自己在做什么
2021-03-13 22:58:01 207 1
原创 SQL Server分页查询优化
在SQL Server上进行分页查询时,通常是使用offset-fetch实现select * from table_name order by keys offset begin_index rows fetch next counts rows only当然也可以使用Top或者RowNum实现分页查询,但这里讨论的主要的是使用offset-fetch进行分页的情况。一般来说,orde...
2019-12-07 22:56:18 1283
原创 C++实现ANSI编码转换为UTF-8编码格式文件
文章结构:本文的先介绍了常见的几种编码格式:ANSI,Unicode,UTF-8,在进行编码转换之前,需要先判断文件的编码格式,在编码转换完成之后,需要将文件保存为UTF-8编码格式的文件。文本文件编码格式介绍在计算机内部,所有的数据都是以二进制的形式存储的。在存储文本时,需要把文本信息转换为二进制进行保存,而在显示时则需要把二进制转换为文本信息显示出来。编码就是二进制与显示的字符之间转行的规...
2019-08-10 14:47:36 6361
原创 基数排序(C++实现)
基本思想基数排序(radix sort)又称桶排序(bucket sort)。主要用于整数的排序。通过提取整数的各个位的 值,将其存放到对应的桶中,再将各个桶按照顺序,将桶里面的值依次提取出来。进行多次循环,单次循环后数据还是处于无序状态,但是当最后依次循环完成时,数据是有序的。步骤得到要统计的数据中最大数的位数,作为循环的次数i从要排序的数据中取出一个数据提取出该值的当前位的值,将其...
2019-05-30 23:31:37 1156
原创 C++ 模板函数 二分查找
C++ 模板函数 二分查找简单二分查找使用模板函数实现二分查找接收函数指针作为比较函数进一步优化简单二分查找二分查找也称对半查找,是一种很常用的,高效率的搜索算法,时间复杂度为O(log N)。该算法假定要查找的数据已经升序排序完毕。算法的思路比较简单,在这里主要是作为一个C++模板函数的一次练习。下面是百度百科上对二分查找查找过程的介绍,忘记了的同学可以看看。首先,假设表...
2018-12-30 21:49:54 3745
原创 PHP system 调用外部程序并传递参数
PHP system() 调用外部程序并传递参数使用PHP的时候,需要调用已有的程序作为项目的一部分,因为已经存在程序,所以直接使用system()函数是最直接的想法。system的详细说明可以查看PHP手册的system注意事项使用system()函数调用外部程序时,当需要传递参数时,要注意书写的格式。当不需要要传递参数时,可以直接写成:$cmd = "path\...
2018-04-29 23:10:55 3925 1
原创 C++ lambda表达式
C++ lambda表达式C++11引入了lambda表达式,主要用来解决调用函数时需要传入一个可调用对象的情况。因为很多情况下,传入的函数只用一次,如果特地去声明一个函数,但是后面没有再次调用,此时的函数就失去了重用性。同时,有的函数接收的可调用对象只能接受含有一个参数的可调用对象,此时用lambda表达式可以很好的处理这种情况语法[捕获列表](参数列表)->返回类型{...
2018-04-15 22:05:11 418
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人