Coding in life...

a litter inspiration


  • Home

  • Categories

  • Archives

  • Tags

  • Search

mysql必知必会1-3章

Posted on 2018-12-17 | In 《MySQL必知必会》

第一章 了解SQL

  • 数据库(database)

    • 保存有组织的数据的容器(通常是一个文件或一组文件)
  • 表(table)

    • 某种特定类型数据的结构化清单
  • 模式(schema)

    • 关于数据库和表的布局及特性的信息

描述表的这组信息就是所谓的模式,模式可以用来描述数据库中特定的表以及整个数据库(和其中表的关系)


什么是SQL

SQL是一种结构化查询语言(Structured Query Language)的缩写。

SQL是一种专门用来与数据库通信的语言。

什么是MySQL

数据的所有存储、检索、管理和处理实际上是由数据库软件–DBMS(数据库管理系统)完成的。

MySQL是一种DBMS

UML笔记二

Posted on 2018-12-12 | In uml

2 建模基础

建模(Modeling),是指通过对客观事物建立一种抽象的方法用以表征事物并对获得对事物本身的理解,同时把这种理解概念化,将这些逻辑概念组织起来,构成一种对所观察的对象的内部结构和工作原理的便于理解的表达。

无论在需求分析、系统分析还是系统设计上,一定要学会采用面向对象的方法,在面对问题领域的时候首先不要决定去通盘考虑,而是要找出问题领域里包含的抽象角度。

如果把抽象角度都找全了,并且这些角度都分析清楚了,问题领域也就解决了。虽然这些抽象角度在思考的时候可能是互不相连的

具体来说,做需求的时候,首要目标不是要弄清楚业务是如何一步一步完成的,而是要:

  • 弄清楚有多少业务的参与者?
  • 每个参与者的目标是什么?

参与者的目标就是你的抽象角度。与分析一个复杂的业务流程相比,单独分析参与者的一个个目的要简单的多。实际上,这就是用例!这就是为什么永猎会成为业务建模的方法的原因之一。

什么是模?

一个由抽象角度确定的目标需要由静态的事物加上特定条件下产生的一个特定的场景来完成,即:

  • 静态的事物(物)+特定的条件(规则)+ 特定的动作(参与者的驱动)
    • = 特定的场景(事件)

模就是“人”、“事”、“物”、“规则”

第七章-链接

Posted on 2018-12-09 | In 《深入理解计算机系统》

概述

链接(linking)是将各种代码和数据片段搜集并组合成为一个单一文件的过程,这个文件可被加载(复制)到内存并执行。

  • 链接可以执行于编译时(compile time),也就是在源代码被翻译成机器代码时;
  • 也可以执行于加载时(load time),也就是在程序被加载(loader)加载到内存并执行时;
  • 甚至于执行于运行时(run time),也就是由应用程序来执行。

在早期的计算机系统中,链接是手动执行的。在现代系统中,链接是由连接器(linker)的程序自动执行的。

连接器在软件开发中扮演一个重要的角色,因为它们使得分离编译(separate compilation)成为可能。

我们不用将一个大型的应用程序组织为一个巨大的源文件,而是可以吧它分解成为更小、更好管理的模块,可以独立地修改和编译这些模块。当我们改变这些模块中的一个时,只需简单地重新编译它,并重新连接应用,而不必重新编译其它文件。

为什么需要连接的知识?

  • 理解连接器将帮助构造大型程序
    • 构建大型程序经常会遇到缺少模块、缺少库或者不兼容的库版本引起的连接器错误。
    • 除非你理解连接器是如何解析引用、什么是库以及连接器是如何使用库来解析引用的,菲欧这类错误将令你感到迷惑和挫败
  • 帮助避免一些危险的编译错误

    • Linux连接器解析符号引用时所做的决定可以不动声色地影响你程序的正确性。
  • 帮助理解语言的作用域规则是如何实现的

    • 全局和局部变量之间的区别是什么?当你定义一个具有static属性的变量或者函数时,实际到底意味着什么?
  • 理解其它重要的系统概念

    • 连接器产生的可执行目标文件在重要的系统功能中扮演着关键角色,比如加载和运行程序、虚拟内存、分页、内存映射。
  • 将使你能够利用共享库

    • 随着共享库和动态链接在现代操作系统中重要性的日益增强,链接成为一个复杂的过程。比如,许多软件产品在运行时使用共享库来升级压缩包装的(shrink-wrapped)二级制程序。还有,大多数Web服务器都依赖于共享库的动态链接来提供内容。

这一章提供了关于链接各方面的全面讨论,从传统静态链接到加载时的共享库的动态链接,以及到运行时的共享库的动态链接。

无论什么样的操作系统,ISA或者目标文件格式、基本的链接概念是通用的。

编译器驱动程序

静态链接

静态连接器(static linker)以一组可重定位目标文件和命令行参数作为输入,生成一个完全链接的、可以加载和运行的可执行目标文件作为输出。

输入的可重定位目标文件由各种不同的代码和数据结节(section)组成,每一节都是一个连续的字节序列。指令在一节中,初始化了的全局变量在另一节中,而未初始化的变量又在另外一节中。

为了构造可执行文件,链接器必须完成两个主要任务。

  • 符号解析(symbol resolution)。目标文件定义和引用符号,每个符号对应于一个函数、一个全局变量或一个静态变量(即C语言中任何以static属性声明的变量)。

    • 符号解析的目的是将每个符号引用正好和一个符号定义关联起来。
  • 重定位(relocation)。编译器和汇编器生成从地址0开始的代码和数据节。链接器通过把每个符号定义与一个内存位置关联起来,从而重定位这些节,然后修改所有对这些符号的引用,使得它们指向这个内存位置。链接器使用汇编器产生的重定位条目(relocation entry)的详细指令,不加甄别地执行这样的重定位。

要记住关于链接器的一些基本事实:

  1. 目标文件纯粹是字节块的集合
  2. 这些块中,有些包含程序代码,有些包含程序数据,而其他的则包含引导链接器和加载器的数据结构。
  3. 链接器将这些块连接起来,确定被链接块的运行时位置,并且修改代码和数据块中的各种位置。

目标文件

目标文件有三种形似:

  • 可重定向目标文件

    • 包含二进制代码和数据,其形式可以在编译时与其他可重定位目标文件合并起来,创建一个可执行目标文件。
  • 可执行目标文件

    • 包含二进制代码和数据,其形式可以被直接复制到内存并执行。
  • 共享目标文件

    • 一种特殊类型的可重定位目标文件,可以在加载或者运行时被动态地加载进内存并连接。

编译器和汇编器生成可重定位目标文件(包括共享目标文件)。
连接器生成可执行目标文件
。

从技术上来说,一个目标模块(object module)就是一个字节序列,而一个目标文件(object file)就是一个以文件形式存放在磁盘中的目标模块。

可重定向目标文件

符号和符号表

符号解析

重定位

可执行目标文件

加载可执行文件

动态链接共享库

位置无关代码

库打桩机制

处理目标文件的工具

小结

模板

Posted on 2018-12-09

ARTS模板

  1. Algorithm:每周至少做一个 leetcode 的算法题
1
2


  1. Review:阅读并点评至少一篇英文技术文章
  1. Tip:学习至少一个技术技巧
  1. Share:分享一篇有观点和思考的技术文章

ARTS-第四周挑战

Posted on 2018-12-09 | In ARTS
  1. Algorithm:每周至少做一个 leetcode 的算法题

判断一个链表是否有环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public boolean hasCycle(ListNode head) {
if (head == null) {
return false;
}
ListNode fast , slow ;
slow = head;
fast = head;
while (slow.next != null && fast.next!=null && fast.next.next != null) {
slow = slow.next;
fast = fast.next.next;

if (slow == fast) {
return true;
}
}
return false;

}
  1. Review:阅读并点评至少一篇英文技术文章

    clean code

    为什么我们要写好的代码,以及我们最低的标准是什么。
  1. Tip:学习至少一个技术技巧

    UML图 : 连接抽象世界和现实世界的重要桥梁(未完成,正在学习中,学完一并发)
  1. Share:分享一篇有观点和思考的技术文章

    架构设计的目的

UML笔记一

Posted on 2018-12-07 | In uml

基础篇:

  • 核心元素

    • 描述基本事物
  • 核心视图

    • 表达这些事物构成的有意义的观点
  • 核心模型

    • 使用视图来描述某种需求、

建立模型是人们解决现实世界问题的一种常用手段。我们通常接触建模是为了解决某个问题而建立的一个数学模型,通过对数学计算来分析和预测,找出解决问题的办法

从理论上来说,建立模型是指通过对客观事物建立一种抽象的方法,用来表征事物,以获得对事物本身的理解,再把这种理解概念化

1.2.4 从现实世界到业务模型

UML提供以下元素来为现实世界建立模型:

  1. UML采用被称之为参与者(actor)的元模型作为信息来源提供者

    • 参与者代表了现实世界的“人”。参与者是模型信息来源的提供者,也是第一驱动者。
    • 换句话说,要建立的模型的意义完全被参与者决定,所建立的模型也是完全为参与者服务的,参与者是整个建模过程的中心。
  2. UML采用被称之为用例(use case)的一种元模型来表示驱动者的业务目标,也就是参与者想要做什么并且获得什么。

    • 这个业务目标就是现实世界中的“事”。
    • 而这件事是怎么做的,依据什么规则,则通过被称之为业务场景(business scenario)和用例场景(use case scenario)的UML视图来描绘的,这些场景便是现实世界中的“规则”。
    • 最后,UML通过被称之为业务对象模型(business object model)的视图来说明在达成这些业务目标的过程中涉及到的事物,用逻辑概念来表示他们,并定义他们之间的关系。
    • 业务对象模型则代表了现实世界中的“物”

1.2.5 从业务模型到概念模型

虽然上一节中现实世界被业务模型映射并且记录下来,但这只是原始需求信息,距离可执行的代码还很遥远,必须把这些内容再换成一种可以指导开发的表达方式.

UML通过被称之为概念化的过程(Conceptual)来建立适合计算机理解和实现的模型,这个模型称为分析模型(Analysis Model)。分析模型介于原始需求和计算机实现之间,是一种过渡模型。

  • 分析模型向上映射了原始需求,计算机的可执行代码可以通过分析模型追溯到原始需求;
  • 同时,分析模型向下为计算机实现规定了一种高层次的抽象,这种抽象是一种指导,也是一种约束,计算机实现过程非常容易遵循这种指导和约束来完成可执行代码的设计工作

绘制分析模型最主要的元模型有:

  • 边界类(boundary)

    • 狭义上说:边界就是大家熟悉的界面,所有对计算机的操作都要通过界面进行。
    • 从广义上说:任何一件事物都分为里面和外面,外面的事物与里面的事物之间的任何交互都需要有一个边界。

      • 比如参与者与系统的交互,系统与系统之间的交互,模块与模块之间的交互等。只要是两个不同职责的簇之间的交互都需要有一个边界
      • 换句话说,边界决定了外面能对里面做什么“事”。边界能够决定整个分析设计的结果。
  • 实体类(entity)

    • 原始需求中领域模型中的业务实体映射了现实世界中参与者完成业务目标时所涉及的事物,UML采用实体类来重新表达业务实体。实体类可以采用计算机观点在不丢失业务实体信息的条件下重新归纳和组织信息,建立逻辑关联,添加哪些实际业务中不会使用到,但是执行计算机逻辑时需要的控制信息等。
    • 这些实体类可以看作是业务实体的实例化结果。
  • 控制类(control)

    • 控制类(control)。边界和实体都是静态的,本身并不会动作。UML采用控制类来表达原始需求中的动态信息,即业务或用例场景中的步骤和活动。从UML的观点看来,边界类和实体类之间,边界类和边界类之间,实体类和实体类之间不能够直接相互访问,它们需要通过控制类来代理访问要求。

只要有人、事、物和规则(定语),就能构成一个有意义的结果,无非是否合理而已,。

分析类也是应用这个道理来把业务模型概念化的,

  1. 事:由于所有的操作都通过边界类来行进,能做什么不能做什么由边界决定,所以边界类实际上代表了原始需求中的“事”;
  2. 物:实体类则由业务模型中的领域模型转化而来,它代表了现实世界上的“物”;
  3. 规则:控制类则体现了现实世界中的“规则”,也就是定语;
  4. 用户:再加上由参与者转化而来的系统的“用户”,

这样一来,“人”也有了。有了人、事、物、规则,我们就可以组合成各种各样的语句。不过不能随意组合,而是要依赖业务模型中已经描绘出来的用例场景来组合这些元素,让它们表达特定的业务含义。

1.2.6 从概念模型到设计模型

概念模型使我们获得了软件的蓝图,获得了建设软件所需要的所有组成内容以及建设软件所需要的所有必要细节。

设计模型的工作就是建筑零部件,组装汽车的过程。
在大多数情况下,实现类可以简单地从分析类映射而来。
在设计模型中,



- 概念模型中的边界类可以被转化为操作界面或者系统接口;
- 控制类可以被转化为计算程序或控制程序,列如工作流、算法体等;
- 实体类可以转化为数据库表、XML文档或者其他带有持久化特征的类。这个转化过程也是有章可循的,一般来说,可以遵循的规则有:

- 软件架构和框架。软件架构和框架规定了实现类必须实现的接口、必须继承的超类、必须遵守的编程规则等。
- 编程语言。各类编程语言有不同的特点,例如在实现一个界面或者一个可持久化类时,采用C++还是Java作为开发语言会有不同的设计要求。
- 规范或中间件。如果决定采用某个规范或采用某个中间件时,实现类还要遵循规范或中间件规定的那些必须特性。

实际上,由于软件项目可以选择不同的软件架构和框架,可以选择不同的编程语言,也可以选择不同的软件规范,还可以购买不同的中间件,因此同样的概念模型会因为选择不同而得到不同的设计模型。

复杂度分析(下)

Posted on 2018-12-06 | In 算法

浅析:

复杂度分析(上)

Posted on 2018-12-04 | In 算法

复杂度分析:如何分析,统计算法的执行效率和资源消耗

  • 算法和数据结构解决的是“快”和“省”的问题,即如何让代码运行的更快,如何让代码更节省资源。
  • 复杂度分析是整个算法学习的精髓,只要掌握了它,算法和数据结构就掌握了一半了

为什么需要复杂度分析

事后统计法

  • 测试结果非常依赖于测试环境
  • 测试结果规模受数据规模影响很大

我们需要一个不需要依赖于测试环境,就可以粗略的估算整个算法的执行效率的方法

大O复杂度表示法
  • 所有代码的执行时间T(n)与每行代码的执行次数n成正比。

    • 公式: T(n) = O(f(n))

      • T(n) 它表示代码执行的时间
      • n 代表示数据规模的大小
      • f(n) 表示每行代码执行次数的总数。

大O时间复杂度表示法

大O时间复杂度实际上并不具体表示代码真正运行的时间,而是表示代码执行时间随着数据规模增长的变化趋势。所以,也叫做渐进复杂度分析(asymptotic time complexity),简称时间复杂度

时间复杂度分析

这有三种比较实用的方法,进行时间复杂度分析

  1. 只关注循环次数最多的一段代码
  2. 加法法则,总复杂度等于量级最大的那段代码的复杂度
  3. 乘法法则,嵌套代码的复杂度等于嵌套内外代码复杂度的乘积

空间复杂度分析

渐进空间复杂度:算法的执行所需要的空间与数据规模之间的增长关系表示

ARTS-第三周挑战

Posted on 2018-12-02 | In ARTS
  1. Algorithm:每周至少做一个 leetcode 的算法题

    swap nodes(链表两两交换结点)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode swapPairs(ListNode head) {
if(head == null) return head;
return swapPairs(head,head.next);
}


public ListNode swapPairs(ListNode currentNode, ListNode nextNode) {
if (currentNode == null) {
return currentNode;
}

if (nextNode == null) {
return currentNode;
}
ListNode newHead,changedNextNode,newCurrent;

changedNextNode = swapNode(currentNode, nextNode);
newHead = nextNode;

newCurrent = changedNextNode.next;
if (newCurrent == null || newCurrent.next == null) {
return newHead;
}

swapPairs(changedNextNode, newCurrent, newCurrent.next);

return nextNode;
}

public void swapPairs(ListNode prevNode,ListNode currentNode , ListNode nextNode){
if(currentNode ==null || nextNode == null) return ;

ListNode changeLastNode;
changeLastNode = swapNode(prevNode,currentNode,nextNode);

prevNode = changeLastNode;
currentNode = changeLastNode.next;
if(currentNode == null)
return ;
nextNode = changeLastNode.next.next;

swapPairs(prevNode,currentNode,nextNode);
}

public ListNode swapNode(ListNode prev,ListNode currentNode ,ListNode next){
ListNode tempNode;

tempNode = next.next;
next.next = currentNode;
currentNode.next = tempNode;
prev.next = next;

return currentNode;
}

public ListNode swapNode(ListNode currentNode,ListNode nextNode)
{
ListNode temp;

temp = nextNode.next;
nextNode.next = currentNode;
currentNode.next = temp;

return currentNode;
}
}
  1. Review:阅读并点评至少一篇英文技术文章

    为什么你应该学习go语言

看下来的好处,我认为是,go天生适合于多核心,多线程的操作环境,内存开销相较于java创建一个thread小太多,并且线程之间的通信困难,用goroutine,内存消耗少,更容易编程使用

  1. Tip:学习至少一个技术技巧

    vim常用快捷键
  1. Share:分享一篇有观点和思考的技术文章

    架构设计的目的

读书随笔

Posted on 2018-12-02 | In 随笔记录
  1. 在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。

    • 用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件:
    • 浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器:
  2. ASC|| -> 1字节

    • Unicode -> 2字节 (因为全英文会大量浪费)

      • UTF-8 -> 1-6字节 (可变长的编码,汉字通常3个字节)
1234
luowen

luowen

Blogging is a little fun

37 posts
16 categories
16 tags
© 2019 luowen
Powered by Hexo
Theme - NexT.Mist
访问人数 人 总访问量 次