2021-12-21
Coding
IDEA
IDE
工具
IDEA是JetBrain公司推出的Java集成开发环境。
由于其强大而又易用,受到了许多开发者的青睐。
JetBrain公司随后又推出了PyCharm, GoLand, WebStorm等软件用于各种语言的开发。
事实上他们都是IDEA的定制版,他们的核心功能都和IDEA相同。
本文将介绍IDEA的各种使用技巧,他们适用于所有一系列的JetBrain产品。
我们要学习的第一个也是最重要的功能就是查找动作 (Find Action)。默认快捷键为CTRL+SHIFT+A。
2021-09-08
数学
趣谈
看到标题你或许会内心一惊,但是请放心,这里是正经博客,讨论的是一个数学问题
小便池问题是在我初中时期广为流传的一个问题(梗)。
在和H君和R君(当然,我早就和悦悦讲过🙂)两次提起这个问题之后,终于勾起了我重新解题的冲动。
距离上一次思考这个问题已经是十多年前了,彼时的我并没有得出通解,一觉过后也就未再深究。
今天希望我可以顺利解出。
男同胞可以选择跳过本节
一般男厕所由两部分组成,即小便池和单间。
其中小便池通常一字排开,条件好一点的还会有隔板隔开。
2021-08-18
Coding
StackOverflow
Typescript
原题链接
原问题很简单,如何在Typescript中定义一个联合特定范围数字的整型类型。
Accepted Answer给出的答案是:
No it's not possible. That kind of precise type constraint is not available in typescript (yet?)
Only runtime checks/assertions can achieve that :(
2021-06-19
Coding
Typescript
自2012年诞生至今已有10个年头,Typescript已然成为Javascript项目的标配。
Typescript的类型系统是笔者学过的几门语言中表现力最强的,同时也兼顾了可读性易用性。
本文将介绍Typescript的类型系统的各种(高级)用法,帮助你在需要时定义更贴合业务的强大类型。
关于基础知识,在这里不做赘述,如有需要请自行阅读官方文档。主要包括
我们可以通过type关键字来定义类型别名,这可以简化我们的类型注解,不需要在每一处写冗长的类型。
2021-05-10
Coding
PWA
Web
渐进式网页应用(简称PWA)是一种Web应用标准。
通过使用一系列新兴技术让你的Web应用快速,安全,可安装,可离线使用,可适配各种设备,使其拥有不亚于原生应用的使用体验。
主要技术包括App Manifest, Service Worker, Web Push等
PWA最早由Google于2015年发起,同年Chrome支持Service Worker。
之后,Safari和Edge也相继在2018年和2019年提供支持。
2021-05-08
Coding
Spark
屏障执行模式(Barrier Execution Mode)是Spark 2.4版本引入的新的执行模式。
旨在支持让Spark平台支持更多样化的工作类型,例如调度ML(机器学习)/DL(深度学习)训练任务。
本文将带你了解什么是屏障执行模式,为什么Spark需要,以及如何使用。
MapReduce是大多数流行框架的执行模式,通过划分Map和Reduce阶段(Stage),可以灵活的处理各种作业(Job)。
在MapReduce中
2021-03-15
Coding
分布式计算
大数据
Spark
Hadoop
在当今这个时代,大数据已经不是什么新鲜的名词了。
但凡是小有规模的公司,都配备了专门的数据部门。
而且这里的公司可不只是互联网公司,而是涵盖了能源,医疗,通信,零售,娱乐等等。
以至于数据本身成为了一种宝贵的资产,谁拥有了数据就拥有了未来。
但是,光有数据还不够,数据本身不会说话。我们需要对数据进行处理和挖掘。
这中间就需要用到我们的主角——分布式计算。
如果你是软件相关从业人员并且关心行业新闻,一定对Hadoop,Hive,Yarn,Spark这些技术如雷贯耳。
2021-03-09
Coding
Javascript
Typescript
Deno
Node
2020年刚刚过去不久,对于现实世界来说是特殊的一年,对于Javascript世界也是特殊的一年。
在Github Javascript排行榜上,Deno一举击败了蝉联5年冠军的Vue.js ,以30.2kstar荣登榜首。
如果你不太关注前沿消息,你一定会问,这个雨点里的小恐龙是什么来头?
简单的说,Deno(蒂诺)是一个Javascript运行时。
这是你要问了,JS运行时,我们不是有Node了么?
是的,Deno就是Node的——翻转, no-de => de-no。
2020-10-26
Coding
Spark
Translation
Big Data
如果你有用Spark进行过时间序列分析,你可能会碰到这种情况:根据时间戳范围进行JOIN。
本文我们假设有两个DataFrame,
我们想要把每个事件和一小时内的测量值合并。
一种显而易见的方法是使用范围条件查询,形如measurementTime BETWEEN eventTime - n AND eventTime
,这将导致JOIN操作进行一次完整的笛卡尔乘积然后执行过滤。
这种做法的效率很低,尤其是当数据量达到数十万的情况下。
2020-08-05
Coding
REST
Web
REST这个单词想必作为开发者都不陌生。
在“大前端时代”的今天,一旦提及前后端交互,REST总是被提起。
但是我们却模糊了REST的概念,它更多的时候指代了以JSON为载体的WEB交互。
这其实与REST的初衷并不相符。我们有必要重新认识REST。
REST全称 REpresentational State Transfer。
2020-08-04
Coding
Spring Boot
Spring
Java
Hibernate
JPA
虽然Spring Data JPA有默认的Auditing功能,但是功能还是相对单薄。
而Hibernate Envers是Hibernate提供的完整Auditing方案,可以记录Entity的历史版本和版本信息。
可以帮助找回丢失数据,检查修改历史以及数据分析。
Hibernate Envers和Spring Data JPA无缝集成,只需要简单地加上注解就可以工作。
首先需要添加依赖项
接着,在你的Entity类上打上@Audited,就大功告成了。
2020-04-28
Coding
Spring Boot
Spring
Java
在Java中,异步操作通常需要自己开启线程或者管理线程池。
到了Spring Boot中,通过容器的特性在上下文中提供线程池,可以做到轻松方便的异步操作。
Spring Boot提供了@Async异步注解,让我们可以彻底告别过去,不需要处处和线程/线程池打交道。
要开启异步功能,只需要添加上@EnableAsync注解即可。
开启后,在你想要异步操作的方法加上@Async注解就大功告成了。
@Async方法返回值必须为以下几种类型之一
2020-02-18
Coding
Spring Boot
Spring
Java
对于程序员,缓存一定不是一个陌生的概念。
在我们编写的程序中,数据的处理和传递无时无刻不在发生着。
而其中总会存在着一些的重复的操作和数据。
为了减少这种浪费,也为了加快响应时间,我们就需要缓存。
把处理好的数据保留下来(最常见的是放在内存),下次再要做相同的事情,就可以直接返回结果。
Spring Boot核心库就为我们提供了缓存功能,相关代码在org.springframework.cache包下。
要开启缓存功能,只需要添加上@EnableCaching注解即可。
2020-02-04
Coding
Spring Boot
Spring
Java
在所有的应用中,我们会需要一些配置信息,其中难免会有一些敏感信息。
如果明文将他们放到仓库里,这些信息就会泄露。而如果我们不放在仓库里,又会给我们的部署带来麻烦。
因此,加密敏感信息就成了必要的需求了。
基于Spring Boot的容器特性,我们其实很容易切入配置文件的加载,来处理加密信息。
我们想要的是,把编码后的数据放到配置中,而在容器里拿到的却是解码后的内容。
2019-11-04
Coding
Spring Boot
Spring
Java
前面几节讲解了Spring容器以及Bean的用法。
其实至此Spring的核心功能已经结束了,从本节往后所有的功能不过是在容器之内所做的拓展。
对于Spring Boot自己来说,最重要的功能就是Auto Configuration(自动配置)了。
对于经历过传统Spring的开发者来说,Spring Boot无疑是大大解放了生产力。
其"约定优于配置"的思想将我们从无数的配置文件中解放出来。
大部分时候我们不需要任何配置就可以获得想要的对象。
2019-10-15
Coding
GUI
Java
JavaFX
SWT
一般UI框架都是单线程事件模型。一个典型的UI线程如图
在UI初始化后,除了不断地处理用户事件以外。还会维护一个事件队列以接收其他线程调度来的任务。UI框架会提供接口以调度任务回UI线程。例如
一般对于耗时操作,我们会先在任务线程里运行,得到结果后调度回到UI线程进行更新。
但是对于一些特定业务,即使调度得到也仍会造成UI卡顿。例如:
针对以上两种情况,我们对UI事件线程进行优化。通过自定义的调度器来取代原生调度器,从而使UI更加顺滑。
我们先来看看解决问题的效果,然后解析实现原理。
2019-09-15
Coding
Spring Boot
Spring
Java
Spring Boot提供了一系列的注解来帮助我们配置Bean,从而正确地找到合适地依赖项。
在Spring中,Bean默认是单例的,如果想要非单例的Bean,你需要定义@Scope,即作用域。
在Spring核心库中,只有两种scope,singleton和prototype。
同时你也可以根据业务需求自定义scope,如Spring-Web中有request,session等
例如
输出
可以看到多次获取的Bean不是一个实例。
See Also:自定义Scope
2019-09-12
Coding
Spring Boot
Spring
Java
Spring Boot提供了Condition接口来自定义Conditional。它只有一个方法
同时,对于每个Condition要定义对应的注解以标记Bean需要满足该条件。
这里我们依然以'世界'为例,在不同的世界里我们需要不同的Bean。
首先我们实现WorldCondition
接着我们再定义对应的注解@OnWorld,指定WorldCondition为它的处理类
然后我们回到WorldCondition中完成条件检查的逻辑
2019-09-09
Coding
Spring Boot
Spring
Java
ConfigurableBeanFactory提供了接口來进行自定义Scope的注册
我们只需要实现Scope接口,注意这里的Scope不是注解@Scope。
Scope接口有如下定义(下文中所有上下文均指代作用域的上下文)
Spring附赠了一个简单实现的SimpleThreadScope可以作为参考。
在这里我们一起来创建一个新的WorldScope(平行世界),通过一个全局的世界标识符来决定当前上下文。
定义好了Scope,接着我们把它注册到容器中
2019-09-05
Coding
Spring Boot
Spring
Java
上文讲到如何将Bean注册到容器中。整个过程看上去像是魔法一样,没有任何耦合,只是加了一个注解就完成了。
其实秘密就藏在了注解里,注解包含了配置项,Spring容器解析注解从而找到你的Bean。
在Spring中主要有两种方式发现你的Bean
@ComponentScan告诉Spring容器通过类路径扫描来发现用户定义的Bean。
你可能会想你并没有定义过这一注解,让我们点开@SpringBootApplication类源码,你会发现它已经包含了@ComoponentScan。