Cicada

【GNSS发展历史】

試著忘記壹切 提交于 2020-10-07 05:31:44
1957 年10月4日,世界上第一颗人造地球卫星"火花号”(Sputnik)在苏联拜科努尔发射场发射,标志着人类航天时代来临。 1958 年,美国约翰·霍普金斯大学科研人员注意到卫星信号的多普勒频移(Doppler shift),发现可利用卫星信号多普勒频移精确定轨,并转而利用精确的卫星轨道确定地面观测点的位置,从而开启了多普勒定位的理论研究和多普勒卫星及接收机的研发。 1964 年,美国军方研制成功第一代多普勒卫星定位导航系统-子午卫星系统,又称海军导航卫星系统(Navy Navigation Satellite System,NNSS).同期,苏联建 立了用于船舶导航的“圣卡达”(CICADA)多普勒卫星导航系统。但是 NNSS 和CICADA 系统存在卫星数目少、无线电信号经常间断、观测所需时间较长、精度低等缺陷。 1967~1974 年,美国海军研究实验室发射三颗“Timation”计划试验卫星,试验并实现了原子钟授时系统。同期美国空军在“621-B”计划中成功研发了伪随机 噪声码(pseudo random noise code,PRN)调制信号的现代通信手段。 1968 年,美国国防部成立导航卫星执行指导小组(Navigation Satellite Executive Group,NAVSEG),筹划下一代导航定位系统。 1973 年

JavaEE基础:过滤器、监听器、拦截器,应用...

自作多情 提交于 2020-05-02 19:50:30
1、概念简介 JavaWeb三大组件:Servlet,Listener,Filter。监听器就是指在应用程序中监听相关对象状态变化的组件。 2、事件源对象 指被监听对象。 ServletContext ServletContextListener生命周期监听,它有两个方法,出生时调用contextInitialized(),销毁时调用contextDestroyed(); ServletContextAttributeListener属性监听,它有三个方法,添加属性attributeAdded(),替换属性attributeReplaced(),移除属性时attributeRemoved()。 HttpSession HttpSessionListener生命周期监听:它有两个方法,出生时调用sessionCreated(),销毁时调用sessionDestroyed(); HttpSessioniAttributeListener属性监听:它有三个方法,添加属性attributeAdded(),替换属性attributeReplaced(),移除属性attributeRemoved()。 ServletRequest ServletRequestListener生命周期监听:它有两个方法,出生时调用requestInitialized()

Java基础篇(02):特殊的String类,和相关扩展API

点点圈 提交于 2020-03-08 22:31:03
本文源码: GitHub·点这里 || GitEE·点这里 一、String类简介 1、基础简介 字符串是一个特殊的数据类型,属于引用类型。String类在Java中使用关键字final修饰,所以这个类是不可以继承扩展和修改它的方法。String类用处极广泛,在对String对象进行初始化时,和基本类型的包装器类型一样,可以不使用new关键字构造对象。(是真的妖娆...) 2、类构造和方法 String类结构 特点:final关键字修饰,实现Serializable序列化接口,Comparable比较接口,和CharSequence字符序列接口。 final class String implements java.io.Serializable, Comparable<String>, CharSequence 声明方式 两种方式,常量和创建对象。 String var1 = "cicada" ; String var2 = new String("smile") ; var1:声明的是一个常量,显然是放在常量池中。 var2:创建字符串对象,对象存放在堆内存中。 二、常见应用 1、比较判断 常量池用来存放常量;堆内存用来存放new出来的引用对象。 public class String02 { public static void main(String[] args) {

你应该了解的 Java SPI 机制

对着背影说爱祢 提交于 2020-02-26 06:50:01
前言 不知大家现在有没有去公司复工,我已经在家办公将近 3 周了,同时也在家呆了一个多月;还好工作并没有受到任何影响,我个人一直觉得远程工作和 IT 行业是非常契合的,这段时间的工作效率甚至比在办公室还高,同时由于我们公司的业务在海外,所以疫情几乎没有造成太多影响。 扯远了,这次主要是想和大家分享一下 Java 的 SPI 机制。周末没啥事,我翻了翻我之前的写的博客 《设计一个可拔插的 IOC 容器》 ,发现当时的实现并不那么优雅。 还没看过的朋友的我先做个前景提要,当时的需求: 我实现了一个类似于的 SpringMVC 但却很轻量的 http 框架 cicada ,其中当然也需要一个 IOC 容器,可以存放所有的单例 bean。 这个 IOC 容器的实现我希望可以有多种方式,甚至可以提供一个接口供其他人实现;当然切换这个 IOC 容器的过程肯定是不能存在硬编码的,也就是这里所提到的 可拔插 。 当我想使用 A 的实现方式时,我就引入 A 的 jar 包,使用 B 时就引入 B 的包。 先给大家看看两次实现的区别,先从代码简洁程度来说就是 SPI 更胜一筹。 什么是 SPI 在具体分析之前还是先了解下 SPI 是什么? 首先它其实是 Service provider interface 的简写,翻译成中文就是服务提供发现接口。 不过这里不要被这个名词搞混了,这里的 服务发现

SpringBoot2 整合 Zookeeper组件,管理架构中服务协调

*爱你&永不变心* 提交于 2020-01-10 07:53:06
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 本文源码: GitHub·点这里 || GitEE·点这里 一、Zookeeper基础简介 1、概念简介 Zookeeper是一个Apache开源的分布式的应用,为系统架构提供协调服务。从设计模式角度来审视:该组件是一个基于观察者模式设计的框架,负责存储和管理数据,接受观察者的注册,一旦数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的观察者做出相应的反应,从而实现集群中类似Master/Slave管理模式。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。 2、基本理论 数据结构 ZooKeeper记录数据的结构与Linux文件系统相似,整体可以看作一棵树,每个节点称ZNode。每个Znode默认能够存储1MB的数据,每个ZNode都可以通过其路径唯一标识。 节点类型 短暂(ephemeral):客户端和服务器端断开连接后,创建的节点自动删除。 持久(persistent):客户端和服务器端断开连接后,创建的节点持久化保存。 集群服务 在Zookeeper集群服务是由一个领导者(leader),多个跟随者(follower)组成的集群。领导者负责进行投票的发起和决议,更新集群服务状态

MySQL基础篇(02):从五个维度出发,审视表结构设计

旧时模样 提交于 2019-12-27 07:51:37
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 本文源码: GitHub·点这里 || GitEE·点这里 一、数据场景 1、表结构简介 任何工具类的东西都是为了解决某个场景下的问题,比如Redis缓存系统热点数据,ClickHouse解决海量数据的实时分析,MySQL关系型数据库存储结构化数据。数据的存储则需要设计对应的表结构,清楚的表结构,有助于快速开发业务,和理解系统。表结构的设计通常从下面几个方面考虑:业务场景、设计规范、表结构、字段属性、数据管理。 2、用户场景 例如存储用户基础信息数据,通常都会下面几个相关表结构:用户信息表、单点登录表、状态管理表、支付账户表等。 用户信息表 存储用户三要素相关信息:姓名,手机号,身份证,登录密码,邮箱等。 CREATE TABLE `ms_user_center` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID', `user_name` varchar(20) NOT NULL COMMENT '用户名', `real_name` varchar(20) DEFAULT NULL COMMENT '真实姓名', `pass_word` varchar(32) NOT NULL COMMENT '密码', `phone` varchar(20) NOT

JavaEE基础(02):Servlet核心API用法详解

对着背影说爱祢 提交于 2019-12-11 23:06:29
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 本文源码: GitHub·点这里 || GitEE·点这里 一、核心API简介 1、Servlet执行流程 Servlet是JavaWeb的三大组件之一(Servlet、Filter、Listener),它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:接收请求数据;处理请求;完成响应。 2、核心API简介 API 作用描述 ServletConfig 获取servlet初始化参数和servletContext对象。 ServletContext 在整个Web应用的动态资源之间共享数据。 ServletRequest 封装Http请求信息,在请求时创建。 ServletResponse 封装Http响应信息,在请求时创建。 二、ServletConfig接口 1、接口简介 容器在初始化servlet时,为该servlet创建一个servletConfig对象,并将这个对象通过init()方法来传递并保存在此Servlet对象中。核心作用:1.获取初始化信息;2.获取ServletContext对象。 2、代码案例 配置文件 <servlet> <init-param> <param-name>my-name</param-name>

Java描述设计模式(18):享元模式

筅森魡賤 提交于 2019-12-04 09:23:18
本文源码: GitHub·点这里 || GitEE·点这里 一、使用场景 应用代码 public class C01_InScene { public static void main(String[] args) { String c0 = "cicada" ; String c1 = "cicada" ; System.out.println(c0 == c1); // true } } String类型就是使用享元模式。String对象是final类型,对象一旦创建就不可改变。在JAVA中字符串常量都是存在常量池中的,JAVA会确保一个字符串常量在常量池中只有一个拷贝,其中c0和c1就是一个字符串常量。结果为:true,说明c0和c1两个引用都指向了常量池中的同一个字符串常量"cicada"。这样的设计避免了在创建N多相同对象时所产生的不必要的大量的资源消耗。 二、享元模式 1、基础简介 享元模式是对象的结构模式。享元模式以共享的方式高效地支持大量的细粒度对象。常用于系统底层开发,解决系统的性能问题。像数据库连接池,里面都是创建好的连接对象,在这些连接对象中有需要的则直接拿来用,避免重新创建。 2、模式图解 3、核心角色 抽象享元角色 给出一个抽象接口,以规定具体享元角色要实现的方法。 具体享元角色 实现抽象享元角色所规定出的接口。如果有内部状态的话

设计一个可拔插的 IOC 容器

爷,独闯天下 提交于 2019-12-01 09:54:15
前言 磨了许久,借助最近的一次通宵上线 cicada 终于更新了 v2.0.0 版本。 之所以大的版本号变为 2,确实是向下不兼容了;主要表现为: 修复了几个反馈的 bug 。 灵活的路由方式。 可拔插的 IOC 容器选择。 其中重点是后面两个。 新的路由方式 先来看第一个:路由方式的更新。 在之前的版本想要写一个接口必须的实现一个 WorkAction ;而且最麻烦的是一个实现类只能做一个接口。 因此也有朋友给我提过这个 issue 。 于是改进后的使用方式如下: 是否有点似曾相识的感觉。 如上图所示,不需要实现某个特定的接口;只需要使用不同的注解即可。 同时也支持自定义 pojo , cicada 会在调用过程中对参数进行实例化。 拿这个 getUser 接口为例,当这样请求时这些参数就会被封装进 DemoReq 中. http://127.0.0.1:5688/cicada-example/routeAction/getUser?id=1234&name=zhangsan 同时得到响应: {"message":"hello =zhangsan"} 实现过程也挺简单,大家查看源码便会发现;这里贴一点比较核心的步骤。 扫描所有使用 @CicadaAction 注解的类。 扫描所有使用 @CicadaRoute 注解的方法。 将他们的映射关系存入 Map 中。 请求时根据 URL

「造个轮子」——设计 HTTP 请求全局上下文

橙三吉。 提交于 2019-12-01 09:54:05
前言 本次 Cicada 已经更新到了 v1.0.3 。 主要是解决了两个 issue, #9(Boss线程数好像设置有误 ) #8(怎么返回纯字符串内容不要JSON格式?) 。 所以本次的主要更新为: Cicada 采用合理的线程分配来处理接入请求线程以及 IO 线程。 支持多种响应方式(以前只有 json,现在支持 text)。 为了满足上者引入了 context 。 优雅停机。 其中我觉得最核心也最有用的就是这个 Context ,并为此重构了大部分代码。 多种响应方式 在起初 Cicada 默认只能响应 json ,这一点确实不够灵活。加上后续也打算支持模板解析,所以不如直接在 API 中加入可让用户自行选择不同的响应方式。 因此调整后的 API 如下。 想要输出 text/plain 时。 @CicadaAction("textAction") public class TextAction implements WorkAction { @Override public void execute(CicadaContext context, Param param) throws Exception { String url = context.request().getUrl(); String method = context.request().getMethod