- 博客(89)
- 资源 (2)
- 收藏
- 关注
原创 ImportError: No module named mpl_toolkits解决方案
一杯茶,一包烟,一个bug调一天解决方案:找到mpl_toolkits文件夹,在下边建一个文件:_init_.pytry:import(‘pkg_resources’).declare_namespace(name)except ImportError:pass # must not have setuptoolsps:mac用户需要先开启最高权限,否则__init__.py文件写...
2019-03-03 20:51:12
6197
原创 二战图灵破解恩格玛机的原理
最近看了一部电影,叫《模仿游戏》,主要讲的就是二战期间图灵破解德军通讯密码的故事,最后的意义是导致二战提前两年结束,拯救了至少1400万人的生命。电影主要以讲故事为主,后来研究了一下伟人的破解原理,用最简单的语言科普一下,这里不需要各种数学知识,没有复杂的公式,相信我,坚持耐心看完,你一定能看懂。1.第一回合:我们先来看一种最简单的加密:单表替换所谓替换,就是将明文按照一张固定的表,替换成...
2018-11-25 23:39:41
37747
13
原创 设计模式的c++实现之---观察者模式
#include <iostream>#include <vector>#include <sstream>#include <algorithm>#include <list>using namespace std;class Observer{public: Observer(){} virtual ...
2018-08-25 18:06:24
345
原创 设计模式的C++实现之---工厂模式
简单工厂模式class SingleCore{public: virtual void Show()=0;};class SingleCoreA:public SingleCore{public: void show() { cout<<"coreA"<<endl; }};class SingleCor...
2018-08-22 14:35:50
240
原创 设计模式的C++实现之---单例模式
懒汉:(非到用的时候才构造出来一个对象)class Sigleton{private: Sigleton() { this->id=0; } static Sigleton *sigleton; static pthread_mutex_t lock;public: static Sigleton* getIns...
2018-08-22 14:01:40
182
原创 多重继承,菱形继承下的虚函数表和虚基类表
虚函数与虚继承寻踪封装、继承、多态是面向对象语言的三大特性,熟悉C++的人对此应该不会有太多异议。C语言提供的struct,顶多算得上对数据的简单封装,而C++的引入把struct“升级”为class,使得面向对象的概念更加强大。继承机制解决了对象复用的问题,然而多重继承又会产生成员冲突的问题,虚继承在我看来更像是一种“不得已”的解决方案。多态让对象具有了运行时特性,并且它是软件设计复用的本质...
2018-08-06 14:54:46
1365
4
转载 一篇文章看懂makefile编写规则
该篇文章为转载,是对原作者系列文章的总汇加上标注。支持原创,请移步陈浩大神博客:(最原始版本)http://blog.youkuaiyun.com/haoel/article/details/2886 我转自一个博主 基于原博客的整理版本:http://blog.youkuaiyun.com/ruglcc/article/details/7814546/ makefile很重要 ...
2018-07-17 10:39:58
24806
8
转载 HDFS读写过程的详细分析
转自https://www.cnblogs.com/wxplmm/p/7239342.html首先我们来认识一下HDFS, HDFS(Hadoop Distributed File System )Hadoop分布式文件系统。它其实是将一个大文件分成若干块保存在不同服务器的多个节点中。通过联网让用户感觉像是在本地一样查看文件,为了降低文件丢失造成的错误,它会为每个小文件复制多个副本(默认为三个),...
2018-07-12 10:53:53
521
原创 如何绕过类的权限检查访问private变量?
主要原理就是:首先搞明白对象的内存布局,然后直接用对象的首地址加上某个成员变量在对象中的偏移值去访问。下边代码中的这个例子,对象的内存布局为:直接用首地址加上偏移值去访问即可。#include <iostream>using namespace std;class CNumber{public: CNumber() { this->nums=10; this-...
2018-06-22 22:55:02
583
原创 redis中基本的数据结构1
1.动态字符串结构 2.链表结构 3.哈希表节点 当两个健的哈希值相同的时候,使用链表连接在一起,解决冲突 4.字典 5.给字典中添加新的键值对: 5.1使用字典设置的哈希函数,计算健key的哈希值 Hash=dict->type->hashFunction(key); 5.2使用哈希表的sizemask属性和哈希值,计算出索引值 Index=hash&di...
2018-06-08 16:10:13
289
原创 泛化,特化,偏特化,traits
template<typename T>struct _type_traits{ //泛化 T t;};template<>struct _type_traits<int>{ //特化 int i;};_type_traits<Foo>::t;//使用泛化版本_type_traits<int&g...
2018-05-15 13:54:56
1007
原创 不执行main函数可以执行一段程序吗?
看代码:int main(){ printf("main\n"); //从运行结果来看,并没有执行main函数}void func(){ printf("不想执行main函数\n"); exit(0);}__attribute((destructor))void after(){ printf("after\n");}__attribute...
2018-04-27 17:26:18
746
1
原创 指针和引用的区别
经常看到网上有人说引用和指针其实是一样,底层都是指针,也没有人来详细分析一下,今天我们来看一看。int main(){ int a=10; int &b=a; b=20;} 0x00000000004028de <+0>: push %rbp 0x00000000004028df <+1>: mov %rsp,%rbp...
2018-04-27 12:19:44
177
原创 深入理解虚函数
我们先来看一下没有继承的情况下有虚函数的对象的内存布局: 在对象的最开始处,是一个虚函数表指针,这个指针指向了一个虚函数表,表中的每一项都是一个虚函数的地址。接着来看看代码,如何不通过对象直接调用虚函数?甚至调用对象的私有函数。 直接上代码吧,详细解释看注释:#include <iostream>using namespace std;class A{public: A()
2018-04-19 12:03:41
240
原创 关于析构函数和构造函数的调用
代码如下:编译加上参数:-fno-elide-constructors,其中析构函数还有问题,请大神指导#include <iostream>using namespace std;class CNumber{public: CNumber() { m_nNumber=10; cout<<"构造函数"<<e...
2018-04-19 00:33:56
383
转载 我读过的最好介绍红黑树的文章
前言 红黑树,对不少人来说是个比较头疼的名字,在网上搜资料也很少有讲清楚其演变来源的,多数一上来就给你来五条定义,红啊黑啊与根节点距离相等之类的,然后就开始进行旋转、插入、删除这些操作。一通操作下来,连红色和黑色怎么来的,是什么含义,有什么作用都云里雾里的,能搞清楚就怪了。 本文介绍红黑树,暂时不涉及任何代码,只是帮助你理解红黑树的演变来源,树结构中红黑色具体含义,保证你理解了...
2018-04-12 22:18:03
258
转载 PLT和GOT表(1)
转载自:http://blog.youkuaiyun.com/linyt/article/details/51635768在介绍PLT和GOT出场之前,先以一个简单的例子引入两个主角,各位请看以下代码:#include <stdio.h>void print_banner(){ printf("Welcome to World of PLT and GOT\n");}int m...
2018-03-12 10:42:16
291
转载 TCP层的分段和IP层的分片之间的关系 MTU和MSS存在的关
转载自:http://blog.sina.com.cn/s/blog_648d306d0102v4z2.html分段发生在传输层,分片发生在网络层。但是对于分段来说,这是经常发生在UDP传输层协议上的情况,对于传输层使用TCP协议的通道来说,这种事情很少发生。1,MTU(MaximumTransmission Unit,MTU),最大传输单元(1)以太网和802.3对数据帧的长度都有一个限制,其最...
2018-03-03 20:21:03
342
原创 水平触发和边缘触发
epoll也是实现I/O多路复用的一种方法,为了深入了解epoll的原理,我们先来看下epoll水平触发(level trigger,LT,LT为epoll的默认工作模式)与边缘触发(edge trigger,ET)两种工作模式。使用脉冲信号来解释LT和ET可能更加贴切。Level是指信号只需要处于水平,就一直会触发;而edge则是指信号为上升沿或者下降沿时触发。说得还有点玄乎,我们以生活中的一个...
2018-03-02 18:36:46
735
转载 条件变量之虚假唤醒
转载自:http://blog.youkuaiyun.com/q1007729991/article/details/620399881. 实现方法接下来,给出 pthread_cond_wait 和 pthread_cond_signal 的伪代码(参考man pthread_cond_signal)。语句后面的编号代表时间上的执行顺序。pthread_cond_wait(mutex, cond) { ...
2018-03-02 11:37:38
592
转载 带参数的信号
转自:http://blog.youkuaiyun.com/q1007729991/article/details/53893743前面不管我们是使用 signal 信号注册函数还是 sigaction 信号注册函数,我们都只注册了带一个参数的信号处理函数 void handler(int sig)。实际上,我们也可以使用带参数的的信号处理函数。signal 函数没办法注册一个带附加参数的信号处理函数,但是 ...
2018-02-26 18:53:54
1462
4
转载 linux 同步IO: sync、fsync与fdatasync
传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘I/O都通过缓冲进行。当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重用该缓冲区以便存放其他磁盘块数据时,再将该缓冲排入输出队列,然后待其到达队首时,才进行实际的I/O操作。这种输出方式被称为延迟写(delayed write)(Bach ...
2018-02-24 21:05:18
231
原创 malloc分配内存泄露检测
mtrace用法:#include <unistd.h>#include <fcntl.h>#include <sys/uio.h>#include <mcheck.h>int main(){ mtrace();//开始监测 int *p=(int *)malloc(4*sizeof(int)); free(p);...
2018-02-24 16:20:33
658
原创 Operation not possible due to RF-kill
Ubuntu下在图形界面没有Enable Wi-Fi的时候在终端使用ifconfig wlan0 up的时候报错SIOCSIFFLAGS: Operation not possible due to RF-kill使用rfkill list命令查看被被关闭的射频[plain] view plain copy0: hci0: Bluetooth Soft blocked: no ...
2018-02-13 15:28:47
871
原创 linux内存分配之mmap,munmp,brk
Linux 的虚拟内存管理有几个关键概念: 1、每个进程都有独立的虚拟地址空间,进程访问的虚拟地址并不是真正的物理地址; 2、虚拟地址可通过每个进程上的页表(在每个进程的内核虚拟地址空间)与物理地址进行映射,获得真正物理地址; 3、如果虚拟地址对应物理地址不在物理内存中,则产生缺页中断,真正分配物理地址,同时更新进程的页表;如果此时物理内存已耗尽,则根据内存替换算法淘汰部分页面至物理磁盘中。 ...
2018-02-10 16:52:05
461
转载 AES加密流程动画演示及详细流程
http://news.cnblogs.com/n/77390/https://www.cnblogs.com/block2016/p/5596676.html
2018-02-09 14:39:21
3869
原创 python解析wireshak包报错:Not a pcap capture file (bad magic)
代码如下:from scapy.all import *def readPacap(path): pcaps=rdpcap(path) for p in pcaps: print p.show() breakif __name__ == '__main__': readPacap("/home/darmao/Downloads/ol
2018-01-15 11:25:43
2366
转载 linux进程虚拟地址空间
内存管理模块是操作系统的心脏;它对应用程序和系统管理非常重要。今后的几篇文章中,我将着眼于实际的内存问题,但也不避讳其中的技术内幕。由于不少概念是通用的,所以文中大部分例子取自32位x86平台的Linux和Windows系统。本系列第一篇文章讲述应用程序的内存布局。 在多任务操作系统中的每一个进程都运行在一个属于它自己的内存沙盘中。这个沙盘就是虚拟地址空间(virtual address s...
2018-01-12 16:42:41
357
转载 linux内存管理解析----linux物理,线性内存布局及页表的初始化
早就想搞一下内存问题了!这次正趁着搞bigmemory内核,可以写一篇文章了。本文旨在记录,不包含细节,细节的话,google,百度均可,很多人已经写了不少了。我只是按照自己的理解记录一下内存的点点滴滴而已,没有一家之言,不讨论,不较真。1.最简单的内存使用最简单的模型是冯.诺依曼提出的原始模型,简单的把数据和指令存放在内存中,然后机器从内存中取出指令和数据进行计算,如下图所示:
2018-01-05 16:36:30
848
原创 对linux内核中GDT和LDT的理解
GDT(Global Descriptor Table) 在实模式下当我们需要对一个内存地址进行访问的时候,使用的是 【段基地址:偏移地址】,这样计算出来的地址就是内存的实际地址。但是到了保护模式,内存管理分为段式,和段页式,也就是段模式必不可少。我们先不考虑页模式。 对段模式来说,访问一个内存仍然用的【段基地址:偏移地址】。IA32允许将一个段的基地址设置为32bit所能表示的任何值,li
2018-01-05 15:13:00
7676
1
原创 linux物理内存的管理
数据结构:typedef struct pglist_data { struct zone node_zones[MAX_NR_ZONES]; struct zonelist node_zonelists[MAX_ZONELISTS]; int nr_zones; struct page *node_mem_map; struct bootmem_data *
2017-12-28 16:41:34
336
原创 linux内核内核和进程有关的数据结构
进程ID类型PID:这是 Linux 中在其命名空间中唯一标识进程而分配给它的一个号码,称做进程ID号,简称PID。在使用 fork 或 clone 系统调用时产生的进程均会由内核分配一个新的唯一的PID值。 TGID:在一个进程中,如果以CLONE_THREAD标志来调用clone建立的进程就是该进程的一个线程,它们处于一个线程组,该线程组的ID叫做TGID。处于相同的线程组中的所有进程都有相同
2017-12-18 16:28:22
780
原创 linux下增加一个新的系统调用实现pstree功能
这是我们linux课程的一个作业。 首先得到init进程的task_struct,根据list_for_each可以循环遍历可以的到其所有的子进程的 list_head,根据list_head使用list_entry可以得到其task_struct,在循环的同时,每得到一个进程的task_struct,就递归遍历其子进程的task_struct。在递归的同时,记录递归的深度,根据深度在每个子进程的
2017-12-17 22:44:40
1685
转载 伙伴系统的概述
转载出处:http://blog.youkuaiyun.com/vanbreaker/article/details/7605367 伙伴系统的概述Linux内核内存管理的一项重要工作就是如何在频繁申请释放内存的情况下,避免碎片的产生。Linux采用伙伴系统解决外部碎片的问题,采用slab解决内部碎片的问题,在这里我们先讨论外部碎片问题。避免外部碎片的方法有两种:一种是之前介绍过的利用非连续内存的分配;另外一种
2017-12-17 22:05:44
353
原创 安卓下反调试方案汇总
Android反调试1.调试端口检测读取/proc/net/tcp,查找IDA远程调试所用的23946端口,若发现说明进程正在被IDA调试。void CheckPort23946ByTcp(){ FILE* pfile=NULL; char buf[0x1000]={0}; // 执行命令 char* strCatTcp= "cat /proc/net/tcp |g
2017-12-15 21:36:22
2067
原创 unix网络编程---服务器和客户端上的异常处理
1.被中断的系统调用://服务端模型:socket();bind();listen();for(;;){ accept();//服务端阻塞在这里 if(fork()==0) { while() { read(); write(); } }}//客户端模型soc
2017-12-13 17:55:10
398
原创 二叉树的有关操作
struct BTreeNode{ char data; BTreeNode *left; BTreeNode *right;};//创建二叉树void createBTree(BTreeNode*&amp;T){ char c; cin&gt;&gt;c; if(c=='#') { T= nullptr; ...
2017-12-04 20:48:54
269
原创 linux调试器的实现---断点的实现
断点是如何形成的 有两种类型的断点:硬件断点和软件断点。硬件断点通常需要设置处理器中寄存器的值以产生断点,而软件断点则需要修改正在执行的代码。本文将以软件断点为主,因为它更简单,而且想要多少都可以,在X86上,同时只能设置4个硬件断点,不过硬件断点既可以在读取或写入给定地址触发,也可以在执行时触发。我上面说过,软件断点是通过修改执行代码来实现的,所以问题来了: 我们如何修改代码? 我们做什么修
2017-11-14 21:24:55
2001
原创 linux调试器的实现---有关寄存器操作的实现
在这里,依旧是我们的利器ptrace//reg.h#ifndef DEBUGGER_REG_H#define DEBUGGER_REG_H#include <string>#include <boost/mpl/size_t.hpp>#include <array>#include <algorithm>enum class reg { rax,rbx,rcx,rdx,
2017-11-14 20:51:05
549
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人