自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

ssz的技术博客

记录,分享,乐趣。

  • 博客(33)
  • 资源 (3)
  • 收藏
  • 关注

原创 网络框架的实现,客户端更复杂

真正写过底层网络框架的人,应该有一个感受:就是在框架的client/server架构的实现中,表面上server端更重,实际上server端更容易设计实现,而客户端反而需要一些设计和实现的技巧,为什么呢?server端其实没有太大的发挥空间,无非是用性能最好的io模型(epoll/iocp/kqueue)、最好的线程池模型(先进后出,任务队列,协程),分别对accept进来的tcp连接进行数据包接收解析处理以及任务分派,然后处理好连接错误和异常即可。没有太多需要发挥和优化的空间。说白了,公认的最佳范式就

2021-09-15 10:39:52 157

原创 raft首领选举流程图

​​​​​​​

2021-08-05 10:48:42 278

原创 http1, http2优缺点对比,以及开源项目iip

一、 http1的缺点,以及对应的http2的优化1. http1是文本协议,“文本协议”的意思是其传输的数据流(包括header和body)必须先转换为ascii码的可见字符。为什么要这样呢?因为他是以\n换行符来进行数据分隔的。如果是传输带额数据是以原本的二进制内码的形式,则会和\n产生冲突,无法解析。而采用文本形式则势必需要对原数据进行文本化编码,比如url-encode,base64,等等,无论哪种编码,都会导致数据的体积增大。http2是二进制协议,无需进行文本化编码,不会导致体积增大。

2021-07-08 22:43:18 1368 1

原创 几句话说清楚代码和注释的关系

几句话说清楚代码和注释的关系代码是一种计算机语言写的小说; 代码的注释是以人类语言去解释这部小说,这种解释不是翻译,是剧情的架构,或者关键点的说明,有助于读代码的人容易理解。因此注释一般采用白话文,避免需要二次注释; 好的代码是流动的思想,好的语言也是; 道,可道,非常道。名,可名,非常名。可以说出来(可)的道理,就不是通用性规律性(常)的道理,可以说出来的定义(名),就不是通用性定义。什么意思呢?就是语言是一种表达思想的工具,但是是有缺陷的,是无法完全贴切的表达他要表达的思想。因此,作为代码

2021-07-07 10:48:39 204

转载 戏说牛顿

来源不详,转自网络。摘抄自豆瓣评论。3月28号是牛顿的忌日,但是知道的人很少,我们毕竟更关心沈殿霞和张国荣。其实牛顿老师在科学圈里曾经很有权势,被女王封了爵位成了贵族,人称牛爵爷,官至皇家造币局局长兼皇家学会会长。如果阿尔伯特没有辞了以色列总统的话和他有一拼。说他有权势并不仅是官大,主要是贡献大。如果17世纪就有诺贝尔奖的话,牛顿老师至少能连续垄断4届物理学奖(分光计;力学体系的构建;反射望远镜;万有引力),同时为了表彰他在炼金方面的造诣,再奉送他一届化学奖。而且这孙子鼓捣出了...

2021-01-27 10:29:12 172 1

原创 python3的对象回收逻辑、及仿照golang的defer语义的实现

本文基于python3及官方解释器cpython的实现。引子:比如说golang,func dealFile(fn string) { fd = open(fn) defer fd.close() //defer保证fd.close在函数结束后被调用 ....//在这里做其他事情}golang通过defer关键字来实现一种保证资源释放的办法,非常好用。若以python来实现相关的需求,有两种办法,with和try...finally比如:...

2021-01-19 10:53:47 501 1

原创 认知的方法论 --以学习python编程语言为例

认知的方法论--以学习python编程语言为例人之初,使用感觉来体验世界。触觉,味觉,视觉,听觉。从而形成了感性优先。从接受教育开始,更多的是理性教育,比如语言文字的语法逻辑,数学的算术逻辑,科学的物理逻辑。后续是一个感性理性不断的螺旋缠绕的过程。人类至今,理性并不能解释和解决所有问题,因此人类还是常常会求助于信仰、情绪等等非理性因素。使得自我将要做出的行为和做出后的行为形成自恰,而不至于混乱。认知(也就是人了解世界)的过程,是由点到线,由线到...

2020-11-25 12:03:14 177

原创 python3的高性能并发编程及web后端架构解决方案

总结一下这两天的学习成果--python3的并发编程及web后端架构解决方案GIL受限于不可释放的历史负担,GIL的存在使得一个python解释器(也就是一个进程)在同一时刻只能使用一个cpu内核(也就是同一时刻只能跑一个线程)。多线程(建议使用标准库的threading模块)代表真实的操作系统线程。线程的使用很方便,常见的方法和其他编程语言类似,是从Threading继承,然后override run()方法,在方法里写线程代码。使用的时候 创建线程对象,调用他的start()..

2020-11-12 16:49:31 638 1

原创 写技术博客的好处

比较欣赏愿意并持续写技术blog的人,有几个原因:会一项技术,然会后能清楚的说明它,是更升级一步,学会了只是大脑的一种意念,用文字表达出来是需要更精细更具体的。第二,分享的同时被读者监督,有助于修正第三,分享有利于他人有利于世界。第四,最重要的。写作有助于发散性思考。常常是自己和自己对话,自己否定自己,又肯定自己。提升编程能力有两种最佳实践:持续写作,和持续设计、构建、和编码。...

2020-02-22 08:44:06 560 1

原创 关于线程池的一段对话

2017-09-13 11:02:30 292

原创 linux上封装的c++的finally

很多编程语言里面有try...finally...这种结构来保证无论是否发生异常,finallly后面的代码一定会被执行,这个地方常常放置关闭文件、句柄、free对象、解锁等等操作。但c++并没有这种语法结构。号称强大的c++为啥没有这个特性呢?因为c++本身实现这种功能的方式的逼格更高一些。c++有一个RAII的概念,具体可以百度 “c++ RAII”以下的代码就是利用RAII来

2016-01-14 15:54:24 1100

原创 说一说golang的协程

协程是应用层的线程。应用层是相对于内核层而言,是操作系统的概念,对应的是cpu的运行级别。操作系统的核心代码运行的ring0级别,应用程序的代码运行在ring3级别。内核与应用层的级别设置保证了一些高权限的操作只有内核代码能做,应用程序要使用这些功能必须通过调用操作系统的API(linux上称为系统调用)来调用内核的代码。这个调用会导致cpu从ring3到ring0的上下文切换,这个切

2016-01-13 13:53:30 4923

原创 相较于其他语言,golang的突出特点和优势

编译型协程垃圾收集专为并发编程设计的管道语言简单实用,有效,高效适用于大规模高并发后端服务器程序开发内置高性能http server完善简便的各种库(package)调用C很简便跨平台作者之一是c的作者google出品,成熟,经过工业验证

2016-01-12 17:21:14 4177

原创 windows平台上的一个内存池的实现

.h文件/**********************说明************************** 这是MPool内存池的实现,他具有如下特性:* 1. 池中的内存块是大小是相同的* 2. 由宏定义_MP_NO_SERIALIZE决定是否需要多线程同步* 3. 他利用windows的堆内存API进行内存分配* 4. 他不能替换crt的malloc和free* 5. 他不

2014-07-30 11:34:59 2191

原创 c++ 数字转汉字

string zi(int i,int bit){ string ret; if (0==i) ret = "零"; else if(1 == i) ret = "一"; else if(2 == i) ret = "二"; else if(3 == i) ret = "三"; els

2014-07-15 11:13:02 3914

原创 源码:windows文件分割与合并

//判断文件是否存在bool FileExistsW(const wstring &fn){ WIN32_FIND_DATAW fd; HANDLE hFile = FindFirstFileW(fn.c_str(),&fd); if (hFile != INVALID_HANDLE_VALUE) { ::FindClose(hFile);

2014-07-14 01:38:54 3467

原创 基于windows api实现的共享锁/独占锁

众所周知,windows平台上实现线程同步,或者说资源的加锁与解锁的方法有内核事件、临界区、互斥量、信号量,甚至interlocked系列函数等多种手段。但是在日常的编程中,我们使用这些手段对 “多个线程同时对同一个资源进行读写”的时候,在读写之前先要对资源假锁,读写完之后要对资源解锁。设想这样一种情况,有一个ftp服务器,每天有很频繁的对这个ftp服务的文件进行下载,但是几乎好几天才会对

2014-07-11 16:57:12 3076 1

原创 c++ 标准库的各种容器(vector,deque,map,set,unordered_map,unordered_set,list)的性能考虑

c++ 标准库的各种容器(vector,deque,map,set,unordered_map,unordered_set,list)的性能考虑 一、vectorvector采用一段连续的内存来存储其元素,向vector添加元素的时候,如果容量不足,vector便会重新malloc一段更大的内存,然后把原内存中的数据memcpy到新的内存中,并free原内存块,然后将新元素加入。vec

2013-12-13 15:55:36 14979 4

原创 《抽象是一种美》

抽象是一种美

2013-10-29 10:52:38 1075

转载 对Native API NtSystemDebugControl的分析

本文转自http://www.xfocus.net/articles/200408/721.html对Native API NtSystemDebugControl的分析创建时间:2004-08-05文章属性:原创文章提交:tombkeeper (t0mbkeeper_at_hotmail.com)对Native API NtSystemDebugControl的分析

2012-12-20 11:09:21 678

原创 delphi组件序列化/反序列化

delphi组件序列化/反序列化可参考以下函数ReadComponentResFile,  WriteComponentResFileObjectTextToBinaryObjectBinaryToTextObjectTextToResourceObjectResourceToText

2012-06-11 09:38:15 1585

原创 delphi中没有窗口句柄的控件如何处理windows消息

timage控件没有窗口函数,所以处理不了消息。消息由其parent处理在其parent的winproc中,会利用GetControlsatpos来取得当前鼠标光标处的控件,如果取到了,则利用perform函数来将改消息发给这个控件(也就是调用控件的winproc函数),控件的winproc函数会处理这条消息,这里是用dispatchmessage函数来处理的,dispatchmessage利用汇

2012-06-11 09:36:53 2945 1

原创 工作中的一些思考

<br />1. 分解問題的能力<br />解決問題是的流程,是先把一個大問題分解成各個不同層級小問題,然后逐個解決這些分解出來的小問題。<br />分解:把復雜的事情簡單化的過程<br />分解需要能力和智慧和經驗,能力和智慧和經驗是經過解決無數問題的鍛煉累積以及對這些問題的思考而來,沒有捷徑。<br />分解問題的能力很重要,可以用來衡量一個人的能力。考驗一個人的能力,只要給他一個復雜的問題,看他解決的過程,看他怎么分解問題就可以了。而實際解決的結果只需占用很小的考察比重。<br /><br />2.

2011-04-25 21:40:00 692

原创 delphi中採用bpl共享模塊的幾點釋疑

<br />1. LoadPackage做了哪些事情?<br />LoadPackage的代碼可以從delphi的源碼(sysutils.pas)中找到<br />{ LoadPackage }<br />function LoadPackage(const Name: string): HMODULE;<br />begin<br />{$IFDEF MSWINDOWS}<br />  Result := SafeLoadLibrary(Name); //這裡使用windows api LoadLibra

2010-11-21 10:03:00 1800

原创 loadPackage太慢的解决办法

追蹤Loadpackage的源碼,可以把它分為兩部分:  Handle := SafeLoadLibrary(bplname);//這里調用winAPI的loadLibrary函數來加載bpl(因此其實bpl也可以認為是一個dll)   InitializePackage(Handle);//初始化這個bpl進一步分解InitializePackage(Handle),發現

2009-01-24 14:54:00 2829 2

原创 好的設計:易于擴展且能夠保持簡單、健壯

好的設計:易于擴展且能夠保持簡單、健壯。

2008-06-27 16:16:00 815

原创 笔记:VCL的诞生和设计原理

 回顧第一章: 回到從前(framework的產生背景) 第二章 VCL的诞生和设计原理2.1誕生chuck jazdzewski,anders heislberg目標:16/32混合單繼承PME模型運行/設計期行為面向對象開放的組件模型消息分派 采用類/繼承的方式。演化:接口,COM,MIDAS 2.2設計 2.3v

2008-02-27 20:49:00 1490

原创 信息系統通用緩存設計

!請勿轉載! 一、概述设计一个这样的通用缓存,是基于目前Erp系统中对缓存的使用没有一个统一的机制的局面,为了最大化的提高程序效能,优化对资料库的访问,简化对缓存数据的访问代码编写。以及还有一些我暂时还没有想到的好处。 分为5個部分:1.緩存的對象類型  a.n個TCachedArray,數組類集合  b.n個TCachedDictionary,字典類集合 

2008-02-21 21:08:00 1110

原创 關聯update SQL

部門表A,字段:SDEPTKEY:主鍵SDEPTID:部門號SDEPTNAME:部門名稱員工表B, 字段:SEMPKEY:主鍵 SDEPTKEY:foreign key:A.SDEPTKEYSDEPTID:部門號SEMPID:員工號SEMPNAME:姓名現在B.SDEPTKEY亂了,要根據B.DEPTID = A.DEPTID的關系。把它修正過來。在SQL Server中,有兩種Update

2008-01-11 12:44:00 1324

原创 《oracle pl/sql programming》 第10章 date/timestamp

1.Datetime數據類型DATE:最早的日期時間類型,精確到秒TIMESTAMP: 比DATE更精確的日期時間型,精確到十億分之一秒(當然能否精確到那么小有賴于操作系統和硬件)TIMESTAMP WITH TIME ZONE:存儲了TIMESTAMP和時區TIMESTAMP WITH LOCAL TIME ZONE:會將輸入的日期時間轉換為當前時區的日期時間。從下圖可以看出

2007-11-04 11:35:00 5866

原创 焦距原理

 >今天的文字要講一個方法,我把它稱作“焦距原理”。我選擇從軟件設計的角度講這個方法。但它並不只是適用於軟件開發,它是一種處理事物的普遍原理,可以適用於工作、生活、思想,以及所有你所要解決的問題。其次,它很簡單。通用的軟件開發設計流程(或者說生命周期)依次包括:需求分析=>概要設計=>詳細設計=>編碼=>測試=>產品=>維護也可能是一個迭代的過程,即:需求分析<=>概要設計<=>詳

2007-05-10 12:49:00 2349

原创 隨想:軟件開發文檔

    其實做哪一行都一樣,要想做好一件事,需要有個標准,有個規范,而且這個規范不是條文口號式的,而是實實在在的能為工作帶來品質提升的內容。從事這個行業有好幾年了,經歷過小的,大的,標准的,非標准各種企業,感受頗深的一點就是:文檔工作沒有一家企業做得好的。    我講的文檔指的是軟件開發文檔。從實用的角度出來,我認為傳統的分析、設計、編碼、測試這個統一模式下的文檔太泛化,講得比較虛,跟實際相差

2007-02-09 10:56:00 1143

原创 我所理解的VCL消息處理流程

一、VCL消息處理流程:1.Application從windows消息隊列中取得屬於當前線程的所有消息。2.Application:translatemessage.3.Application:dispatchmessage分派消息  3.1 dispatchmessage根據消息中的handle來找到目標元件的回調函數,並調用這個回調函數(wndproc)。4.每個元件(TWincontrol及

2007-01-30 15:15:00 1227

c++对象模型

c++对象模型,详细解析编译器对c++的OO结构在内存中的处理和排布机制

2013-10-29

空空如也

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

TA关注的人

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