一直用 Authenlia 作为反代认证,给各种私有服务添加了统一登录。架构如下:当用户希望访问「内网服务#1」时:访问反代服务器(Nginx)。反代服务器向认证服务器查询是否已登录,若认证成功则继续。否则显示登录页面。反代服务器访问内网服务取得资源。反代服务器把结果返回给用户。其中反代服务器与内网服务器处于同一局域网内,可以使用 http 明文通信。但与认证服务器的交互需要 https 加...
一直用 Authenlia 作为反代认证,给各种私有服务添加了统一登录。架构如下:当用户希望访问「内网服务#1」时:访问反代服务器(Nginx)。反代服务器向认证服务器查询是否已登录,若认证成功则继续。否则显示登录页面。反代服务器访问内网服务取得资源。反代服务器把结果返回给用户。其中反代服务器与内网服务器处于同一局域网内,可以使用 http 明文通信。但与认证服务器的交互需要 https 加...
传送门:4. Median of Two Sorted Arrays这是一道 Hard 级别的题目,主要难点是要求实现 $O(\log(m+n))$ 的时间复杂度。暴力算法最容易想到的就是双指针,分别指向两个数组的首个元素。比较两个指针元素的大小,向后移动较小的一个并计数。此算法时间复杂度为 $O(m+n)$,其实不算差,但不满足题目要求。二分排除时间复杂度:$ O(\log(k)) $ =...
本文没有什么技术含量,主要记录 IntelliJ 全家桶(IDEA, Goland, Android Studio 等)常见的小毛病。Precommit Check【问题描述】发现版本:JetBrains: 2023Android Studio: HedgehogJetBrains 全家桶更新到 2023 版本,以及衍生产品 Android Studio 更新到 Hedgehog 后,在 I...
本文基于 Spring Boot 3.1.3,使用 io.spring.dependency-management 1.1.3 依赖管理。注入注解之争Spring 中最常用的注解恐怕非依赖注入 @Autowired 莫属了,默认情况下每个类 Spring 只会创建一个实例来节约资源,但若我们需要的是一个 EntityManager 对象,事情就稍微复杂了一点。即使在最简单的单个数据库场景下,...
要学习动态代理,首先要知道什么是代理。简单说,若我们想访问对象 A,但现在不直接调用,而是访问对象 B,由 B 去调用 A 并且把 A 的返回值返回给我们,此时 B 就是一个代理。那么为什么要脱裤子放屁呢?看一个现实例子。假设某人有个多余房产希望出售/出租,于是他找了一个房产中介作为代理。潜在的购房人/求租人直接与中介联系即可。那么中介有什么优势?中介分担了业主的职责,业主只需在意成交价格即...
ListView与 LinearLayout 里插入一大堆 View 相比,ListView 也称得上是高性能。之所以这么讲,主要是它实现了两个关键功能:懒加载与复用。所谓懒加载就是只有某一项需要显示时才尝试解析 View、绑定数据。而复用则是随着列表的滚动,新项目直接使用那些不再可见项目的 View,只是重新绑定一下数据而已。当然,ListView 的复用不是天然的,需要开发者配合实现。同...
与后端相比,移动开发的架构比较后知后觉。毕竟「应用」这个东西在一开始就是轻量级的「软件」,只不过后来有了太多不可承受之重。后端最著名的 MVC 架构搬到 Android 上有各种水土不服,于是发展出 MVP,MVVM 以及最新的 MVI 等。架构一直是很神奇的东西,几乎每个正规的工程师都会用到,但又很少有人能说清楚它们到底是什么。无非是祭出那几个都包浆了的架构图片说,瞧,这就是 MVC。我一...
总结回溯问题通常包含对某一集合的递归遍历,在遍历的过程中选取元素,在回溯的过程中撤销选取。最终达到遍历所有可选取的组合,记录符合条件的那些。排列与组合递归遍历的过程中,每次都从第一个元素开始,还是从上一层遍历的位置开始呢?对于排列问题,每次都要从头开始;对于组合问题,需要接续遍历,因此递归函数需要一个参数指明从哪开始遍历。排列:选中集合的不同顺序视为多个有效答案。组合:选中集合的不同顺序只视...