技术文章

“微笑涛声”微信公众号正式上线运行

我只是一个虾纸丫 提交于 2021-02-18 10:52:45
2020年2月2日,微笑涛声个人博客上线,经过一年多的更新,写了原创文章125篇,访问达到8万次以上,百度收录500+,自己也成长了许多。 ▣ 博主主站地址: 微笑涛声 【www.cztcms.cn】 ▣ 博主其他平台: CSDN 简书 开源中国 思否 华为云博客 2021年2月18日,“微笑涛声”微信公众号正式上线运行,秉承分享学习心得、记录自己生活点滴、探索互联网技术。 欢迎各位小伙伴关注!微信搜索“微笑涛声”或者扫描以下二维码即可关注! 新发布文章与主站同步更新。2021年2月18之前发布的文章会陆续迁移至微信公众号。 来源: oschina 链接: https://my.oschina.net/cztblog/blog/4953520

中介者模式

喜夏-厌秋 提交于 2021-02-18 10:50:45
1.1 中介者 1.1.1 定义 中介者模式 (Mediator Pattern) 也称为调解者模式或调停者模式,Mediator 本身就有调停者和调解者的意思。在日常生活中调停者或调解者这个角色我们见得比较多的是 ”和事佬“,也就是说调解两个有争端的人的角色。中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用,从而使他们可以松散偶合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用,保证这些作用可以彼此独立变化。中介者模式将多对多的相互作用转化为一对多的相互作用,将对象的行为和协作抽象化,把对象在小尺度的行为上与其他对象的相互作用分开处理。 1.1.2 角色 UML Mediator: 抽象中介者角色,定义了同事对象到中介者对象的接口,一般以抽象类的方式实现。 ConcreteMediator: 具体中介者角色,继承于抽象中介者,实现了父类定义的方法,它从具体的同事对象接收消息,向具体同事对象发出命令。 Colleague: 抽象同事类角色,定义了中介者对象的接口,它只知道中介者而不知道其它的同事对象。 ConcreteColleagueA/B: 具体同事类角色,继承于抽象同事类,每个具体同事类都知道本身在小范围内的行为,而不知道它在大范围内的目的。 1.1.3 代码 public class Demo { public static

白鹭引擎EUI做H5活动 入门篇

两盒软妹~` 提交于 2021-02-18 10:47:57
前言: 本学习文档的目的是为了实现h5,或者简单的h5游戏,比如说,我们要实现一个可以左右,或者上下移动的场景的h5,在场景移动的过程中,会有相应的动画或者操作,我们通过 js 也可以实现,但是为了流畅度和更好的效果,还是需要借助一些引擎来实现,比如说 2d的渲染引擎 pixi.js 或者是本文档要学习的 Egret (白鹭)引擎; 作为刚接触游戏引擎的人,虽然没有相关使用经验,但是也听说过相关内容;几年前接触过 Cocos (游戏引擎),所以也只了解这么一个游戏引擎,最近随着h5和小游戏的发展,也听说了 Egret (白鹭游戏引擎),现在记录一下学习的过程,虽然现在还是一无所知,还是记录一下; 第一步: Egret(白鹭游戏引擎),第一步,[下载]( https://egret.com/downloads/engine.html )一下 Egret , 也就是 Egret Launcher,这是一个工具,可以帮助我们建立项目,也就是一个辅助的工具 ,不管是什么,先下载再说。 通过这个Egret Launcher 工具,我们需要再下载一下游戏引擎,我们在这个 Egret Launch界面中,找到引擎列表,然后选择一个版本的引擎下载,我这里下载一个,最新的引擎版本 5.2.29 ; 第二步: 通过这个Egret Launcher 工具,我们可以下载一下官方的编辑器 Egret

线程池参数及队列

孤人 提交于 2021-02-18 10:47:41
线程池中各个参数的含义 参数名 含义 corePoolSize 核心线程数 maximumPoolSize 最大线程数 keepAliveTime+时间单位 空闲线程的存活时间 workQueue 用于存放任务的队列 threadFactory 线程工厂、用来创建新线程 handler 处理别拒绝的任务 corePoolSize是核心线程数,也就是常驻线程池的线程数量,与它对应的是maximumPoolSize,表示线程线程池最大线程数量,当任务特别多对而corePoolSize核心线程数无法满足需求时,就会向线程池中增加线程,以便应对突增的情况。 线程创建流程 如上图所示,当提交任务的时候,会先检查当前的线程数,如何小于核心线程数,则新建线程bin执行任务,当线程达到核心线程数,此时就会将任务放到workQueue队列中,等核心线程数执行完从workQueue中取出任务。如果workQueue的容量到达上过线,这时候就会启用后备力量,也就是maximumPoolSize最大线程数。线程池的添加顺序是corePoolSize、workQueue、maximumPoolSize。 线程池的拒绝策略 ThreadPoolExecutor.AbortPolicy 这种拒绝策略在拒绝任务时,会直接抛出一个类型为 RejectedExecutionException 的

函数计算的可观测性

我是研究僧i 提交于 2021-02-18 10:45:48
作者 | 夏莞 阿里巴巴函数计算团队 本文整理自 《Serverless 技术公开课》 导读 :本文主要分为三个部分:概述中介绍可观测性的基本概念,主要包括 Logging、Metrics、Tracing 三个方面;然后详细介绍函数计算上的 Logging、Metrics、Tracing;最后以几个常见场景为例,介绍在函数计算中如何快速定位问题并解决问题。 概述 可观测性是什么呢?维基百科中这样说:可观测性是通过外部表现判断系统内部状态的衡量方式。 在应用开发中,可观测性帮助我们判断系统内部的健康状况。在系统出现问题时,帮助我们定位问题、排查问题、分析问题;在系统平稳运行时,帮助我们评估风险,预测可能出现的问题。评估风险类似于天气预报,预测到明天下雨,那出门就要带伞。在函数计算的应用开发中,如果观察到函数的并发度持续升高,很可能是业务推广团队的努力工作导致业务规模迅速扩张,为了避免达到并发度限制触发流控,开发者就需要提前提升并发度。 可观测性包括三个方面:Logging、Metrics、Tracing Logging 是日志,日志记录了函数运行中的关键信息,这些信息是离散且具体的,结合错误日志与函数代码可以迅速定位问题。 Metrics 是指标,是聚合的数据,通常以图表的形式展现。图表中的 tps、错误率等核心指标,可以反映函数的运行情况与健康状况。 Tracing 是链路追踪

2017-2018-2 20179226 《网络攻防》第11周作业

冷暖自知 提交于 2021-02-18 10:45:20
研究缓冲区溢出的原理,至少针对两种数据库进行差异化研究 原理 在计算机内部,输入数据通常被存放在一个临时空间内,这个临时存放的空间就被称为缓冲区,缓冲区的长度事先已经被程序或者操作系统定义好了。向缓冲区内填充数据,如果数据的长度很长,超过了缓冲区本身的容量,那么数据就会溢出存储空间,而这些溢出的数据还会覆盖在合法的数据上,这就是缓冲区和缓冲区溢出的道理。 对抗缓冲区溢出攻击 1、栈随机化   为了在系统中插入攻击代码,攻击者不但要插入代码,还要插入指向这段代码的指针,这个指针也是攻击字符串的一部分。产生这个指针需要知道这个字符串放置的栈地址。在过去,程序的栈地址非常容易预测,在不同的机器之间,栈的位置是相当固定的。 栈随机化的思想使得栈的位置在程序每次运行时都有变化。因此,即使许多机器都运行相同的代码。它们的栈地址都是不同的。 实现的方式是:程序开始时,在栈上分配一段0--n字节之间的随机大小空间。程序不使用这段空间,但是它会导致程序每次执行时后续的栈位置发生了变化。 在Linux系统中,栈随机化已经变成了标准行为。(在linux上每次运行相同的程序,其同一局部变量的地址都不相同) 2、栈破坏检测   在C语言中,没有可靠的方法来防止对数组的越界写,但是,我们能够在发生了越界写的时候,在没有造成任何有害结果之前,尝试检测到它。 最近的GCC版本在产生的代码中加入了一种栈保护者机制

HelloWorld 基础语法

人走茶凉 提交于 2021-02-18 10:45:00
所有内容取自菜鸟教程 public class HelloWorld { /* 第一个Java程序 * 它将打印字符串 Hello World */ public static void main ( String [ ] args ) { System . out . println ( " Hello World " ) ; // 打印 Hello World } } 打开记事本,把上面的代码添加进去; 把文件名保存为:HelloWorld.java; 打开cmd命令窗口,进入目标文件所在的位置,进入E: 在命令行窗口键入 javac HelloWorld.java 按下enter键编译代码。如果代码没有错误,cmd命令提示符会进入下一行。(假设环境变量都设置好了)。 再键入java HelloWorld 按下Enter键就可以运行程序。 编写Java程序时,应注意以下几点: 大小写敏感 :Java是大小写敏感的,这就意味着标识符Hello与hello是不同的。 类名 :对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字母应该大写,例如 MyFirstJavaClass 。 方法名 :所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字母大写。 源文件名 :源文件名必须和类名相同。当保存文件的时候

算法——算法的时间与空间复杂度

对着背影说爱祢 提交于 2021-02-18 10:44:34
算法的时间与空间复杂度 事后分析法 缺点:不同的数据规模,不同的机器下算法运行的时间不同,无法做到计算运行时间 事前分析法 大O时间复杂度 渐进时间复杂度 随着n的增长,程序运行时间跟随n变化的趋势 几个原则 去掉常数项 2(n^2) =n^2 一段代码取时间复杂度最高的 test(n) { //时间复杂度n^3 for(int i = 0; i < n ; i++){ for(int i = 0; i < n ; i++){ for(int i = 0; i < n ; i++){ print(n); } } } //时间复杂度n^2 for(int i = 0; i < n ; i++){ for(int i = 0; i < n ; i++){ print(n); } } //时间复杂度n for(int i = 0; i < n ; i++){ print(n); } } 这段代码的时间复杂度为n^3+n^2+n 当n足够大时,n^2和n与n^3相比太小,可以忽略不计 常见复杂度 o(1) i = i + 1; o(n) test(n){ for(int i = 0 ;i < n;i++){ print(i); } } o(n^2) test(n){ for(int i = 0 ;i < n;i++){ print(i); for(int j = 0 ;j < n;j++)

Fluttr应用——5个高效的Flutter开发工具

百般思念 提交于 2021-02-18 10:44:26
1.你是否需要更好,更简洁的日志 当你在开发Flutter应用程序时,难以理解的日志是一个大问题,因为没有快速的方法来根据问题的严重程度过滤你的日志。抛出异常或记录一条简单的调试消息?他们看起来都一样。 如果你的Flutter app需要更好的日志系统, Logger 软件包绝对是个好东西。 Logger 包地址: https://pub.dev/packages/logger 它受到Java分级日志的启发,允许您向日志添加级别。 日志级别,目前有: logger.v("Add more detailed debug messages, " "can contain sensitive information, never enable it in production"); logger.d("Fine grained information to debug an application"); logger.i("Track the flow of the application"); logger.w("A potential but expected problem"); logger.e("A real failure that may impact the application state"); 由于某些原因,另外一个特别的是 logger.wtf("WTF logs

操作系统——计算机硬件简介

China☆狼群 提交于 2021-02-18 10:44:17
计算机硬件简介 从概念上讲,一台计算机可以抽象为下图的模型 图0.1计算机抽象模型 CPU,内存以及I/O设备都由一条系统总线连接起来并通过总线与其他设备通信 CPU CPU是计算机的大脑,它从内存中取出指令并执行。 CPU的工作流程 从内存中取出指令,对取出的指令进行解码,执行,CPU就是一直不断的重复这个过程。 ​ 图1.1CPU工作流程 超标量CPU 流水线作业效率不高,于是就引入了超标量CPU 超标量CPU是这样工作的,多个取值和解码同时进行,取值解码完成后的指令会进入缓冲区,缓冲区对应多个执行单元,每当缓冲区中有指令且有空闲的执行单元时,就会从缓冲区取出指令进入执行单元执行. ​ 图1.2超标量CPU工作流程 内核态和用户态 多数CPU多有两种模式,内核态和用户态 在内核态运行时,CPU可以执行指令集的每一条指令,使用硬件的全部功能 在用户态运行时,CPU只能执行指令集的一个子集和访问所有功能的一个自己 在台式机和服务器上,操作系统在内核态运行。在大多数嵌入式系统中,一部分操作系统在内核态运行,其余部分在用户态运行 存储器 存储器分为四个层次 寄存器 高速缓存 内存 硬盘 ​ 图2.1存储器的四层 寄存器 寄存器存在于CPU中,访问和CPU一样快,没有时延 高速缓存 常用的高速缓存行放置在CPU内部或非常接近CPU的位置 高速缓存命中 当程序需要读取一个字时