flutter-context
BuildContext 每次我们在编写界面部分代码的时候,都是在build函数中进行操作。而build函数则需要默认传入一个BuildContext。我们来看看这到底是啥。 12345678abstract class BuildContext { /// The current configuration of the [Element] that is this [BuildContext]. Widget get widget; /// The [BuildOwner] for this context. The [BuildOwner] is in charge of /// managing the rendering pipeline for this context. BuildOwner get owner; ... 我们可以看到BuildContext其实是一个抽象类,但是每次build函数传进来的是什么呢。我们来看看构建视图的时候到底发生了什么。 Flutter如何构建视图 在Flutter中,Everything is Widget,我们通 ...
学线培训:flutter-key
key的定义 Key Class官方介绍: A [Key] is an identifier for [Widget]s, [Element]s and [SemanticsNode]s. A new widget will only be used to update an existing element if its key is the same as the key of the current widget associated with the element. {@youtube 560 315 https://www.youtube.com/watch?v=kn0EOS-ZiIc} Keys must be unique amongst the [Element]s with the same parent. Subclasses of [Key] should either subclass [LocalKey] or [GlobalKey]. 翻译过来: 一个Key是Widget,Element以及SemanticsNode的标识。 一个新widget将仅用 ...
设计模式基本原则
设计模式基本原则 开闭原则(Open Close Principle) 开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。 可以通过“抽象约束、封装变化”来实现开闭原则,即通过接口或者抽象类为软件实体定义一个相对稳定的抽象层,而将相同的可变因素封装在相同的具体实现类中。因为抽象灵活性好,适应性广,只要抽象的合理,可以基本保持软件架构的稳定。而软件中易变的细节可以从抽象派生来的实现类来进行扩展,当软件需要发生变化时,只需要根据需求重新派生一个实现类来扩展就可以了。 开闭原则无非就是想表达这样一层意思:用抽象构建框架,用实现扩展细节。因为抽象灵活性好,适应性广,只要抽象的合理,可以基本保持软件架构的稳定。当然前提是我们的抽象要合理,要对需求的变更有前瞻性和预见性才行。 里氏替换原则(Liskov Substitution Principle) 里氏替换原则是指,任何基类可以出现的地方,子类一定可以出现,也就是说:子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。 ...
操作系统实验四-进程同步
进程同步实验 ipcs -* ipcs -m linux中可用命令ipcs -m 观察共享内存情况 key 共享内存关键值 shmid 共享内存标识 owner 共享内存所由者 perm 共享内存使用权限 byte 共享内存字节数 nattch 共享内存使用计数 status 共享内存状态 ipcs -s linux中可用命令ipcs -s 观察信号量数组的情况 semid 信号量的标识号 nsems 信号量的个数 ipcs -q linux中可用命令ipcs -q 观察消息队列的情况。 msgmid 消息队列的标识号 used-bytes 消息的字节长度 messages 消息队列中的消息条数 ipcrm 在权限允许的情况下您可以使用ipcrm命令删除系统当前存在的IPC 对象中的任一个对象。 ipcrm -m 21482: 删除标号为21482 的共享内存。 ipcrm -s 32673: 删除标号为32673 的信号量数组。 ipcrm -q 18465: 删除标号为18465 的消息队列。 系统调用 IPC 对象有关的系统调用函数 ...
操作系统实验三-进程调度
进程调度 两个信号 SIGTSTP 停止进程的运行, 但该信号可以被处理和忽略. 用户键入SUSP字符时(通常是Ctrl-Z)发出这个信号 SIGINT 程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程。 系统调用 getpid()系统调用 getpid()系统调用语法: 1234#include <sys/types.h>#include <unistd.h>pid_t getpid(void);pid_t getppid(void); getpid返回当前进程的进程号,getppid返回当前进程父进程的进程号 进程控制有关的系统调用 可以通过信号向一个进程发送消息以控制进程的行为。信号是由中断或异常事件引发的,如:键盘中断、定时器中断、非法内存引用等。信号的名字都以SIG 开头,例如SIGTERM、SIGHUP。可以使用kill -l 命令查看系统当前的信号集合。 信号可在任何时间发生,接收信号的进程可以对接收到的信号采取3种处理措施之一: 忽略这个信号 执行系统默认的处理 捕捉 ...
学线:MVP与MVVM引入
MVP 为什么不用MVC 我们先来定义什么是好的软件架构: 软件架构上具有明确的分工,各个模块的功能职责平衡分配,且明确。 可测试性,通常良好的软件架构都具备良好的可测试性。 良好的易用性,维护成本低。 MVC一个很大的问题在于所有的逻辑都在Controller层,不可避免的会造成Controller层非常复杂,如果项目越来越大,Controller层的代码会更加臃肿,维护起来也非常麻烦。除此之外: 视图与控制器间的过于紧密的连接 视图与控制器是相互分离,但却是联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。 视图对模型数据的低效率访问 依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。 不太友好的单元测试 特别是App上做单元测试的时候很多东西依赖于系统框架,没法脱离用户接口来测试这些逻辑单元。 等等。 MVP Basic MVP 架构模式是 MVC 的一个变种,很多框架都自称遵循 MVC 架构模式,但是它们实际上却实现了 MVP 模式;MVC 与 M ...
sql必知必会拾遗
sql必知必会拾遗 很少一点,课上老师讲的比较全,而且大部分函数只是在实验时会用。 检索数据 通常sql关键字使用大写,对列名和表名用小写。 SELECT时使用DISTINCT会作用在所有列。 限制结果 TOP 使用TOP限制返回多少行。 如: 1SELECT TOP 5 sno FROM S; 这是标准SQL,不同DBMS有各自的定义。 LIMIT与OFFSET 返回从第几行到第几行的数据。 如: 1SELECT sno FROM S LIMIT 5 OFFSRT 5; 返回从第六行起的五行数据。第一个数是检索行数,第二个指示从哪开始。 注意第一个被检索的是第零行,而不是第一行。 SQL虽然有一致的实现但不同DBMS有不同的方式 数据排序 ORDER BY一定是SELECT的最后一条子句,否则报错。 ORDER BY的列通常是要展示的列,但使用非检索的列也合法。 按多个列排序 如: 1SELECT sno , name , gender FROM S ORDER BY name,sno; 排序规则:首先对所有元组按name排序,对有相同name的元组内按照sno排序,否则sn ...
操作系统实验二-管道通信
管道 创建匿名管道 实际管道的创建调用的是系统调用pipe(),该函数建了一个管道 pipe,返回了两个文件描述符,这表示管道的两端,一个是管道的读取端描述符 fd[0],另一个是管道的写入端描述符 fd[1],fd[2]为管道标号。 1int pipe(int fd[2]) 如果对于 fd[1]写入,调用的是 write(),向 pipe_buffer 里面写入数据;如果对于 fd[0]的读入,调用的是 read(),也就是从 pipe_buffer 里面读取数据。至此,我们在一个进程内创建了管道,但是尚未实现进程间通信。 要注意,在管道中没有数据的情况下,对管道的读操作会阻塞,直到管道内有数据为止。这就是为什么示例实验中的父子进程之间的执行是交替的。 当然写操作也不会再所有情况下都不阻塞。这里我们要先来了解一下管道的内核实现。管道实际上就是内核控制的一个内存缓冲区,既然是缓冲区,就有容量上限。我们把管道一次最多可以缓存的数据量大小叫做PIPESIZE。内核在处理管道数据的时候,底层也要调用类似read和write这样的方法进行数据拷贝,这种内核操作每次可以操作的数据量也是有限的,一 ...
Springboot入门指南与junit单元测试
SpringBoot入门指南 基本结构认知 首先,你要对基本的结构有一定的认识: 除此之外,还有对象集合bean(或者entity、pojo),配置文件集合config,如果你使用MyBatis,你会用到映射集合mapper。 spring认知 https://www.bilibili.com/video/BV1WE411d7Dv?spm_id_from=333.999.0.0 可以考虑作为知识补充 其次,springBoot会涉及一些基本的spring原理,你至少需要对spring的这两方面有一定的认识: IoC容器 传统的应用程序中,控制权在程序本身,程序的控制流程完全由开发者控制。但在IoC模式下,控制权发生了反转,即从应用程序转移到了IoC容器,组件不再由应用程序自己创建和配置,而是由IoC容器负责,这样,应用程序只需要直接使用已经创建好并且配置好的组件。为了能让组件在IoC容器中被 “装配” 出来,需要某种 “注入” 机制,例如,BookService自己并不会创建DataSource,而是等待外部通过setDataSource()方法来注入一个DataSource。 ...
安卓原生-服务
基本概念 为啥要有服务 举这样一个例子,我们使用音乐播放器的桌面小组件开始播放音乐,但你检查后台程序并没有启动音乐app,这其实就是一个服务,而且是后台服务。 官网对服务定义如下: Service 是一种可在后台执行长时间运行操作而不提供界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。此外,组件可通过绑定到服务与之进行交互,甚至是执行进程间通信 (IPC)。例如,服务可在后台处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序进行交互。 生命周期相关 服务基本上包含两种状态 状态 描述 Started Android的应用程序组件,如活动,通过startService()启动了服务,则服务是Started状态。一旦启动,服务可以在后台无限期运行,即使启动它的组件已经被销毁。 Bound 当Android的应用程序组件通过bindService()绑定了服务,则服务是Bound状态。Bound状态的服务提供了一个客户服务器接口来允许组件与服务进行交互,如发送请求,获取结果,甚至通过IPC来进行跨进程通信。 服 ...
安卓原生-广播
前言 我们上学时都有过这样的经历,当我们在火车站列车候车室中等待时,每当有某次列车开始检票或者进站上车时,就会播放通知来告知在候车室等待的人们该消息。 为了便于进行系统级别的消息通知,Android引入了一套类似的广播机制,然而比上述情景要灵活得多。此文将对Android广播机制的方方面面做出详尽的介绍。 Android广播机制简介 前面我们提到,Android的广播机制更加的灵活,这是因为Android允许每个应用只对自己感兴趣的广播进行注册,这样该程序就只会收到自己所关心的广播内容。 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器)。 广播机制最大的特点就是发送方并不关心接收方是否接到数据,也不关心接收方是如何处理数据的。 前半句,有点类似于UDP Android中广播的是操作系统中产生的各种各样的事件。例如,收到一条短信就会产生一个收到短信息的事件。而Android操作系统一旦内部产生了这些事件,就会向所有的广播接收器对象来广播这些事件。 BraodcastReceiver(广播接收器 ...
opencv_basic
图像基本操作 读取图像 1retval =cv2.imread (filename[,flags]) 可以使用相对路径,如: 也可以使用绝对路径。 显示图像 在显示图像中,还涉及其他函数 以下的很多例子里都会见到这几个函数 保存图像 图像处理基础 基本图像 二值图 仅包含黑色和白色,用01进行表示。 灰度图 可以在读取时将参数设为0,即为灰度图 通常, 计算机会将灰度处理为256个灰度级, 用数值区间[0,255]来表示。 其中, 数值”255”表示纯白色, 数值”0”表示纯黑色, 其余的数值表示从纯白到纯黑之间不同级别的灰度。用于表示256个灰度级的数值0~255, 正好可以用一个字节(8位二进制值)来表示。 所以灰度图一定是单通道的 彩图(以RGB色彩空间为例) 读取时参数为1,或者省略 在 RGB 色彩空间中, 存在 R (red, 红色)通道、 G (green, 绿色)通道和 B (blue, 蓝色)通 道, 共三个通道。 每个色彩通道值的范围都在[0,255]之间 , 我们用这三个色彩通道的组合表示颜色。 以比较通俗的方式来解释 ...
绘制:霍夫曼树
效果图如下: 思路 采用层叠布局,将连接节点的树枝(树枝层)和节点(节点层)依次绘制到界面上,注意这个顺序很重要,要保证节点会遮住树枝的线段这样就不必再对树枝的长度进行额外处理(以避免树枝遮住节点上的数字的情况)。 缩放可以使用InteractiveViewer直接实现。节点的定位和树枝线段的起始与终止位置由所有节点的信息进行计算得出。 解决的问题 在此次绘制遇到了如下问题: 面对一个数量不定的数据源(List/Map),如何进行绘制? 节点的定位和树枝线段的起始与终止位置要如何确定? 如何在数据量较大导致界面无法容纳时进行缩放? 下面依次解决: 问题一 面对一个数量不定的数据源(List/Map),如何进行绘制? 这个问题其实很简单。 首先把每个节点封装为组件,然后在初始化霍夫曼树界面时对数据源进行处理,将所有数据装载到节点里,形成一个List<Widget>,作为节点层的stack的children,但这其实会导致另一个问题。 由于节点层本身就是另一个层叠布局,而初始的节点组件会监听鼠标的移入移出,移入时展示节点卡片。由于层叠布局会令后添加的Widget覆盖在 ...
学线培训:winter-flutter:网络、同步与异步
Dio: 前言 热知识:Dio是国人开发的网络请求库,所以中文文档很完善。 又:目前最新版本为dio: ^4.0.5-beta1,在其github的develop分支,不过并不建议使用。以下基于master的 dio: ^4.0.3 / dio: ^4.0.4大致看了一下改变并不大。基本直接搬运github文档,免得有同学上不去github。 总而言之跟okhttp挺像的。 添加依赖 12dependencies: dio: ^4.0.3 如果你是dio 3.x 用户,想了解4.0的变更,请参考 4.x更新列表! 一个极简的示例 123456789import 'package:dio/dio.dart';void getHttp() async { try { var response = await Dio().get('http://www.google.com'); print(response); } catch (e) { print(e); } ...
学线培训:winter-flutter:PlatformChannel与桌面组件
PlatformChannel Flutter定义了三种不同类型的Channel,它们分别是 BasicMessageChannel:用于传递字符串和半结构化的信息。 MethodChannel:用于传递方法调用(method invocation)。 EventChannel: 用于数据流(event streams)的通信。 三种Channel之间互相独立,各有用途,但它们在设计上却非常相近。每种Channel均有三个重要成员变量: name: String类型,代表Channel的名字,也是其唯一标识符。 messager:BinaryMessenger类型,代表消息信使,是消息的发送与接收的工具。 codec: MessageCodec类型或MethodCodec类型,代表消息的编解码器。 下面讲MethodChannel,其余两种方法基本一致 MethodChannel 样例下载,以下基于样例进行讲解 flutter端 1234567891011121314151617static const MethodChannel methodChannel = Metho ...
数据结构课设:霍夫曼编码译码
前言 单纯对这类题目比较感兴趣吧,因为要是单纯去实现最原始的霍夫曼算法的话,其实很简单的,但是很多时候正是我们的不知足心理推动了技术的发展与进步,而我也恰恰觉得现阶段霍夫曼算法还有可以优化的地方而变得更加高效,也希望能借这个机会给下学期的算法课开个好头。 题目 问题描述 利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码;在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼码的编译码系统。 基本要求 一个完整的系统应具有以下功能: (1)I:初始化(Initialization)。从终端读入字符集大小n及n个字符和m个权值,建立哈夫曼树,并将它存于文件hfmtree中。 (2)C:编码(Coding)。利用已建好的哈夫曼树(如不在内存,则从文件hfmtree中读入),对文件tobetrans中的正文进行编码,然后将结果存入文件codefile中。 (3)D:解码(Decoding)。利用已建好的哈夫曼树将文件 ...
Python进阶语法记录-OOP、IO、网络
面向对象 类和实例 以Student类为例,在Python中,定义类是通过class关键字: 12class Student(object): pass class后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的,可以省略。通常,如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类。 定义好了Student类,就可以根据Student类创建出Student的实例,创建实例是通过类名+()实现的: 12345>>> bart = Student()>>> bart<__main__.Student object at 0x10a67a590>>>> Student<class '__main__.Student'> 可以看到,变量bart指向的就是一个Student的实例,后面的0x10a67a590是内存地址,每个object的地址都不一样,而Student本身则是一个类。 可以使用点号 . 来访问 ...
Python基础语法记录
前言: 以前也闲得无聊看过一点Python,但是吧,平常用不上,渐渐就生疏了,也没怎么继续学下去,现在基本忘光了。现在准备入手OpenCV,拿Python版入手,稳妥起见先把以前看的一点Python拾遗补漏,记点记录以后忘了的话还可以翻翻看看,毕竟现在手头语言也不少了(java,dart,c++,JS),时间长了难免有搞混的情况。 (这里吐槽一句,软院本科真的是在培养全沾工程师,(我的c++还好,js完全就是沾了沾,java也没有完全特别深入地去学,dart自学的,算得上是用的比较熟练的脚本语言))。 基于Python3!Python2已经逐渐成为过去式 正文 Python学习资料/文章/指南整理 引自知乎-四条鱼 基本语法 标识符 第一个字符必须是字母表中字母或下划线 _ 。 标识符的其他的部分由字母、数字和下划线组成。 标识符对大小写敏感。 可以中文变量名但不要这么做 使用缩进来表示代码块 类似yaml格式,缩进一般是4个空格 多行语句 使用反斜杠 \来实现多行语句 在 [], {}, 或 () 中的多行语句,不需要使用反斜杠 同一行显示多条语句 ...