自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(49)
  • 资源 (1)
  • 收藏
  • 关注

原创 GO编程模式学习笔记:MAP-REDUCE

GO编程模式学习笔记系列为学习陈皓的GO编程模式系列文章记录与心得。原文链接:GO编程模式:MAP-REDUCEMapfunc MapStrToStr(arr []string, fn func(s string) string) []string { var newArray = []string{} for _, it := range arr { newArray = append(newArray, fn(it)) } return newArr

2021-06-19 15:49:02 289

原创 GO编程模式学习笔记:修饰器

GO编程模式学习笔记系列为学习陈皓的GO编程模式系列文章记录与心得。原文链接:GO编程模式:修饰器修饰器模式在函数变成第一公民以后,就从以前的继承结构演变成了函数嵌套,也就是函数式编程形式。一个简单的修饰器模式如下:package mainimport "fmt"func decorator(f func(s string)) func(s string) { return func(s string) { fmt.Println("Started") f

2021-06-11 10:26:53 258 2

原创 GO编程模式学习笔记:切片,接口,时间和性能

GO编程模式学习笔记系列为学习陈皓的GO编程模式系列文章记录与心得。原文链接:GO编程模式:切片,接口,时间和性能1. Full Slice Expressionslice会共享底层数组,而append会在cap不足的时候扩容,所以共享底层数组的两个slice,在经过一次append之后,不一定还是否共享。不能依赖这个特性写代码。但是有一种方式可以强制append之后不共享内存:dir1 := path[:sepIndex:sepIndex]这个叫做Full Slice Expression,

2021-06-09 22:27:11 266

原创 GO 编程模式学习笔记:错误处理

GO编程模式学习笔记系列为学习陈皓的GO编程模式系列文章记录与心得。原文链接:GO 编程模式:错误处理将错误类型当作区分错误的原因,类型相当于原来的错误码。if err != nil { switch err.(type) { case *json.SyntaxError: ... case *ZeroDivisionError: ... case *NullPointerError: ... default: .

2021-06-06 07:54:44 184

原创 GO 编程模式学习笔记——GO GENERATION

GO编程模式学习笔记系列为学习陈皓的GO编程模式系列文章记录与心得。原文链接:GO 编程模式:GO GENERATIONGo语言代码生成主要还是用来解决编程泛型的问题。Go语言的类型检查有两种技术,一种是 Type Assert,一种是Reflection。反射实现一个支持任何类型的slice(但是必须是同一类型,这也符合范型定义)type Container struct { s reflect.Value}func NewContainer(t reflect.Type, size

2021-06-04 09:59:07 279

原创 GO编程模式学习笔记——FUNCTIONAL OPTION

GO编程模式学习笔记系列为学习陈皓的GO编程模式系列文章记录与心得。原文链接:GO 编程模式:FUNCTIONAL OPTIONS首先FUNCTIONAL OPTIONS只是一种模式,并不是必须的,个人感觉和替代者比,也未见得优势多明显,了解这种模式可以在读代码或者用第三方库的时候更轻松。主要是使用这种模式会让你的代码更具有Go语言风格,让你散发着gopher的独特气质。如果一个对象的初始化配置项众多,且有很多可以使用默认值,也可以自定义,那么就可以使用以下三种方式解决:1.必填项和选填项分离fu

2021-06-01 17:24:56 255

翻译 C++ 11智能指针

Part 1: shared_ptr Tutorial and Examples原文链接:https://thispointer.com/learning-shared_ptr-part-1-usage-details/这篇文章中,我们讨论C++11中的智能指针shared_ptr的用法。什么是std::shared_ptr<> ?shared_ptr是C++11提供的智能指针之一,它能在没有任何引用的时候自动释放持有的裸指针。因此能帮助开发人员避免内存泄露和悬空指针问题。shared

2020-09-08 11:15:09 274

原创 K8s基础问题

Kubernetes为什么又叫K8s?因为中间省略了8个字母,这是硅谷那些程序员的一个惯例。busybox是什么?BusyBox是一个遵循GPL协议、以自由软件形式发行的应用程序。Busybox在单一的可执行文件中提供了精简的Unix工具集,可运行于多款POSIX环境的操作系统。在Kubernetes的使用中,BusyBox常作为Pod的init container执行一些预配置工作。什么...

2019-09-09 19:43:56 633

原创 Redis Stream 简明使用教程

Redis Stream 特性是Redis 5.0之后才有的。Redis Stream的主要应用就是时间序列的消息流分发。PUB/SUB也可以做消息流分发,但是PUB/SUB不记录历史消息,而Redis Stream可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。Redis stream也是有长度大小限制的,超过设置的最大长度,最旧的消息会被丢失用...

2019-08-03 22:01:03 4209

原创 grpc和protocol buffer使用

grpcgrpc是Google的rpc开源框架,它使用了protocol buffer(Google的另一个开源工具)作为接口定义语言和消息传递格式。大概的使用方法是:使用protocol buffer语言编写接口定义。使用protocol buffer工具将接口编译成目标语言代码,包括服务端的接口框架和客户端的接口stub定义,数据的序列化和反序列化过程等通用代码。开发人员在服务端编...

2019-05-19 16:20:03 1631 2

原创 go 错误处理

Go 语言的错误处理有两种方式:panic和error。panic适用于严重的,调用方不可预料的错误,比如数组越界,即使告知调用方错误的原因,调用方也不可能在原地恢复程序正常流程。error就是一般的错误,比如网络中断,调用方可以预料这种错误的发生,并能根据错误做出相应的处理。有一种错误处理的模式是将panic通过recover转化成error,这种模式适用于内部错误多且杂,并且发生在各个函...

2019-03-08 16:57:30 342

原创 几个go 并发模式

go 语言中向一个已经关闭的channel发送数据会引起panic,因此go并发中一个基本的原则就是在数据发送端关闭channel。虽然channel是双向的通道,两个go routine可以通过一个channel进行双向通信,但是在一般的数据流的模式下,我们宁可将channel降级为单向的通道,以获取更安全可读的代码。本文主要介绍一些将channel作为单向通信的并发模式,文末会简单给一个双向...

2019-02-15 19:55:22 1293

原创 使用通信来共享内存,而不是通过共享内存来通信

所有go语言的学习者都会看到这样一句话“使用通信来共享内存,而不是通过共享内存来通信”,这是go语言并发编程的座右铭,然而却不那么好理解。为了搞清楚熟悉的锁模式并发编程和go的channel模式并发编程的区别,先分别看一下这两种模式都是怎么做的:为了行文简洁,暂时把代码执行单元都称为“线程”,在go语言中都是go routine。线程和go routine的关系涉及go 运行时的实现,已经超...

2019-02-11 17:29:41 1792 3

原创 《MySQL实战45讲》学习笔记——索引(二)

普通缩影和唯一索引普通索引和唯一索引都是二级索引。区别是唯一索引由数据库保证字段的唯一性。查询过程中,普通索引和唯一索引的性能差不多,普通索引也就是多判断一次而已。更新过程,普通索引可以使用change buffer优化,唯一索引因为要检查数据的唯一性,必须要将数据读入内存,可能引入磁盘的随机读,性能会下降。使用普通索引,数据的唯一性要靠业务来保证。change buffer机制cha...

2018-12-11 11:05:41 888

原创 《MySQL实战45讲》学习笔记——事务隔离

SQL标准事务隔离的级别包括:读未提交,read uncommitted,一个事务还没有提交,它做的变更就能被别的事务看到。读提交,read commited,一个事务提交之后,它做的变更才会被其他事务看到。可重复读,repeatable read,一个事务执行的过程中看到的数据,总是跟这个事务在启动的时候看到的数据是一致的。串行化,对于同一行记录,加读写锁。如果事务读写冲突,必须串行。...

2018-12-07 10:49:43 629

原创 《MySQL实战45讲》学习笔记——锁

全局锁对整个数据库实例加锁。命令是:Flush tables with read lock。使用这个命令后,数据库编程只读。全局锁的典型使用场景是做全库的逻辑备份。将整个库锁定有很大缺点:如果在主库上备份,备份期间所有更新不能执行,业务基本停摆如果在从库上备份,备份期间不能从主库同步数据,造成主从延迟官方的逻辑备份工具是mysqldump,使用-single-transaction参...

2018-12-06 10:48:19 739

原创 《MySQL实战45讲》学习笔记——索引

任何能够加速搜索的数据结构都可以用来做索引模型,常见的就是哈希索引,有序列表索引和多叉树索引。哈希索引的特点是插入删除方便,查找更快,缺点是只能进行等值查询,不能查找范围。有序索引可以使用二分查找,同时也支持范围查找,但是插入和删除效率低,适合静态数据。多叉树索引索引支持范围查找,平衡了哈希索引和有有序列表索引。InnoDB使用B+ 树索引模型,是一种平衡多叉树。TIPS:如果想...

2018-12-05 19:24:44 424

原创 用Redis做分布式锁

获取锁的过程生成一个128位的UUID,然后给锁的这个键赋值,如果赋值成功(返回1),就获取了锁;如果赋值失败(返回0),就相当于没有获取锁。客户端自己控制重试或者放弃。释放锁的过程释放锁就是移除锁键。但是如果在没有获取锁的情况下释放锁(一般是代码BUG),会将其他进程获取到的锁释放,锁就被破坏了。防止释放非自己获取的锁的一个办法是使用WATCH观察锁键获取锁键判断是否是自己设置的值...

2018-12-04 19:59:49 183

原创 Redis 消息发布与订阅

推模式客户端使用SUBSCRIBE命令订阅一个channel(会被阻塞),其他的客户端可以使用PUBLISH命令向这个channel发送消息,所有订阅者都会收到这个消息。推模式每一个channel维护一个客户端列表,发送消息的时候遍历列表发送。其余订阅,取消订阅,模式匹配订阅等实现也都很简单例子:subscriber:subscribe testpublisher:publish ...

2018-12-04 19:48:07 542

原创 《MySQL实战45讲》学习笔记——SQL语句的执行

MySQL 逻辑架构(图片来自MySQL实战45讲文稿):MySQL 的存储引擎是插件式的,这个系列讲座主要讲的是InnoDB存储引擎。连接器:管理连接,权限验证。MySQL有一个管理数据库mysql,mysql数据库中有一个表叫做user,user表中保存了4部分内容:用户,权限,安全和资源控制。用户部分保存了用户名和密码以及允许连接的Host。权限部分规定了用户是否可以查询,删除数据,...

2018-12-04 11:04:05 417

原创 Redis事务

事务用法Redis事务相关的命令有5个:DISCARD, EXEC, MULTI, UNWATCH, WATCHMULTI开始一个事务,EXEC执行事务,DISCARD取消事务。在MULTI和EXEC之间的命令会得到原子的执行。Redis事务和一般数据库的事务不太相同,更像是一个原子的批处理,具体有以下两点不同:redis事务开始时,在EXEC之前,所有的命令都在客户端排队,并不会到服务器...

2018-12-03 19:43:23 166

原创 go语言开发工程结构

go语言的工作区是一个目录,下边有3个主要的文件件,src用于保存源码文件,pkg用于保存二进制库文件,bin用于保存二进制可执行文件。GOPATH就是工作区的根目录。其他语言可能是一个项目使用一个工作区,但是go建议所有项目使用同一个工作区。一个典型的go工作区目录结构:bin/pkg/src/ project1/ .git/ package1/ package2/ m...

2018-11-06 06:50:00 923

原创 Effective Objective-C 2.0 笔记(三)

第37条 理解“块”这一概念block也是对象,也有引用计数,因此要避免循环引用,一个比较隐蔽的循环引用的例子是:-(void)anInstanceMenthod{ void (^someBlock)() = ^{ _anInstanceVar = @"something"; //... }}注意,通过下划线使用类的成员也会捕获self对象...

2018-10-17 13:44:25 273

原创 Effective Objective-C 2.0 笔记 (二)

第15条 用前缀避免命名空间冲突最好遵循苹果的编程规范,使用 3个字的前缀。对于全局的变量,常量以及C函数,也应该加上前缀。第16条 提供“全能初始化方法“这种编程模式就是定义一个参数最全的初始化方法,在其中初始化所有的成员变量,其余的初始化方法都调用这个初始化方法。目的是确保所有的成员变量都已经初始化,所有必要的过程都已经调用。下边是书上的例子:@implementation EOC...

2018-10-08 13:08:19 301

原创 Effective Objective-C 2.0 笔记 (一)

Effective Objective-C 2.0 笔记 (一)第1条 了解Objective-C语言起源这一章先是澄清了OC的消息机制和函数调用机制的区别。C++的函数调用机制在涉及到多态的时候也是动态绑定的,而OC只是普通的函数调用也是动态绑定的,也就是运行时查找应该执行的函数指针。接着介绍了OC中的对象都是保存在堆上的,非对象类型都是保存在栈上的。第2条 在类的头文件中尽量少引入其他...

2018-09-29 10:16:02 518

原创 iOS中的搜索

NSUserActivityNSUserActivity主要用于HandOff,简单说就是切换设备能接着做之前的事情,比如在手机浏览网页,打开Mac可以直接打开手机浏览的那个网页并且停留在阅读位置。因此NSUserActivity主要是用来记录应用程序当前状态的。在iOS9以后也支持在Spotlight中搜索。如果纯粹想索引一些内容,还是应该使用Core Spotlig。稍后会给出二者的比较。...

2018-09-24 10:57:21 765

原创 iOS App后台任务

Background Task因为iOS程序切换到后台之后,很有可能被系统杀掉,因此切换到后台的时候需要保存重要数据。UIApplication的这个方法能让系统给App一段时间,执行重要任务。beginBackgroundTaskWithName:expirationHandler:系统给了多少时间呢?可以用backgroundTimeRemaining API查看。如果超时,expir...

2018-09-19 10:36:09 1557

原创 iOS App Life Circle

一个iOS App有以下五个状态: 需要注意的是Inactive 状态,常常被忽略,App被切换到后台时,并不是直接进入Background状态,而是有一个Inactive状态,同样一个App启动后,也要经过Inactive状态过渡。系统状态的转换不能通过代码控制,只能通过用户操作由iOS系统控制。但是可以通过代码在状态转换的时候获取回调消息。这些回调函数都在AppDelegate中。...

2018-09-13 15:23:25 548

原创 趣谈网络协议学习笔记——RPC

二进制RPCRPC,远程过程调用,可以认为是在不同进程或者主机间调用函数。这是计算分离的一种方式。比如HTTP请求,同样是在远程执行一个计算过程并返回结果。而RPC的特点是调用方一般保留有一个Stub,使用者看起来就像调用本地函数一样调用这个函数,而RPC库封装了网络请求的过程。RPC一般是服务间互相调用常采取的技术。RPC主要有两个部分构成,一个是RPC协议,就是规定如何调用一个远程函数...

2018-09-12 17:51:57 326

原创 iOS 线程同步几种方式

多线程同步目的有以下几个方面:第一,对一段代码的执行进行保护,如果同时执行一段代码,中间的临时变量可能会互相干扰造成结果不对;第二,对资源的保护,多个线程执行不同的代码,但是可能涉及同一个资源;第三,消息传递,一个线程通知另外一个线程发生了一件事。iOS中常用线程同步方式:NSLock一个封装了pthread_mutex的OC对象,常用于保护一个代码块,如果NSLock对象已经被loc...

2018-08-28 13:38:56 2912

原创 iOS 消息机制——基于官方文档的笔记

动态绑定在OC中,一个调用一个对象的方法被叫做发送消息。[receiver message],就是给receiver发送message的消息。为什么这么说呢,因为OC在编译的时候没有决定调用的message方法就是receiver实现的message方法,receiver可能没有实现自己的message方法,也可能receiver得实际类型也不是声明的类型,可能是子类,也可能仅仅是实现了一个协...

2018-08-24 10:58:32 303

原创 iOS copy那些事儿

自定义对象copycopy是NSObject定义的一个方法,任何继承自NSObject的类实例都可以调用这个方法,但是前提是实现了copyWithZone:方法,因为copy会调用这个方法,如果没有实现,将引起Crash。- (id)copyWithZone:(NSZone *)zone; The returned object is implicitly retained by...

2018-08-22 14:26:31 265

原创 趣谈网络协议学习笔记——DNS

DNS就是将域名转换成IP的服务。DNS服务器是一个树状结构,分为根DNS,顶级域DNS和权威DNS服务器,再下边就是分层的本地DNS服务器节点。DNS解析流程浏览器在访问一个域名之前,比如www.163.com,就会问本地的DNS服务器这个域名的IP是啥?本地的DNS服务器有网络服务商提供,通过DHCP服务获取(以前还常常自己配置电脑上的DNS服务器地址,最近一些年没有手动操作过)...

2018-08-16 18:47:50 777

原创 趣谈网络协议学习笔记——HTTPS

简单的理解:HTTPS就是通过非对称加密交换对称加密的密钥,然后使用对称加密加密并传输数据。数字证书HTTPS使用非对称加密,需要将公钥发布出去,但是如何能保证公钥是官方网站发布的那个呢?数字证书就是公钥的身份证。公钥的发布者向权威机构(CA)请求证书,CA使用自己的私钥给发布者签名(签名算法大概就是哈希一下公钥和公钥发布者的信息)。使用者拿到一个证书后,使用CA的公钥进行解密,如...

2018-08-16 10:14:10 648

原创 趣谈网络协议学习笔记——TCP

什么叫做面向连接?在两端建立一定的数据结构来维护双方的交互状态。TCP包和UDP包都会被封装到IP包中,作为IP包数据的一部分在网络上传输。从IP包层看,没有区别。所谓的TCP是面向连接的是指使用了TCP协议的双方会维护一个传输状态的数据结构。为了保证TCP的可靠传输等特性,可以看到TCP头比UDP头复杂得多。TCP连接的建立过程(3次握手)理解三次握手,要明白一个现实,就是网络是...

2018-08-10 07:34:48 2492

原创 趣谈网络协议学习笔记——IP包的发送过程

一个主机发送一个网络包到一个IP,第一步先看这个IP是不是和自己在同一个网段,如果是在同一个网段,使用ARP协议查询出目标的MAC地址,填入MAC头,就能直接发送给目标主机。(在物理上还是要到达路由器的网口的,但是不会经由网关处理)。如果不在同一个网段,则需要查询网关的MAC,将网关的MAC填入MAC头,将目标的IP填入IP头,发往网关。网关拿到这个包后有3种可能:如果通过这个IP能直接...

2018-08-07 16:17:58 731

原创 趣谈网络协议学习笔记——DHCP, ARP, ICMP

DHCPDHCP(Dynamic Host Configuration Protocol)是局域网内将IP和Mac配对的协议,局域网内的DHCP服务器负责局域网内主机的IP分配。DHCP的IP分配过程:一台主机新加入局域网,使用IP地址0.0.0.0(因为此时还没有IP)向255.255.255.255(广播地址)发出一个UDP包,这个包的意思就是:我的MAC地址是XXX,我还没有IP...

2018-08-07 16:15:57 603

原创 Mac下JPEG照片的时间日期纠正

之前把照片保存在百度网盘上了,重新下载之后照片的创建时间变成了下载时间。但是EXIF中的创建时间是正确的。可是Apple的照片程序竟然显示的是照片的文件创建时间而不是EXIF中的时间,个人认为这是一个Bug。 为此,写了一个python脚本,读取JPEG的EXIF中的原始创建时间,改写文件的创建时间和文件名。from PIL import Imageimport exifreadim...

2018-07-02 10:28:13 4569

原创 Run Loops 阅读笔记

run loop是一个事件处理循环,可以向其添加自己的事件也可以接受系统的事件。run loop在没有事件的时候让线程睡眠。 每个线程都有自己的run loop,所以不需要自己创建,但是非主线程的run loop需要手动run起来。 run loop接受两种类型的源,input source和timer source。 run loop会发送通知,通过注册观察这些通知可以了解run loop...

2018-06-07 14:24:24 270

原创 导航控制器以及导航栏学习笔记

UINavigationViewController使用苹果官方网站的架构图: UINavigationViewController(下边简称UINaviVC)整体功能由3部分组成:UINaviVC本身, Bars(navigationBar,toolBar)和ViewControllers。UINaviVC作为管理者负责ViewController和Bar的交互。具体说来就是UINaviVC从它

2018-01-15 11:43:04 490

DirectShow 实务精选 + 源码

本书是“DirectShow 专业著作”丛书的第二本,侧重介绍了DirectShow 技 术在当前主要的几个领域中的应用,包括音视频采集、视频聊天、视频点播、 视频叠加、媒体播放等。在介绍各种应用的同时,辅助以大量详尽的实例源代 码。这些实例,不仅具有很强的实用价值和指导意义,更让读者理论联系实践, 使学习DirectShow 技术变得轻松自如。 本书结构合理,内容丰富新颖、条理清晰,适合广大的流媒体应用开发人 员、系统设计人员、以及对Windows 平台上多媒体处理感兴趣的编程爱好者学 习和参考。

2013-05-12

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除