Anonymous World

迷失仙境


  • 首页

  • 标签

  • 分类

  • 归档

六大设计原则

发表于 2020-03-15 | 分类于 Design Pattern
字数统计: 3,356

设计模式(Design Pattern,DP)能指导你如何去设计一个优秀的架构、编写一段健壮的代码、解决一个复杂的需求。

为了便于理解,先回顾下类图、对象图和包图中的主要建模元素:

单一职责原则

单一职责原则的英文名称是Single Responsibility Principle,简称是SRP。
单一职责原则的定义是:应该有且仅有一个原因引起类的变更。用“职责”或“变化原因”来衡量接口或类设计得是否优良

单一职责适用于接口、类,同时也适用于方法

看一个例子:
RBAC模型(Role-Based Access Control,基于角色的访问控制),通过分配和取消角色来完成用户权限的授予和取消,把用户的信息抽取成一个BO(Business Object,业务对象),把行为抽取成一个Biz(Business Logic,业务逻辑)

阅读全文 »

GC机制

发表于 2020-03-13 | 分类于 Java
字数统计: 9,758

对象分配、布局和访问

创建

当Java虚拟机遇到一条字节码new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程

对象所需内存的大小在类加载完成后便可完全确定,当使用Serial、ParNew等带压缩整理过程的收集器时,系统采用的分配算法是指针碰撞,堆中内存是绝对规整的,分配内存就仅仅是把那个指针向空闲空间方向挪动一段与对象大小相等的距离;而当使用CMS这种基于清除(Sweep)算法的收集器时,理论上就只能采用较为复杂的空闲列表来分配内存。在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录

线程安全问题有两种可选方案:一种是对分配内存空间的动作进行同步处理——实际上虚拟机是采用CAS配上失败重试的方式保证更新操作的原子性;另外一种是把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在Java堆中预先分配一小块内存,称为本地线程分配缓冲(Thread Local Allocation Buffer,TLAB),哪个线程要分配内存,就在哪个线程的本地缓冲区中分配,只有本地缓冲区用完了,分配新的缓存区时才需要同步锁定。虚拟机是否使用TLAB,可以通过-XX:+/-UseTLAB参数来设定。

在eden中内存分配完成之后,虚拟机必须将分配到的内存空间(但不包括对象头)都初始化为零值,如果使用了TLAB的话,这一项工作也可以提前至TLAB分配时顺便进行。这步操作保证了对象的实例字段在Java代码中可以不赋初始值就直接使用,使程序能访问到这些字段的数据类型所对应的零值。

接下来,Java虚拟机还要对对象进行必要的设置,例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码(实际上对象的哈希码会延后到真正调用Object::hashCode()方法时才计算)、对象的GC分代年龄等信息。这些信息存放在对象的对象头(Object Header)之中。

在上面工作都完成之后,从虚拟机的视角来看,一个新的对象已经产生了。但是从Java程序的视角看来,对象创建才刚刚开始——构造函数,即Class文件中的()方法还没有执行,所有的字段都为默认的零值,new指令之后会接着执行()方法,按照程序员的意愿对对象进行初始化,这样一个真正可用的对象才算完全被构造出来。

将对象引用入栈,继续执行下一条指令

布局


在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。

阅读全文 »

LC-字符串专题(一)

发表于 2020-03-11 | 分类于 DataStructure
字数统计: 2,798

3 无重复字符的最长子串【中】


思路:感觉有点难的亚子..因为重复出现的位置无法预料,那么下一次寻找的开始位置如何确定,难道用暴力解法依次遍历?首次,如何判断和记录重复,每次用一个哈希表?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length(), ans = 0;
Map<Character, Integer> map = new HashMap<>();
for (int end = 0, start = 0; end < n; end++) {
char alpha = s.charAt(end);
if (map.containsKey(alpha)) {
start = Math.max(map.get(alpha), start);
}
ans = Math.max(ans, end - start + 1);
map.put(s.charAt(end), end + 1);
}
return ans;
}
}
  • 用滑动窗口替代复杂度为$O(n^2)$的暴力解法,核心是要记录下重复位置用于窗口滑动
  • 定义一个 map 数据结构存储 (k, v),Map<Character, Integer> map = new HashMap<>();其中 key 值为字符,value 值为字符位置 +1,加 1 表示从字符位置后一个才开始不重 复, 同时存位置的方法可以从始至终只用一个哈希表即可
  • start = Math.max(map.get(alpha), start);start取更大的值,一方面start保证不会后退;另一方面value 值为重复字符上一次的位置 +1,下一次的最长必不包含本次重复的这一段,故直接跳到本次重复第一个字符的下一位置
    +无论是否更新 start,都会更新其 map 数据结构和结果 ans ans = Math.max(ans, end - start + 1);
  • 字符串方法:string.length() string.charAt(pos)
  • hashmap方法:hashmap.containsKey(key) hashmap.put(key,value)
  • Math.max(value1,…)
  • 哈希表还可以直接用int[26] 来代替
阅读全文 »

Linux命令之文件与权限管理

发表于 2020-03-09 | 分类于 OS
字数统计: 5,884

ext4

Linux目前使用的是ext4文件系统

ext4文件系统会把分区主要分为两大部分(暂时不提超级块):一小部分用于保存文件的inode(i节点)信息;剩余的大部分用于保存block信息。
inode的默认大小为128 Byte,用来记录文件的权限(r、w、x)、文件的所有者和属组、文件的大小、文件的状态改变时间(ctime)、文件的最近一次读取时间(atime)、文件的最近一次修改时间(mtime)、文件的数据真正保存的block编号。每个文件需要占用一个inode。

inode中是不记录文件名的,那是因为文件名记录在文件所在目录的block中。

阅读全文 »

线程池与生产者/消费者模型

发表于 2020-03-08 | 分类于 Java
字数统计: 3,187

ULT&KLT



JVM在采用的是KLT模式,虽然并发程度高,但是可能会造成资源的浪费。

阅读全文 »

数据库影响因素之硬件、存储引擎和事务

发表于 2020-03-07 | 分类于 database
字数统计: 3,156

影响数据库的因素

  1. Sql查询速度
  2. 服务器硬件
  3. 存储引擎
  4. 大表
  5. 大事务

服务器硬件

CPU

MYSQL不支持多核并发,会带来两方面的风险:

  • 大量的并发使数据库连接数被占满。max_connection 默认为100
  • CPU耗尽导致宕机
    QPS:每秒钟处理的查询量

更多核数还是更高频率视具体情况而定:高并发选更多核;CPU密集和复杂SQL选更高频率

磁盘IO

硬件升级
调整计划任务,避开高峰期,做好磁盘维护

RAID

RAID(Redundant Array of Independent Disks,独立磁盘冗余数组)的基本思想就是把多个相对便宜的硬盘组合起来,成为一个磁盘数组,使性能达到甚至超过一个价格昂贵、容量巨大的硬盘。

RAID 0:将多个磁盘合并成一个大的磁盘,不会有冗余,并行I/O,速度最快。在所有的级别中,RAID 0的速度是最快的。理论上,多磁盘的效能就等于(单一磁盘效能)×(磁盘数),但实际上受限于总线I/O瓶颈及其他因素的影响,RAID效能会随边际递减。也就是说,假设一个磁盘的效能是50MB/s,两个磁盘的RAID 0效能约96MB/s,三个磁盘的RAID 0也许是130MB/s而不是150MB/s。

RAID 1:两组以上的N个磁盘相互作为镜像,在一些多线程操作系统中能有很好的读取速度,但写入速度略有降低。RAID 1的数据安全性在所有的RAID级别上来说是最好的。但是所有RAID中磁盘利用率最低的一个级别。

RAID 5:是一种存储性能、数据安全和存储成本兼顾的存储解决方案。它使用的是Disk Striping(硬盘分区)技术。RAID 5至少需要三个硬盘,RAID 5不对存储的数据进行备份,而是把数据和相对应的奇偶校验信息存储到组成RAID 5的各个磁盘上,并且奇偶校验信息和相对应的数据分别存储于不同的磁盘上。当RAID 5的一个磁盘数据发生损坏后,利用剩下的数据和相应的奇偶校验信息去恢复被损坏的数据。写入数据的速度相当慢,若使用Write Back可以让性能改善不少。

阅读全文 »

VUE+ElementUI+SpringBoot实现前后端分离

发表于 2020-03-06 | 分类于 frontend
字数统计: 3,321

环境配置

安装node与npm

sudo apt-get install -y nodejs

配置运行路径

sudo ln -s /usr/bin/nodejs /usr/bin/node

但是npm用同样的方法处理,报错:

bash: /usr/bin/npm: 符号连接的层数过多升级node到指定版本,后面接版本号

先寻找路径:whereis npm 然后查看该目录下路径,删掉有误的

然而再安装npm时却没有对应的包(我还以为跟windows一样npm会跟node一起安装呢..)

sudo apt remove nodejs 先删除了看看有没有别的包可用

看了下BBS,好像是官方apt源有点问题一直安装不了npm

尝试安装nodejs-bin, 查询npm时仍然

bash: /usr/bin/npm: 权限不够

寻找npm sudo find / -name npm

看到可以用nvm来解决这个问题

阅读全文 »

黑盒测试用例设计

发表于 2020-03-05 | 分类于 Test
字数统计: 3,033

测试用例的构成要素

  • 用例编号:唯一标识 如QQmail_login_001
  • 用例标题:简要描述测试目的 何种情况下做何事有何结果
  • 测试项目:所属项目
  • 用例级别:重要程度,优先级 P1>P2>P3
  • 预设条件:执行前提,如环境/数据 — 非必须
  • 测试输入
  • 执行步骤
  • 预期结果:与执行的实际结果对比

在实际中根据项目要求对用例设计要素进行调整

黑盒测试用例设计方法

从理论上讲,黑盒测试只能通过穷举输入测试。但是实际工作中这种方法是不可行的。所以衍生出多种黑盒测试用例设计方法,包括等价类划分法、边界值分析法、错误推测法、因果图发、判定表驱动法、正交试验设计法、功能图法、场景法等。

等价类

分类代替穷举,根据功能需求分类

等价类:在所有测试的数据中,具有某种共同特征的子集

等价划分:是把程序的输入域划分成若干部分(子集),然后从每个部分中选取少数代表性数据作为测试用例。每一类的代表性数据在测试中的作用等价于这一类中的其他值。

有效等价类:是指对于程序的规格说明来说是合理的,有意义的输入数据构成的集合.利用有效等价类可检验程序是否实现了规格说明中所规定的功能和性能。

无效等价类:与有效等价类的定义恰巧相反。无效等价类中是无效输入,系统预期返回一个错误值。测试无效输入能确保软件具有更高的可靠性。

设计测试用例时,要同时考虑这两种等价类.因为,软件不仅要能接收合理的数据,也要能经受意外的考验.这样的测试才能确保软件具有更高的可靠性。

阅读全文 »

IDEA内置Database插件连接Deepin上的MySql

发表于 2020-03-04 | 分类于 database
字数统计: 574

配置server

sudo apt-get install -y mysql-server mysql-client 安装

sudo mysql -uroot -p 初始密码直接空格

进入Mysql命令行

use mysql;

update user set authentication_string='新密码' where user='root'; 注意修改密码要加单引号

阅读全文 »

Git关联Github和码云并利用IDEA内置工具

发表于 2020-03-02 | 分类于 Project
字数统计: 1,535

Git教程

Git与Svn对比

Svn是集中式版本控制系统,必须联网才能工作。在一定成程度上可以看到其他开发人员在干什么,管理员也可以很轻松的掌握每个人的开发权限。

缺点:服务器单点故障;容错性差

Git是分布式版本控制系统,每人的电脑上有一个完整的本地仓库,多人协作时只需要把各自的修改推送给对方

初次使用配置

安装git sudo apt-get install git

配置用户名和邮箱 git config --global user.name "用户名" git config --global user.email "邮箱"

生成ssh公匙、私匙 ssh-keygen -t rsa -C "your_email@youremail.com"三次回车

将id_rsa.pub的内容追加到authorized_keys 中 cat /home/wliana/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

其中id_rsa 为私钥,id_rsa.pub 为公钥

在github,进入Account Settings,左边选择SSH Keys,Add SSH Key, 粘贴cat /home/deepin/.ssh/id_rsa.pub获取的key

测试下是否配置成功 ssh -T git@github.com 按提示输入 yes 连接成功

阅读全文 »
1…456…13
Liana_Wang

Liana_Wang

虚己以游世,乘物以游心

125 日志
22 分类
94 标签
GitHub E-Mail
友链
  • 瑞哥上班又开始划水看书了
© 2018 — 2020 Liana_Wang
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4