database-system-concepts-6
关系数据库设计 背景 RDB设计工程方法的代表:E-R图方法 绘制 E-R E−R→RDBE-R\rightarrow RDBE−R→RDB模式 模式优化 RDB设计工程方法的问题 E-R质量和设计人员能力水平相关 E-R质量难以保证,致使E-R方法设计质量难以保证 其它RDB模式工程设计方法存在类似问题 模式规范化方法的研究状况 提出了模式规范化的标准:为决定因素 1NF,2NF,3NF,BCNF,4NF,5NF,6NF 给出了泛关系分解到具体范式的算法 算法多为Np算法,无法实际执行 规范化方法学习价值 理解不同范式的优缺点 理解相应的模式改进方法 作为重要指导思想指导模式设计 本章讲述关系模式规范化理论、方法 好的关系设计特点 不必存储不必要的重复信息,同时又可以方便地获取信息 同数据本质结构相吻合 第一范式 如果某个域的元素被认为是不可再分的单元,那么这个域就是原子的(atomic)。如果一个关系模式R的所有的属性域都是原子的,我们称关系模式R属于第一范式(first normal form, 1NF) 关系数据库中的所有关 ...
database-system-concepts-7
第十二、十三章 RAID RAID:Redundant Arrays of Independent Disks(独立磁盘冗余阵列) 其实就是用多个独立的磁盘组成在一起形成一个大的磁盘系统,从而实现比单块磁盘更好的存储性能和更高的可靠性。 以下摘自知乎RAID磁盘阵列是什么(一看就懂) RAID5 这是目前用的最多的一种方式。 因为 RAID5 是一种将 存储性能、数据安全、存储成本 兼顾的一种方案。 在了解RAID5之前,我们可以先简单看一下RAID3,虽然RAID3用的很少,但弄清楚了RAID3就很容易明白RAID5的思路。 RAID3的方式是:将数据按照RAID0的形式,分成多份同时写入多块磁盘,但是还会另外再留出一块磁盘用于写「奇偶校验码」。例如总共有N块磁盘,那么就会让其中额度N-1块用来并发的写数据,第N块磁盘用记录校验码数据。一旦某一块磁盘坏掉了,就可以利用其它的N-1块磁盘去恢复数据。 但是由于第N块磁盘是校验码磁盘,因此有任何数据的写入都会要去更新这块磁盘,导致这块磁盘的读写是最频繁的,也就非常的容易损坏。 RAID5的方式可以说是对RAID3进行了改进。 RAID5模 ...
设计模式
分类与功能 创建型模式:用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。GoF 中提供了单例、原型、工厂方法、抽象工厂、建造者等 5 种创建型模式。 结构型模式:用于描述如何将类或对象按某种布局组成更大的结构,GoF 中提供了代理、适配器、桥接、装饰、外观、享元、组合等 7 种结构型模式。 行为型模式:用于描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,以及怎样分配职责。GoF 中提供了模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器等 11 种行为型模式。 单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。 原型(Prototype)模式:将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。 工厂方法(Factory Method)模式:定义一个用于创建产品的接口,由子类决定生产什么产品。 抽象工厂(AbstractFactory)模式:提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品。 建造者(Builder)模 ...
面向对象笔记
面向对象 1234567String s1 = "java";String s2 = "java";String s3 = new String("java");String s4 = new String("java");//s1==s2:t//s1==s3:f//s3==s4:f s1==s2:java维护常量池,s1与s2会指向同一个对象。 而且s2="java1"也会构造新的对象,而不会赋值 下面来说一下,java中的隐藏和覆盖的概念。我们知道,当子类继承父类时,除了继承父类所有的成员变量和成员方法之外,还可以声明自己的成员变量和成员方法。那么,如果父类和子类的成员变量和方法同名会发生什么?假设有一个父类Father和一个子类Son。父类有一个成员变量a=0;有一个静态成员变量b=0;有一个成员方法a,输出0;有一个静态成员方法b,输出0。子类分别重写这些变量和方法,只是修改变量的值和方法的输出,全部改为1. 我们再声明一个静态类型是父类,动态类型是子类的引用: Father ...
英语科技文献总结
考试范围:1-20单元 题型: 科技文献常识及慕课测试 20题20分 4篇阅读理解(六级水平) 20题40分 句子翻译英译汉 5题15分 段落翻译 1题10分 文献总结归纳(summary) 1题15分 考点总结 绪论 科技文献类型(10种) 科技文献分类 一级文献(5种) 二级文献(2种) 三级文献(3种) 文体特点(5个) formality(正式) conciseness(简明) directness(直白) objective(客观) use of non-verbal-language 形态特点(3个) jargon(术语) nominalization(名词化) hedging(避让策略:话不说满) 语法特点(4个) 不同时态的使用(different tenses) 被动语态(passive voice) 虚拟语气(subjunctive mood) 祈使句(imperative sentences) 期刊 目的(2个) 11页第二段 类型 原创研究(original research ...
十天速通计组课设
计算机组成原理课程设计 参考了这篇博客 课程设计步骤 功能和用途 通过该课程设计的学习,我们设计一台模型机,该模型机运行在FPGA平台上,可以模拟真正的计算机设备的一部分功能,通过微指令进行实现,使其可以完成一些基本操作,包括:最基本的,加法及其溢出、全零、进位、符号判断操作。除此之外对模型机进行了拓展,实现了条件指令JX,使用相对寻址完成了寻址,此外如果计算结果溢出则将相应的溢出标志存到特定的地址下。 调试过程中通过平台指示灯观察内部的数据流动情况,了解计算机的运行、计算过程和内部的时序问题并辅助修改。 指令系统 指令格式 基本字长:8位 单字长指令:指令由高4位操作码、低4位全0构成。 双字长指令:指令由第一字节高4位操作码、低4位为寄存器组操作码;第二字节由操作数、操作数地址、偏移量等构成。 四字长指令:实验中唯一用到的四字长指令是是溢出标志存储指令。指令第一字节高4位为操作码,低4位为寄存器组操作码,第二字节为溢出标记值,第三字节为溢出写入地址,第四字节为指令的后继指令地址。 三种指令格式的高四位为操作码,支持16种不同的指令。实验中使用0001~1000作为九 ...
移动互联网期末名词解释
移动互联网名词 复习题目和范围 Android等移动开发开发环境,各部、功能、用法、流程等,术语SDK、NDK、clang、avd、adb、studio等。 Android中的技术,GUI元素和界面设计、声音录放、静图/动图、网路通信、性能C、权限、GPS和地图、二维码等。 传感器技术和创意应用设计,再举例:街头棋局app。https://blog.csdn.net/lanrenxiaowen/article/details/108051656 通信技术,ip、port、socket、tcp/udp/sctp、multicast/mdns、proxy、http/s、socks、mq、p2p、nat、socat、ssh/-L-R-D、JSch 与桌面开发不同的移动开发技术。 移动开发和云的结合:计算能力和续航能力的平衡、分布式计算或数据存储、云备份、安全加密等。 与时俱进的移动开发技术,各方面:接入、通信、存储、界面、显示、Web/HTML、云、各种识别等。 从HTML/5到WebView的开发技术和过程。 H5/Canvas和Android/Canvas Android上app代码运行 ...
让Onedrive云盘同步本地任意一个文件夹(适用于Windows)
暑假要换硬盘了,到时候估计还会用到 转自让Onedrive云盘同步本地任意一个文件夹(适用于Windows) 作者Caleb_Sung 关于mklink命令 简介 NTFS 符号链接又称“符号链接”,是 NTFS 文件系统中指向文件系统中的另一个对象的一类对象,被指向的对象叫做“目标”。mklink 是 Windows 下用于创建符号链接的工具,存在于 Windows Vista 及以后版本的 Windows 操作系统中。 使用方式 MKLINK [[/D] | [/H] | [/J]] Link Target 说明: /D 创建目录符号链接而不是文件符号链接(默认为文件符号链接) /H 创建硬链接而不是符号链接 /J 创建目录连接点 Link 指定新的符号链接名称 Target 指定新链接引用的路径(绝对路径或者相对路径均可) 注意 参数 Link 和 Target 要求不能使用 Windows 中不允许用作文件名的字符(\ / : * ? " < > |)。并且如果 Link 和 Target 这两个参数中需要包含空格,则必须使用英文双引号将内容引起来,以避免 ...
学线移动的两年:安卓从小白到进阶
学线移动的两年:安卓从小白到进阶 前言的前言 从2020入学时的小白,到如今即将卸任学生在线移动开发部总监,不知不觉之间安卓已经陪伴了我接近两年的时光。两年以来有过学习的汗水、前进方向的迷茫,也有过将想法变成现实的喜悦,我很庆幸过去的两年时光之中自己能够按照自己的想法去生活,既不被焦虑裹挟而卷,也没有因佛系而摆烂。 从去年十月以来,因为学线的纳新培训,我写了很多关于安卓开发的博客,当然这其中也参考了网上很多大佬的教程,但一直没有太逻辑性的总结,所以如果你一点点翻看我的博客会感觉特别凌乱,在此我对过往两年中的路程进行梳理,写下我的学习路程与收获。 前言 如何快速上手一门技术?我曾与很多大佬讨论这个问题,得到的答案也五花八门,我曾尝试过很多道路,也失败过很多次(绝对不是因为喜欢考试前一天晚上才开始预习),或许每个人都有每个人的方法,我只能说我的方法可能更适合我。 回归正题,如何快速上手一门技术?至少现在看来,我勉强算是找到了属于自己的一种方法。其实我们最大的痛点是什么?是我在啥也不会的时候翻完一遍书,以为自己都学会了,但是打开IDE却不知道该如何下手。我们该如何改变这一局面?方法五花八门 ...
os-实验七
内存页面置换算法 一个问题 示例实验在编译时可能会报错,因为示例实验使用cpp写的所以要用g++编译,有的Linux可能没有g++编译器 1make: g++: Command not found 解决方法:装一个呗 1sudo apt-get install g++ 独立实验 Clock 逻辑 使用PageChances数组维护对应页的机会。 每当找到一页已经存在的页,则给该页的机会加一。若该页不存在,则遍历页列表找可以牺牲的页,检查这些页的引用位,如果引用位为 0 则直接置换该页,否则将引用位清零并给该页第二次机会。之后准备换出下一个 FIFO 页。 这里要注意存在的一个问题,可能存在一次遍历找不到可以牺牲的页的情况,需要维护一个布尔值标志是否完成了替换并使用while进行循环。 代码 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566void Replace::Clock(void) ...
使用快捷键禁用键盘
使用快捷键禁用键盘 前言:AutoHotkey tips:这一步并不是必要的,先看完前言再决定是否下载 中文项目指导下载项目:地址 项目学习指南 Download AutoHotkey .zip 下载后你会拿到这样的文件夹 如果你下载了中文版文档,不要直接做简单替换,并不适用(有时候) 这样的话如果你有脚本可以使用AutoHotkey去执行。本次的项目也提供了可以由AutoHotkey执行的脚本。 安装 将文件夹下的Installer.ank用上面的应用程序打开(取决于你的电脑的系统是32位还是64位) 完成安装即可。 正文 download Keyboard Locker 下载后,你会得到这样的文件夹 如果你有下载AutoHotkey,可以执行ahk文件。ahk文件的好处就是,你可以自己进行魔改。 如果没有,直接运行exe文件也可以,Ctrl+Alt+L是锁定键盘,不过仍然有一些不容易误触的组合键是可用的,如Ctrl+Alt+Delete 与 Win+L。如果你想解锁,直接在键盘上敲unlock就可以了 显示通知 默认情况下,键盘锁定器在锁定或解锁键盘时不显示通知。如果您想看到 ...
学线培训:TCP-UDP
TCP&UDP初步 基本概念 TCP:传输控制协议(Transmission Control Protocol) UDP:用户数据报协议(User Datagram Protocol) TCP跟UDP的一些基本区别: TCP面向连接,UDP不面向连接。 TCP面向字节,不存在消息边界,所以可能存在粘包问题。UDP则面向报文。 为什么会粘包 TCP会尽力保证数据的可靠交付,而UDP默认不做保证。 TCP头部20字节,UDP头部8字节。 编者注:如何理解1和3: TCP协议是一种可靠的通信协议,它要求传输的过程是可靠的,因此需要经过三次握手的环节,确立连接关系之后,才可以进行传输。除此之外,TCP还有超时重传机制,还有排序的机制,有发送的窗口,有窗口大小等等,保证接收方接收到的就是发送方发送过去的。 UDP是一种不可靠的通信协议,它不需要建立连接,不需要对连接进行确认ACK的操作,不需要重传,不需要排序,它只管传输。 比如: “我给你讲一个关于TCP的笑话。” “好的你给我讲一个关于TCP的笑话。” “好的。” ------确立连接关系,进行传输------ “苟。 ...
面向对象课程设计
面向对象课程设计分析与总结 代码结构 勉强算是MVC架构,但其实项目不大,纯代码只有2543行,所以谈架构并没有什么太大的意义。 老规矩,bean目录用于存放对象(实体类),shortcut包用于存放按键监听函数的注册,widgets用于存放自定义的widget,main.dart用于构建主界面与主界面逻辑。 UML (虽然看起来dart文件不多但其实类还是很多,关系比较复杂) 代码/程序主要分为四部分,基本也是可以与上面的代码结构相对应: flutter框架部分(当然这部分不需要我们关心) 实体类部分 组件类部分 主程序部分 各部分代码的功能 实体类部分 主要负责程序中的实体类构建,包括卡牌(以及一整副牌)、各种牌堆、用户执行的操作以及这个游戏本身。 实体类的创建主要以建造者模式为导向,事实上这也是在构建实体类模块时常用的思想。我选择从最基本的元素开始抽象,灵活运用组合与继承,同时通过一定的装饰器模式思想,逐渐完成对整个游戏的抽象。 但其实存在一个小问题,SolitaireGame方法庞杂,逻辑众多,并不利于后期维护,我尽量通过函数名的自解释来解决这一问题。 组件类部分 相应 ...
flutter生成UML
flutter生成UML的方法 准备 首先,确保你安装了PlantUML这个插件 安装dcdg.dart 1dart pub global activate dcdg 使用 1dart pub global run dcdg -o 要保存的文件路径/文件名.puml 即可 See --help for more options, including ways to filter what ends up in the output. 保存UML为图片 点这里即可: 参考 https://juejin.cn/post/6979795376731586573 https://github.com/glesica/dcdg.dart
什么是P问题、NP问题和NPC问题
首先声明几点: 我对ACM或者OI等没有任何兴趣 本文大部分来自http://www.matrix67.com/blog/archives/105,博主有很多好文章(虽然不是我感兴趣的方向)(绝不是因为看不懂) 算法会讲到(5.18补充) 正文 还是先用几句话简单说明一下时间复杂度。时间复杂度并不是表示一个程序解决问题需要花多少时间,而是当问题规模扩大后,程序需要的时间长度增长得有多快。也就是说,对于高速处理数据的计算机来说,处理某一个特定数据的效率不能衡量一个程序的好坏,而应该看当这个数据的规模变大到数百倍后,程序运行时间是否还是一样,或者也跟着慢了数百倍,或者变慢了数万倍。不管数据有多大,程序处理花的时间始终是那么多的,我们就说这个程序很好,具有O(1)的时间复杂度,也称常数级复杂度;数据规模变得有多大,花的时间也跟着变得有多长,这个程序的时间复杂度就是O(n),比如找n个数中的最大值;而像冒泡排序、插入排序等,数据扩大2倍,时间变慢4倍的,属于O(n2)O(n^2)O(n2)的复杂度。还有一些穷举类的算法,所需时间长度成几何阶数上涨,这就是O(an)O(a^n)O(an)的指 ...
计算机术语中英对照
转自:EarsEyesMouth/computerese-cross-references 计算机专业术语对照 A abstraction layer,抽象层 access,获取,存取 acoustic coupler,声音耦合器 Active Directory,活动目录 Acyclic Dependencies Principle,非循环依赖原则(ADP) acyclic digraph,有向无环图 Adaptive Code,自适应代码 Add Parameter,添加参数 ADSL,Asymmetrical Dingital Subscriber Loop,非对称数字用户环线 affinity,绑定 affinity group,地缘组 agent,代理 agent-based interface,代理人界面 Aggregate,聚合 Aggregate Root,聚合根 Agile,敏捷方法论 agile practice,敏捷实践 agile process,敏捷流程 agility,敏捷性 AI,Artificial Intelligence,人工智能 air wave ...
操作系统实验五-进程互斥
进程互斥实验 为了能够体验IPC机制的消息队列的用法,示例程序采用了 Theaker &Brookes 提出的消息传递算法。该算法中有一控制进程,带有3个不同类型的消息信箱,它们分别是:读请求信箱、写请求信箱和操作完成信箱。读者需要 访问临界资源时首先要向控制进程发送读请求消息,写者需要访问临界资源时也要先向控制进程发送写请求消息,在得到控制进程的允许消息后方可进入临界区读或写。读或写者在完成对临界资源的访问后还要向控制进程发送操作完成消息。 控制进程使用一个变量count控制读写者互斥的访问临界资源并允许写者优先。 count 的初值需要一个比最大读者数还要大的数,本例取值为100。当count 大于0 时说明没有新的读写请求,控制进程接收读写者新的请求,如果收到读者完成消息,对count 的值加1,如果收到写者请求消息,count的值减100,如果收到读者请求消息,对count的值减1。 当count等于0时说明写者正在写,控制进程等待写者完成后再次令count 的值等于100。 当count小于0 时说明读者正在读,控制进程等待读者完成后对count 的值加1。 Linu ...
java-volatile
关于并发关键字Volatile volatile通常被比喻成"轻量级的synchronized",也是Java并发编程中比较重要的一个关键字。和synchronized不同,volatile是一个变量修饰符,只能用来修饰变量。无法修饰方法及代码块等。 Java的volatile关键字用于标记一个变量 “应当存储在主存” 。更确切地说,每次读取volatile变量,都应该从主存读取,而不是从CPU缓存读取。每次写入一个volatile变量,应该写到主存中,而不是仅仅写到CPU缓存。 实际上,从Java 5开始,volatile关键字除了保证volatile变量从主存读写外,还提供了更多的保障。 变量可见性问题 Java的volatile关键字能保证变量修改后,对各个线程是可见的。这个听起来有些抽象,下面就详细说明。 在一个多线程的应用中,线程在操作非volatile变量时,出于性能考虑,每个线程可能会将变量从主存拷贝到CPU缓存中。如果你的计算机有多个CPU,每个线程可能会在不同的CPU中运行。这意味着,每个线程都有可能会把变量拷贝到各自CPU的缓存中,如下图所示: ...