自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(20)
  • 收藏
  • 关注

原创 SGX|hello world!

hello world!示例Enclave.edlApp.cppEnclave.cpp实现test.edlApp.cpptset.cpp注意事项示例了解了SGX的相关基础,我们试着来编写一个打印“hello world!”的demo。关于SGX的makefile的解读,参照https://blog.csdn.net/daichunkai123/article/details/78027895接下来我们尝试编写属于我们的“hello world!”。首先我们直接打开SDK中的示例程序:其中APP

2020-06-07 17:18:50 1171

原创 SGX|SGX开发基础

SGX基础设计原则安全区定义语言(enclave definition language,DEL)DEL关键词调试SGX数据密封设计原则设计通用原则:应用程序划分区域。可信部分(enclaves):一个应用程序可以有一个或多个安全区。安全区存储在加密的内存中,并受SGX保护。一旦建立不能被篡改:一旦被篡改会被CPU检测到,安全区就不会加载非可信部分:不被SGX保护的应用程序或内存。综上,编程之前就需要对代码进行划分,划分为可信代码和非可信代码,并要考虑二者之间的交互。

2020-06-06 18:29:03 2014

原创 SQLite克隆|第十步:拆分后更新父节点

拆分后更新父节点修改分割算法重写内节点搜索内节点插入后记直到第九步结束,我们只可以完成一个根节点和两个孩子节点的数据结构,并且能够成功利用select读取到正确的数据表,然而当我们再次插入新的数据后会发现,我们在拆分叶节点时由于已存在根节点,不能讲拆分后的旧结点作为新的根节点,而应该拆分后成为新的两个叶节点并更新根节点,具体需要怎么做呢?首先我们需要修改leaf_node_split_and_insert()函数:修改分割算法//创建新的叶子结点并分割当前节点元素void leaf_node_spl

2020-06-03 16:40:24 146

原创 SQLite克隆|第九步:树的递归搜索

上一节我们说到当根节点变为内节点后无法再插入数据,为了解决这个问题,我们使用递归搜索来解决这个问题,具体而言,从根节点出发二分查找根节点的关键词,如果遇上相等的,再去查找它的孩子,如果孩子仍为内节点,就继续递归查找键所对应元胞的光标(cursor);否则,如果孩子为叶子结点,则直接返回该叶子节点对应key的元胞的cursor://二分搜索键对应的胞元所在位置(cursor)Cursor *internal_node_find(Table* table,uint32_t page_num,uint32_t

2020-06-02 02:20:07 164

原创 SQLite克隆|第八步:拆分叶节点

拆分叶节点内节点结构内节点读取和写入根节点分割算法创建新根树的可视化内节点结构目前我们实现了B-Tree基本的数据结构,但是只限于单节点情况,在这种情况下能实现键排序和防止键重复。然而,我们的根节点现在只能存储14行数据,当大于14行时我们设置了错误提示。在本节,我们来实现叶节点的拆分,即生成树的第二层,将根节点转化为内节点。所以第一步,我们需要设计内节点的结构://内节点头设计const uint32_t INTERNAL_NODE_NUM_KEYS_SIZE=sizeof(uint32_t);/

2020-06-01 15:50:41 229

原创 SQLite克隆|第七步:键排序和键重复

在上一节中,我们实现了单节点的B-Tree,即根节点为叶节点的情况。在这一节中,我们仍然在这种单节点的情况下继续设计。我们想要实现两个功能:键排序和防止键重复。首先我们先定义两个函数用于设置和读取节点类型://返回节点类型NodeType get_node_type(void *node){ uint8_t value=*((uint8_t*)(node+NODE_TYPE_OFFSET)); return (NodeType)value;}//设置节点类型void set_n

2020-05-31 12:35:23 223

原创 SQLite克隆|第六步:引入B-Tree

上一节中,我们引入了光标的概念,这一切都是为了引入一个重要的数据结构——B-Tree。那我们就来简单看一下B-Tree的相关基础知识。首先我们需要知道,我们为什么要使用树形结构来作为数据库的结构:搜索特定值的速度很快(对数时间)插入/删除已寻址的值很快(重新平衡的时间稳定)快速遍历一类值(与哈希图不同)与二叉树不同,B树中的每个节点可以有两个以上的子节点。每个节点最多可以有m个子节点,其中m被称为树的“阶”。为了使树保持大致上的平衡,我们还说节点必须至少有m / 2个孩子(向上取整)。.

2020-05-30 22:12:10 177

原创 SQLite克隆|第五步:光标抽象

光标抽象光标简介光标的结构光标初始化获取当前行物理地址光标位置调整调整insert调整select光标简介从这一节开始,我们要准备在我们的数据库中使用B-Tree数据结构来存放数据便于加快检索速度。首先我们需要引入一个概念:光标(Cursor)。我们利用光标来表示数据表内的位置。我们利用光标可以实现:在数据表的开头创建一个光标在数据表结尾创建一个光标访问光标指向的行将光标移到下一行这是我们目前需要实现的功能。在接下的步骤中,我们还希望可以实现:删除光标指向的行修改光标指向的行在表

2020-05-27 22:21:48 123

原创 SQLite克隆|第四步:磁盘持久化

磁盘持久化分页器分页器结构数据表结构new_table()get_page()read()函数write()函数get_page()db_close()pager_flush()调整main()函数文件内容实现了在内存中储存硬编码的数据表之后,我们需要更近一步,将内存中的数据保存在文件中,即实现数据持久化。为了使这一点变得容易,我们将创建一个称为分页器的抽象。我们向分页器询问页码x,它返回了一块内存。它首先在其缓存中查找。在发生高速缓存未命中时,它将数据从磁盘复制到内存中(通过读取数据库文件)。分页器

2020-05-25 15:04:41 417

原创 SQLite克隆|第三步:实现内存中的最简单的数据表

实现内存中的最简单的数据表首先要解释一下所谓最简单的数据表的定义,它满足以下几个功能:支持两种操作:插入一行,打印所有行仅驻留在内存中(对磁盘没有持久性)支持单个硬编码表,所谓硬编码,即将数据直接写在代码(程序)中。硬编码格式如下:columntypeidintegerusernamevarchar(32)emailvarchar(255)...

2020-05-24 20:40:24 285

原创 SQLite克隆|第二步:SQL编译器和虚拟机

SQL编译器和虚拟机体系结构体系结构sqlite的“前端”是一个SQL编译器,它解析字符串并输出称为字节码的内部表示形式。该字节码被传递到执行它的虚拟机。将事情分为两个步骤有两个优点:降低每个部分的复杂性(例如,虚拟机不担心语法错误)允许一次编译通用查询并缓存字节码以提高性能在第一节的的基础上,我们划分为两个模块,前端和后端。前端的SQL编译器负责接收并解析输入,判断输入指令类型,最后将要执行的部分通知后端的虚拟机来执行。...

2020-05-24 00:51:25 179

原创 SQLite克隆|第一步:简介和制作REPL

SQLite简介制作简单的REPL(read-execute-print loop)因为实习工作原因,需要学习SQLite的源码。那我就寻思,干嘛不直接写一个呢,于是找了一个资源,准备从无到有来过一下SQLite的框架。于是在这里做一个记录。简介SQLite,是一款轻型的数据库,是遵守ACID的关系数据库管理系统,SQLite是D.RichardHipp用C语言编写的开源嵌入式数据库引擎。它是完全独立的,不具有外部依赖性。它是作PHPV4.3中的一个选项引入的,构建在PHPV5中。SQLite支持多数

2020-05-23 18:57:50 229

原创 SQLite|基础使用

SQLite|基础SQLite基础基础命令SQLite 语句逻辑运算符SQLite Having 子句SQLite Distinct 关键字SQLite 进阶SQLite PRAGMASQLite基础基础命令注释sqlite>.help -- 这是一个简单的注释SQL 注释以两个连续的 "-" 字符(ASCII 0x2d)开始,并扩展至下一个换行符(ASCII 0x0a)或直到输入结束,以先到者为准。您也可以使用 C 风格的注释,以 "/*" 开始,并扩展至下一个 "*/" 字符对或直到输

2020-05-23 18:29:52 357

原创 工具|sqlmap

文章目录安装大坑sql基本操作实战(test)GET型注入方式POST型注入方式安装大坑首先我想说的是目前sqlmap已经支持python2.x/3.x了,所以不必要为了sqlmap单独去配置环境。另外一点,作为初学者,我在使用中遇到了一个我以为是问题的问题,实际上是正常情况。希望后来者看到这篇博客都可以避免在这个问题上浪费时间。进入正题,当我们正确安装python环境和sqlmap之后,我...

2020-04-14 18:34:46 149

原创 基础部分|Python的多线程

文章目录官方文档简单多线程多线程中的方法调用守护线程和join()LOCK()今天来讲一下Python的多线程,也是面试中经常考到的一个点。在Python中,多线程是threading管理的,所以第一步:import threading其实写到这,后面就是去看这个库的官方文档进行学习就好了。在官方文档中,我们会看到Python多线程比较常用的几个方法。官方文档class thread...

2020-04-14 16:06:42 321

原创 Leetcode刷题|面试题 16.03. 交点

今天早上起晚了,没有赶上leetcode的周赛,后面一个人默默赛外刷完了。没什么可讲的,除了最后一题用了Ctrl+c+v其他都还算简单。到晚上又想起今天忘了写每日一题,遂又埋头苦战,困难题诚不欺我,着实是花了我一个多小时(链接)。现在来讲一下这题和这题的思路。给定两条线段(表示为起点start = {X1, Y1}和终点end = {X2, Y2}),如果它们有交点,请计算其交点,没有交点则返...

2020-04-12 23:28:07 224

原创 基础部分|CSS

id 选择器和派生选择器在现代布局中,id 选择器常常用于建立派生选择器。#sidebar p {color:red; background:yellow;}不知道大家是不是和我一样在W3school学习CSS的时候遇到了关于id选择器和派生选择器的问题。我当时对这一个派生选择器的用法的理解是:<p id="sidebar">小朋友你是否有许多问号?</p>...

2020-04-11 00:35:32 85

原创 基础部分|HTML

HTML格式<html><body><h1>我的第一个标题</h1><p>我的第一个段落。</p></body></html>例子解释”<html>“ 与 ”</html>“ 之间的文本描述网页“<body>” 与 “</bod...

2020-04-11 00:08:00 106

原创 基础部分|正则表达式

普通字符普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。非打印字符非打印字符也可以是正则表达式的组成部分。下表列出了表示非打印字符的转义序列:字符描述\cx匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c ...

2020-04-10 17:32:43 101

原创 Web安全学习框架

碰壁最近的春招一直在面实习生,但是因为自己比较菜,一直碰壁。意识到问题严重性的我,需要迅速开始调整。特在此写下自己目前的计划与目标。改变从今天开始,专注于Web安全的整体学习,学习计划按照SecWiki基础上根据自身条件优化执行,但是由于自己的时间比较紧迫,对自己的要求需要更加严格,每个计划需把时间缩短为原来的一半。在这里,把自己需要学习的内容简单罗列一下。HTML+CSS:已为基础教程...

2020-04-10 02:13:53 254

空空如也

空空如也

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

TA关注的人

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