详情

全站展示位

记一次 sni 导致的反代异常

一直用 Authenlia 作为反代认证,给各种私有服务添加了统一登录。架构如下:当用户希望访问「内网服务#1」时:访问反代服务器(Nginx)。反代服务器向认证服务器查询是否已登录,若认证成功...。。。

推荐

搞懂 Java 与 Kotlin 泛型

本文讨论的「泛型」只局限于 Java / Kotlin 中。 什么是泛型 泛型本质上是一个确保类型安全的手段,它属于那种没有也罢有则更佳的特性。泛型几乎没有扩展 Java 能力的边界,而是提高了编码效率与可维护性,减少模板代码并降低出错机率。这么说的原因是使用 Object 就可以传递任意数据,没有必要使用泛型。 所有写 Java 的人都离不开泛型,比如 List<String> 但主动写一个泛型类的人就不多了,其中一个原因是对泛型的能力缺乏清晰的认识,所以不知道什么时候可以使用这个利器。 泛型适用场景有以下几个: 类/接口内部的数据或操作限制于某种数据类型,但这个类型本身可以有多种选择。List 就是这个一个典型用例。 方法的参数/返回值限制于某种类型,但每次调用的时候这个类型可能不一样。(泛型方法) 对参数或返回值类型施加额外的限制。 比如有这样一个方法 void merge(List l1, List l2),希望限制它两个参数的元素必须是同一个类型的且必须实现序列化接口,就可以借助泛型做到:<T extends Serializable> void merge(List<T> l1, List<T> l2) 这个用例中我们并不关心类型参数被实例化为何物,仅仅是用来施加限制。 泛型的实例化 泛型类 泛型只是一个占位符,在使用的时候(编译期)需要被实例化为具体的类型才有意义。这有点像形参与实参的区别。因为它只是一个占位符,所以定义泛型时候的名字无所谓,就像参数名一样。例如下面两种泛型定义等价: 1 2 3 4 5 6 public interface Shop<T> { T get(); } public interface Shop<balabala> { balabala get(); } 所谓泛型的实例化,就是给它确定具体类型的过程。但这个具体类型也可以是另一个泛型提供的,比如下面这个例子: 1 public class LargeShop<T> implements Shop<T> 左边的 T 是声明的类型参数,右边的 T 是用 LargeShop 的类型去实例化 Shop 泛型。同样类比传参:

Category: 路由器

🙅‍♂️ 若放弃自由来换取保障,自由和保障将一并逝去 ——哈耶克 🌎 Believe in OPENNESS

Jetpack Compose 笔记(4)drivedStateOf

数据的转换 对于 Compose 中的数据,用 mutableStateOf() 包裹来实现监听刷新我们已经轻车熟路。那如果一个数据依赖于另一个或多个数据怎么办?这就用到 derivedStateOf(),它专门用于数据的转换,当上游数据发生变化时会自动刷新下游数据,进一步刷新 UI。有点类似 LiveData 中 Transformations.switchMap 的作用。 Show me the code: 1 2 3 4 5 6 7 8 9 10 setContent { var name by remember { mutableStateOf("chenhe") } val upperName by remember { derivedStateOf { name.uppercase() } } Column { Text(upperName) Button(onClick = { name = "bob" }) { Text(text = "Change Name") } } } upperName 由 name 转换得来,一开始会显示 “CHENHE”,点击按钮后变成 “BOB”。好了,本节到此结束 😋

小米支架自拍杆—不止自拍

之前的线控自拍杆丢了,爱旅游的我缺少这么个神器简直不能忍,于是又找朋友要了个。(请不要过分在意“要”这个动词,另外,我才不告诉你们丢的那个也是要的 (′▽`〃))这货让我写篇评测…WTF?? 写就写吧,说不定哪天成了数码大V可要好好感谢他 (o゚v゚)ノ 噔噔噔噔 这次给我的是小米支架式自拍杆,就是这货↓ 包装 包装一脉继承小米的极简风,甚至连说明书都省去了,直接印刷在外壳上。 内有一个小盒子,里面是蓝牙遥控器。 主体 自拍杆主体是纯粹的支架,并没有任何连接线与按钮。自拍杆头部整体是可以以180°为单位进行旋转,主要是为了便于收纳。因为正面需要安装蓝牙遥控器,手机夹不得不旋转到背面进行折叠。 不同于常规自拍杆,这款手机夹除了可以前后俯仰调节角度之外,也支持以45°为单位进行旋转,因此可以实现手机竖直方向的拍摄。不过夹上手机后因为手机本身的阻挡,一般只能旋转±45°,如需切换横竖屏要先把手机拿下来。(如果你的手机只有半个手掌那么大的话就当我没说 = ̄ω ̄=) 手机夹接触面是橡胶(硅胶?傻傻分不清),质地柔软,摩擦力大,不伤手机也不容易脱落。官方说明写可以适配宽度在56-89mm的手机,网友说小米mix可以正常使用。相对于线控版自拍杆,此款取消了调节螺丝,改为固定阻尼的转轴,阻力刚刚好,用起来比来回拧螺丝方便不少。 因为整合三脚架的设计占用了不少空间,同时为了增加便携性以及手柄的握持感,只好牺牲了长度。完全伸展后加上手柄也只有40cm左右,与普通版70cm的长度有一定差距。其实40cm对于常规自拍差不多足够了,如果还想靠自拍杆举高高来欣赏被人群挡住的表演,可能有点困难。 另:完全伸展后有3段,一开始阻力比较大,要大胆拉开。 支架 支架算是这款最大的特色了。底部轻松掰开后即可快速变成一个三脚架。尾部采用了橡胶(硅胶?)材料,摩擦力大,几乎不用担心打滑现象。(但是这种材料容易沾灰,强迫症看着很难受)中间拉长杆的收纳部分也顺势当做了支架,在超重时可以分担压力吧。 当做支架使用时也是可以拉出伸长杆的。全部拉出后加上全金属荣耀7,在水平的床上依旧可以站住,稳定性还不错。 蓝牙遥控器 本款使用了分离式蓝牙遥控器,可以单独拿下来使用。安装处有凹槽,应该比较结实不会掉下来。遥控器采用 micro-usb 充电接口,接口除了充电,也兼具从自拍杆拿下时的缺口功能,使得拿下也是非常轻松。 遥控器按钮略硬,不注意的话有可能造成拍照抖动(希望你的手机有光学防抖),不过防抖不防手贱嘿嘿 ( ̄_, ̄ ) 总结 这是一个兼具创意与实用的产品,尤其适合男生。我想大部分男生应该不如妹纸那么喜欢自拍,自拍杆更多情况下是作为辅助工具使用。 带有三脚架的自拍杆在平日可以作为手机架,看个电影玩个直播还是很方便。在外面拍个延时摄影、长曝光等对于抖动要求高的东西可以说非常完美了。毕竟谁也不想背个专业器材出去玩。 可分离式的蓝牙遥控器更加拓展了使用场景。合个影不用求人啦,抓拍个什么更是美滋滋。 不满意的是没有采用最新的 type-c 接口,外出时不得不单独考虑数据线的问题。同时使用蓝牙3.0并不支持BLE,续航也需要注意。目前没有找到官方的续航参数。 最后 蟹蟹这位朋友啦 (๑•ᴗ•๑) ❤

心灵鸡汤

002、《禅师与兰花》

有一位禅师很喜欢养兰花。有一次他外出云游,就把兰花交代给徒弟照料。徒弟知道这是师傅的爱物,于是也小心照顾,兰花一直生长得很好。可是就在禅师回来的前一天,他不小心把兰花摔到地上,兰花摔坏了。

徒弟非常担心,他自己受罚倒不要紧,他害怕师傅会生气伤心。

问问自己,如果你是禅师,你会怎么处理?

禅师回来以后知道了,并没有生气,也没有惩罚。他告诉徒弟:“我当初种兰花,不是为了今天生气来的。”

列表展示

主站展示位

青龙面板撸羊毛

我不鼓励也不反对撸羊毛,全当折腾玩了。 总比天天在微信/朋友圈/微博发垃圾消息乞讨的人要好多了。 安装青龙面板 青龙面板有点类似油猴,它是一个脚本管理系统,本身不具有撸羊毛的功能。 安装青龙面板非常的简单(如果你用 docker 的话),这里使用 Docker Compose 来部署。Compose

Tags: algorithm

Hi, 这里是晨鹤的个人博客。一个赶上了 90 后末班车的跨时代 ISFP 努力守护的一个一亩三分地。

Dagger2 in Android(一)通俗基础

背景知识 Dagger2 是一个由 Google (之前是 Square)维护的开源依赖注入框架。我曾两次试图学习 Dagger 最终被乱七八糟的名词弄得晕头转向,连个 demo 都没写出来就放弃了。所以本文也会重点解释 Dagger 的各个名词,只有熟悉了它们的作用,才能顺畅无阻地使用,也才能看懂

冬日山城—重庆

前序 朋友要去就一起去咯= ̄ω ̄= 对那地方的火锅也是垂涎已久了。不过看更多的人还是推荐夏天去,什么玩的更多云云。但是像我这种特别特别怕热的,夏天重庆的湿热着实受不了,过去之后怕是窝在宾馆不想出来了。 另外冬季属于淡季,在门票价格和排队体验上都有不少优势。 文中提到的所有商家均是亲自体验后的推荐,无

Wear OS ADB 应用安装指南

Wear OS 的坑 早在 Android Wear 1.x 时代,智能手表的应用都是先安装在手机上,然后蓝牙连接手表后会同步过去。但在自从升级到 AW2.0 (现改名为 Wear OS)后,这一做法被废弃,改为手表独立安装应用。不过在 Google 的开发者文档中却说依然支持蓝牙同步,着实坑了开发

Tags: http

Hi, 这里是晨鹤的个人博客。一个赶上了 90 后末班车的跨时代 ISFP 努力守护的一个一亩三分地。

pmset 电源管理让 M1 Macbook 乖乖小憩

自从 M1 芯片的 macbook 买到手,搁着不用总是一周就没电了。昨晚充满观察了一下,一夜合盖休眠竟然消耗了 10% 的电。 TL;DR: 执行 sudo pmset -b powernap 0 关掉小憩,一晚上合盖 1% 都没掉。 消失的小憩 在 MacBook 的电池设置(台式机叫「节能」)

Tags: spring

Hi, 这里是晨鹤的个人博客。一个赶上了 90 后末班车的跨时代 ISFP 努力守护的一个一亩三分地。

记一次sni导致的反代异常

背景 一直用 Authenlia 作为反代认证,给各种私有服务添加了统一登录。架构如下: 当用户希望访问「内网服务#1」时: 访问反代服务器(Nginx)。 反代服务器向认证服务器查询是否已登录,若认证成功则继续。否则显示登录页面。 反代服务器访问内网服务取得资源。 反代服务器把结果返回给用户。 其

LeetCode N数之和

1-两数之和 梦开始的地方 (LeetCode 第一题) 传送门 Given an array of integers nums and an integer target, return indices of the two numbers such that they add up to tar

Ticwear adb 无损系统精简

前言 Ticwear(主要搭载于Ticwatch)是国内手表操作系统目前体验最好的,也是功能最完善的。但近期其大幅增加新功能,导致应用启动器图标数量众多,寻找app困难。同时很多系统应用可能并不经常使用甚至根本不用,在tic官方由于各种原因短时间内不会自主精简的情况下只能出此下策。希望可以帮到有需要

Tags: leetcode

Hi, 这里是晨鹤的个人博客。一个赶上了 90 后末班车的跨时代 ISFP 努力守护的一个一亩三分地。

常州の周末

这是大学期间第五次短途出行,前几次分别为扬州、北京、南京、杭州。 众所周知,常州以游乐场著名,所以光顾着刺激就忘了拍照。话说那些项目也不让带手机啊,一不小心就成死神来了了-.- 不过为了让各位少花冤枉钱并且减少排队时间,还是把这次行程总结一下。 背景 时间:2017.11.3 ~ 2017.11.5

Categories: 跨过山和大海

Hi, 这里是晨鹤的个人博客。一个赶上了 90 后末班车的跨时代 ISFP 努力守护的一个一亩三分地。

HTTP 基础/连接/授权

基础 请求方法 请求方法 Body 幂等 GET 获取资源 Y POST 增加或修改资源 Y PUT 修改资源 Y Y DELETE 删除资源 Y HEAD 同 GET;响应报文没有 Body 响应报文也没有 Y 状态码

Tags: mac

Hi, 这里是晨鹤的个人博客。一个赶上了 90 后末班车的跨时代 ISFP 努力守护的一个一亩三分地。

Z-Library: 加入书籍的乌托邦

简介 Z-Library 旨在让每一个人平等地获得书籍。当然,无论多么高端的口号都掩盖不了法律角度上盗版和侵权的事实。不过法律是矛盾调和的产物,它只能解决很小的一部分问题。从某种程度上,Z-Library 满足了我对互联网乌托邦的幻想。因此决定写下这个文章,帮助更多人轻松使用它。 对普通人来讲,只需

Android 进阶Canvas 高级绘制

Canvas 是 Android 系统提供的较为底层的绘图 API,常用于自定义 View,在 Wear OS 中更是表盘绘制的必备。Canvas 提供了 drawXXX() 系列方法,配合画笔属性可以画出诸多图形,这些 API 命名清晰,基本可以顾名思义。 既然标题叫「高级绘制」,对于那些比较基本

LEDE 配置 IPv6 以及公网访问

偶然发现江苏电信宽带已经分配了 IPv6 pd 前缀,一不做二不休搞一下。 基础概念 IPv6 与 v4 不同。v4 时代运营商一般只给用户分配1个公网 ip,然后用户自己的路由器通过 NAT 再给局域网设备分配内网 IP,也就是 192.168.x.x 这种。这种情况下内网设备没有独立的公网 IP

博客寄语:

    相信开放的力量 | Believe in OPENNESS

实时播报:

博客号-学习成长

相信每一分耕耘都有每一分收获,致力帮助博客主所创作的博客能更快的被收录! 如果有其它需求,可联系下方邮箱。