MeowRain
Life is SimpleLife is Simple
meowrain 发布于 收录于 网络编程 TCP字符流编程 代码 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 package org.example.socket; import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class SocketTcp03Server { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(9999); Socket socket = serverSocket.accept(); System.out.println("服务端启动,正在监听9999端口"); InputStream inputStream = socket.getInputStream(); InputStreamReader reader = new InputStreamReader(inputStream); BufferedReader bufferedReader = new BufferedReader(reader); String s = bufferedReader.
meowrain 发布于 收录于 网络编程 TCP网络通信编程1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 SockeTcp01Client.java package org.example.socket; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; public class SocketTcp01Client { public static void main(String[] args) throws IOException { Socket socket = new Socket(InetAddress.getLocalHost(),9999); System.out.println("客户端socket返回" + socket.getClass()); OutputStream outputStream = socket.getOutputStream(); byte[] content = "HelloServer,This is a message come from Client".getBytes(); outputStream.write(content); outputStream.
meowrain 发布于 收录于 单片机 Pin引脚类的应用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 from machine import Pin # 创建一个输出引脚在0引脚 p0 = Pin(0,Pin.OUT) # 给P0引脚线输出低电平,再输出高电平 p0.value(0) p0.value(1) # 给P0引脚线输出低电平,再输出高电平 p0.on() p0.off() # 给P0引脚先输出低电平,再输出高电平 p0.low() p0.high() #再P2创建一个输入引脚,并设置上拉电阻 p2 = Pin(2,Pin.IN,Pin.PULL_UP) # 打印P2的值 print(p2.value()) 软件设计1-点亮一个LED 1 2 3 4 5 from machine import Pin # 构建 pin_12 引脚对象,GPIO12输出 pin_12 = Pin(12,Pin.OUT) #使Pin12输出高电平 pin_12.high() 软件设计2-闪烁的LED 1 2 3 4 5 6 7 8 9 from machine import Pin # 导入time模块 import time # 构建pin12引脚对象,GPIO12输出 pin_12 = Pin(12,Pin.
meowrain 发布于 收录于 面向对象 面向对象设计原则(部分) https://zhuanlan.zhihu.com/p/60791596
共同重用原则:一个包中里的所有类应该是共同重用的,如果重用了包里的一个类,那么就要重用包中的所有类。 共同封闭原则: 如果一个变化对一个包产生影响,则将对该包里的所有类产生影响,而对其它包不产生任何影响。 开放-封闭原则:对扩展开放,对修改关闭。 接口分离原则: 接口的功能尽可能单一,降低模块的耦合性。 面向对象测试的四个层次 算法层 –> 单元测试 类层 –> 模块测试 模板层 –> 主题层 系统层 –> 把各个子系统组装成完整的面向对象软件系统,在组装过程进行测试 设计模式 面向对象类关系(继承、实现、依赖、关联、聚合、组合):https://www.cnblogs.com/zhongj/p/11169780.html
UML: https://blog.csdn.net/quyingzhe0217/article/details/133683814
创建型模式 创建型设计模式包括以下几种常见的模式:
工厂模式(Factory Pattern):通过工厂方法或抽象工厂来创建对象,将对象的创建过程封装起来,使得客户端代码与具体类解耦。
抽象工厂模式(Abstract Factory Pattern):提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体类。
单例模式(Singleton Pattern):确保一个类只有一个实例,并提供一个全局访问点来访问该实例。
建造者模式(Builder Pattern):将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
原型模式(Prototype Pattern):通过复制现有对象来创建新对象,而不是通过实例化来创建。
结构型模式 结构型设计模式主要包括以下几种常见的模式: 适配器模式(Adapter Pattern):将一个类的接口转换成客户端所期望的另一个接口,使得原本不兼容的类可以一起工作。
桥接模式(Bridge Pattern):将抽象部分与实现部分分离,使它们可以独立地变化,从而提高系统的灵活性。
组合模式(Composite Pattern):将对象组合成树形结构,以表示“部分-整体”的层次结构,使得客户端可以统一地处理单个对象和组合对象。
装饰器模式(Decorator Pattern):动态地给对象添加额外的职责,同时又不改变其接口。
外观模式(Facade Pattern):提供一个统一的接口,用于访问子系统中的一组接口,从而简化客户端与子系统之间的交互。
享元模式(Flyweight Pattern):通过共享细粒度的对象,以减少内存使用和提高性能。
代理模式(Proxy Pattern):为其他对象提供一个代理,以控制对这个对象的访问。
行为模式 行为型设计模式主要包括以下几种常见的模式:
观察者模式(Observer Pattern):定义了一种一对多的依赖关系,使得多个观察者对象可以同时监听并收到被观察者对象的通知。
策略模式(Strategy Pattern):定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,从而使算法的变化独立于使用算法的客户端。
命令模式(Command Pattern):将请求封装成对象,以使得可以用不同的请求对客户端进行参数化,同时支持请求的排队、记录和撤销。
迭代器模式(Iterator Pattern):提供一种顺序访问聚合对象中各个元素的方法,而又不暴露该对象的内部表示。
状态模式(State Pattern):允许对象在内部状态发生改变时改变其行为,使对象看起来像是修改了其类。
责任链模式(Chain of Responsibility Pattern):将请求的发送者和接收者解耦,使多个对象都有机会处理请求,从而避免请求的发送者与接收者之间的耦合关系。
meowrain 发布于 收录于 Go Go 网络编程 IP “net"包定义了许多类型, 函数,方法用于 Go 网络编程。IPIPIPIP 类型被定义为一个字节数组。–> type IP []byte
有几个函数来处理一个 IP 类型的变量, 但是在实践中你很可能只用到其中的一些。例如, ParseIP(String)函数将获取逗号分隔的 IPv4 或者冒号分隔的 IPv6 地址, 而 IP 类型的String()方法将返回一个字符串。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 package main import ( "fmt" "net" "os" ) func main() { if len(os.Args) != 2 { fmt.Fprintf(os.Stderr, "Usage: %s ipaddr\n", os.Args[0]) os.Exit(1) } ipAddress := os.
meowrain 发布于 收录于 数据库 数据库六种范式 一些基本概念 一些基本概念: 实体: 实体通常指代数据模型中的一个对象,常常对应数据库中的表
属性: 属性是关系数据库中的一个重要概念,对应于数据表中的列,描述了实体的特征或者特性
元组: 在关系数据库中,元组指的是数据表中的一行,包含了一组属性值
分量: 分量是元组中的某个具体的属性值
候选码和主码: 候选码是可以唯一确定一个元组的属性,主码是从候选码中选出的用来唯一标识一个元组的码
全码: 包含了所有属性的码,确保了其唯一性
主属性: 如果一个属性在任何一个候选码中出现过,那么它就是主属性,用来唯一标识一个元组
非主属性: 非主属性与主属性相反,没有在任何候选码中出现过,不能唯一标识一个元组
外码: 外码是一个属性(或者属性组),它不是本表的主码或者候选码,但是却可以关联到其他表的主码,用于建立表与表之间的关联。
关系模型的形式化定义 R(U,D,DOM,F)
R: 符号化的元组语义
U: 一组属性
D: 属性组U中的属性所来自的域
DOM: 属性到域的映射
F: 属性组U上的一组数据依赖
由于D,DOM与设计关系不大,因此这里把关系模式看作一个三元组R<U,F>
函数依赖 注: 因为电脑不太方便打出打杠的箭头,所以就用-->表示了
非平凡函数依赖:关系R(Sno,Cno,Grade),依赖关系(Sno,Cno)–>Grade是非平凡函数依赖
平凡函数依赖:关系R(Sno, Cno),依赖关系(Sno, Cno)→Sno,(Sno, Cno)→Cno都是平凡函数依赖
完全函数依赖:关系R(Sno,Cno,Grade),依赖关系(Sno,Cno)->Grade,但是Sno-->Grade且Cno-->Grade,因此这个依赖关系是完全函数依赖
$(Sno,Cno) \overset{F}{\longrightarrow} Grade$
部分函数依赖:关系R(Sno,Sname,Ssex,Sclass,Sage),依赖关系中我们可以用Sno,Sname推出Ssex,也就是(Sno,Sname)->Ssex,但是Sno->Ssex,这样的话就是部分函数依赖了。
传递函数依赖:图里面写的很明白,这里就不多赘述
函数依赖和属性的关系 设R(U)是属性集U上的关系模式,X、Y是U的子集。
如果X和Y之间是一对一(1:1)关系,如学校和校长,则存在函数依赖X→Y和Y→X。
如果X和Y之间是一对多(1:n)关系,如年龄和姓名,则存在函数依赖Y→X。
如果X和Y之间是多对多(m:n)关系,如学生和课程,则X和Y之间不存在函数依赖。
范式 第一范式 1NF 属性不可分
第二范式 2NF https://www.geeksforgeeks.org/second-normal-form-2nf/
第二范式要求一个表中的每个非主属性都完全函数依赖于候选码,即表中的每个非主属性都必须完全依赖于整个候选码,而不是部分依赖于候选码的某一部分。
我们来看这个表,很明显这个表不符合第二范式,其中STUD_NO和COURSE_NO是候选码(主属性),而COURSE_FEE是非主属性,但是它并不依赖STUD_NO,而是只依赖COURSE_NO,因此是部分依赖于整个候选码。
由此可以得出,这个表不符合第二范式
第三范式 3NF BCNF
meowrain 发布于 收录于 折腾 https://openwrt.org/docs/guide-developer/procd-init-script-example
cd /etc/init.d vim frpc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #!/bin/sh /etc/rc.common START=99 STOP=90 SERVICE=frpc USE_PROCD=1 PROC="/usr/bin/frpc -c /root/frpc/frpc.toml" start_service(){ procd_open_instance procd_set_param command $PROC procd_set_param respawn procd_close_instance } service_triggers() { procd_add_reload_trigger "rpcd" } /etc/init.d/frp enable && echo on
Spring MVC项目创建 把没用的文件删掉
添加依赖
1 2 3 4 5 6 <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>6.1.3</version> </dependency> 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 <?
meowrain 发布于 收录于 C++ const与function 在c++中,const在function中有不一样的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include <iostream> #include <string> class Example { public: Example(const std::string &name) : m_Name(name) {} const std::string& GetName() const {return m_Name;}; private: std::string m_Name; }; int main() { Example example("John"); const std::string& name = example.GetName(); std::cout << name << std::endl;//输出 “John" // name = "Alice"; //wrong } 这个函数的返回值是一个指向常量字符串的引用。const修饰的是返回值的类型,表示返回的字符串是一个常量,不能被修改。
函数签名中的第二个const修饰的是成员函数本身,表示这个函数是一个const成员函数,即在该函数内部不能修改类的成员变量。
因此,这个函数返回一个指向常量字符串的引用,并且在该函数内部不修改类的成员变量。
meowrain 发布于 收录于 C++ C++ STL vector vector构造器 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 #include <vector> #include <iostream> /* vector<T> v; // 采用模版类实现,默认构造函数 vector<T> v(T* v1.begin(), T* v1.end()); // 将v1[begin(), end())区间中的元素拷贝给本身 vector<T> v(int n, T elem); // 将n个elem拷贝给本身 vector<T> v(const vector<T> v1); // 拷贝构造函数 */ int main(void) { std::vector<int> v; // 默认构造函数 for(int i = 0;i<10;i++) { v.