jonssonyan's Website

保持热爱,奔赴山海。

前言

最近因为个人需求,需要对番茄小说 App 进行抓包,因为番茄小说网页版功能不全,并且 App 自己也进行了一些防护,导致抓包难度提升了一个台阶。最终花了2小时验证了两种方案,抓到了所有想要到的请求。

抓包软件

Web 抓包很简单,F12 就可以看到所有请求,然而 App 抓包需要使用到专业的抓包工具,我推荐一些常用的抓包软件

  • Windows/Mac:Charles / Proxyman / Wireshark
  • Android:Packet Capture
  • IOS:Stream
阅读全文 »

“舔狗”,这个带着自嘲色彩的网络词汇,精准地击中了无数人的内心。我们在笑声中自嘲,却又在深夜里默默品味那份酸楚。

“舔狗”一词早已存在多年,但直到我观看了《喜剧之王单口季》中付航的脱口秀,才获得了新的灵感。他的一句“在舔狗的剧本里,舔狗才是主角,你杀青了!”深深触动了无数人。

以下是舔狗日记的网站主页

舔狗日记:https://dog.jonssonyan.com

在浏览器中输入网址,访问网站首页,你可以随机阅读一条日记。你可以复制日记内容,也可以为你喜欢的日记点赞。

阅读全文 »

jvm内存模型

  • 元空间(Metaspace):JDK1.8之后取代PermGen(永久代),存储类元数据,包括类的结构、方法、常量池、字段信息、静态变量等,不再使用JVM 堆内存,而是直接使用本地内存(也就是操作系统的内存)。因此Metaspace可以扩展到更大的内存空间,而不受堆内存限制。
  • 堆(Heap):堆分为年轻代(Young Generation)和 老年代(Old Generation)。
  • 栈(Stack):每个线程都有一个私有的栈,栈中存储的是栈帧。栈帧包含:局部变量表(存储方法的参数、局部变量、返回值等),操作数栈(执行方法的计算和操作), 动态链接(方法调用时的符号引用),方法返回地址(用于标识方法执行完毕后返回的地址)。
  • 本地方法栈(Native Stack):与栈类似,但是它存储的是 Native 方法(即由 Java 调用的本地方法)的相关信息。
  • 程序计数器(PC Register):每个线程都有一个独立的程序计数器,用于记录当前线程执行的 字节码指令的地址。在多线程环境下,JVM 使用该寄存器来追踪线程执行的位置。

类加载器

启动类加载器(Bootstrap ClassLoader)<-扩展类加载器(Extension ClassLoader)<-系统类加载器(System ClassLoader)< -自定义类加载器(Custom ClassLoader)

  1. 启动类加载器(Bootstrap ClassLoader)

    作用:负责加载JRE(Java Runtime Environment)中的核心类库,通常是JDK中的rt.jar(包含了所有的核心Java类,如java.lang.*包中的类)。

    实现:启动类加载器是由本地代码实现的,因此它是JVM中的最顶层加载器,并且通常是一个由C++编写的本地类加载器。它并不是java.lang.ClassLoader类的子类。

    职责:加载JDK内部的核心类,像java.lang.Object、java.lang.String、java.util.* 等。

  2. 扩展类加载器(Extension ClassLoader)

    作用:负责加载JRE中的扩展库,即ext目录中的类库。扩展库通常位于$JAVA_HOME/lib/ext目录下,或者是由java.ext.dirs系统属性指定的路径。

    实现:扩展类加载器是由 ClassLoader 类的子类 URLClassLoader 实现的,并且它会依赖于启动类加载器。

    职责:加载扩展 JDK 类库(比如 javax.、org.xml. 等)。

  3. 系统类加载器(System ClassLoader)

    作用:也叫做应用类加载器,负责加载应用程序的类路径(classpath)中指定的类。

    实现:系统类加载器是ClassLoader类的一个实例,它通过读取classpath中指定的路径加载类文件。通常这些类是我们在项目中开发的类。

    职责:加载应用程序中的类,通常由-classpath或-cp参数指定,或者是CLASSPATH环境变量指定的路径。

  4. 自定义类加载器(Custom ClassLoader)

    作用:开发者可以自定义类加载器以满足特定的需求。通常情况下,自定义类加载器可以扩展ClassLoader类,并重写findClass和loadClass方法来实现自定义的类加载行为。

    实现:自定义类加载器通常用于动态加载某些特定路径下的类,或者在特殊环境下加载类,例如,JSP的动态加载、插件机制、Web容器的类加载等。

    职责:通过重写类加载的逻辑来满足特定应用的需求,如加载特定路径的类、支持热部署等。

阅读全文 »

Redis 现在用的地方非常多,特别是在高性能、高并发系统中应用非常广泛,消耗资源少,能够实现的功能很多。

数据结构

基本数据类型

  • String:字符串
  • Hash:K->V
  • List:有序列表
  • Set:去列表
  • Sorted Set/ZSet:去重有序列表,按照 score 排序
  • Bitmap(Redis>2.2):位存储,可应用于统计用户信息,活跃,不活跃!登录,未登录!打卡,不打卡!两个状态
  • Geo(Redis>3.2):地理位置
  • HyperLogLog(Redis>2.8):基数统计,可应用于注册 IP 数,每日访问 IP 数,页面实时UV,在线用户数,共同好友数等,存在 0.81% 标准错误的近似值
  • Stream(Redis>5.0):流,消息队列和实时数据处理

String底层数据结构

阅读全文 »

消息队列一般在大型系统中使用比较多,特别是流量比较大的系统,小系统引入消息队列反而是一种累赘,可以使用 Redis List 数据结构模拟简单的队列,成本更低。

消息队列使用场景:解耦(例如:系统之间通讯)、异步、削峰

以下是常见消息队列 ActiveMQ、RabbitMQ、RocketMQ、Kafka 之间的对比

特性 ActiveMQ RabbitMQ RocketMQ Kafka
单机吞吐量 万级,比 RocketMQ、Kafka 低一个数量级 同 ActiveMQ 10 万级,支撑高吞吐 10 万级,高吞吐,一般配合大数据类的系统来进行实时数据计算、日志采集等场景
topic 数量对吞吐量的影响 topic 可以达到几百/几千的级别,吞吐量会有较小幅度的下降,这是 RocketMQ 的一大优势,在同等机器下,可以支撑大量的 topic topic 从几十到几百个时候,吞吐量会大幅度下降,在同等机器下,Kafka 尽量保证 topic 数量不要过多,如果要支撑大规模的 topic,需要增加更多的机器资源
时效性 ms 级 微秒级,这是 RabbitMQ 的一大特点,延迟最低 ms 级 延迟在 ms 级以内
可用性 高,基于主从架构实现高可用 同 ActiveMQ 非常高,分布式架构 非常高,分布式,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用
消息可靠性 有较低的概率丢失数据 基本不丢 经过参数优化配置,可以做到 0 丢失 同 RocketMQ
功能支持 MQ 领域的功能极其完备 基于 erlang 开发,并发能力很强,性能极好,延时很低 MQ 功能较为完善,还是分布式的,扩展性好 功能较为简单,主要支持简单的 MQ 功能,在大数据领域的实时计算以及日志采集被大规模使用

RocketMQ 和 Kafka 用的比较多,对 Java 程序员比较友好,Kafka 支持的吞吐量大,经常在大数据场景下使用。

阅读全文 »

下载源码

安装好JDK后,源码目录下面有src.zip文件,这个文件就是JDK的源码

搭建调试环境

新建Maven工程,包含以下文件

  • source:源码文件夹(手动新建)
  • test:单元测试文件夹(手动新建)
  • Main.java:主函数(自带)
阅读全文 »

可用于代理(加速)任何 HTTP 请求,实测可以给 Docker 镜像仓库加速

本文介绍我最近写的新作品:使用 Cloudflare Workers/Pages 搭建 HTTP 反向代理,代码已经全部开源在 GitHub,按照 README 里面的脚本搭建就可以了,非常简单。

GitHub:https://github.com/jonssonyan/cf-workers-proxy

支持任何 HTTP 请求代理,可用与镜像仓库国内加速。支持对请求进行 URL 过滤,User-Agent 过滤,IP 黑白名单,地区黑白名单,Nginx 伪装/302 重定向。

需要注意的是,建议自用,如果反代请求量太大,账号可能被官方风控,建议大家设置 IP 白名单,配合其他过滤条件。

阅读全文 »

本博客之前的图床是 mdnice,但是最近 mdnice 开始收费了,不开会员图床容量只有 100 MB,毕竟是第三方,担心图床突然哪天突然失效。之前没有用博客本地图床是因为博客部署在国外服务器上,虽然用了 CDN,但是使用国内网络,如果没梯子并且文章中有图,网页可能会加载缓慢。

如今没有稳定的图床,只能放在博本地,可以对图片进行压缩,让图片加载速度更快,200 KB 的图片可以压缩为 60 KB,而且肉眼看不出来图片差别。

难点是博客中使用 mdnice 图床的图片比较多,格式为 https://files...png ,手动下载,压缩,替换路径,费时费力。

具体的实现方案是使用 Python 正则匹配文章中 url 的值,使用 requests 下载图片至本地,使用 pngquant 将图片进行压缩并覆盖原图片,最后替换掉文章中的 url 为压缩之后图片的路径。

阅读全文 »

起因是我在日常开发过程中,基于 TLS 1.3 的协议和 JDK 的 jdk.internal.net.http.common 冲突,导致基于 Java 开发的 Jetbrains IDE 使用 Copilot 并配置 http 代理时会让电脑 CPU 突然飙升,这是老问题 了,官方一直没有修复,因此完成了一个支线任务,花了一个星期快速写了一个 Hysteria2 的 Web 管理面板:h-ui,还有一个原因是分布式架构的 trojan-panel 大而全,部署之后比较耗服务器资源,h-ui 更加的轻量,打包为二进制,部署简单,资源占用比较少,适合小鸡使用,同时对于垃圾线路 Hysteria2 可能有提速的效果,并且 Hysteria2 API 丰富,文档全,代码质量比较高,综上原因,最终选了 Hysteria2。

代理软件的 Web 面板在 GitHub 上有好几个,叫这个 ui 那个 ui,那我们也叫 ui 吧。只针对 Hysteria2 的面板 h-ui 是第一个,这样的好处是功能专一,对 Hysteria2 的适配程度高。

阅读全文 »

在 Linux 上安装软件比在 Windows 上安装要麻烦很多,通常在 Linux 上是没有可视化界面的,移动、重命名、编辑文件都会比在 Windows 上麻烦的多,所以这些重复的操作完全可以由一键脚本来实现,Linux 上脚本通常是 Shell 或者 Python,就好比是 Windows 下的 bat 批处理脚本,也可以实现自动化安装的效果。

我日常开发所有用到的服务器系统都是 Linux,包括我买的服务器,公司部署的项目,还有自己安装的虚拟机,只要是作为服务器去使用的都是 Linux,那么这个多服务器,我不可能每次安装软件的时候都要打开笔记,一行代码一行代码的敲,而且不同的 Linux 发行版之间命令还有差异,为了更加的方便,所以我自己写了一个适用我自己的一套脚本。

阅读全文 »

背景是需要开发一些自动化程序,由此想到了,可以通过adb调试安卓手机,通过USB连接线连接至电脑主机,然后写一些python程序自动化操作手机,以此来代替重复的操作,效率比人工高很多,但是考虑到购买手机需要较高的成本,所以本文介绍安装安卓虚拟机,并通过adb调试局域网内的安卓虚拟机。

阅读全文 »

VirtualBox 除了可以安装 Linux、Windows 系统之外,还可以安装安卓系统,那不就相当于一个模拟器了,省的再去下载夜神,逍遥之类的定制化模拟器。借此机会,实践一下。

阅读全文 »

最近折腾给路由器刷一个系统(老毛子),不然每天到家开电脑或者玩手机都要在后台挂一个软件,不仅是加长了使用的链路,而且对于手机电池也是损耗。 用路由器的好处是可以辐射一定的范围,只要连上指定的WIFI就可以上网, 最主要是的一部分软件没有设置代理的方式(比如:OBS),还要自己通过别的工具才能对指定的软件进行代理 ,这无疑是加大了自己的折腾成本,不如路由器全局代理一劳永逸。

阅读全文 »

指定脚本解释器

  1. #!/bin/bas#!/bin/sh
  2. #!/usr/bin/env bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH

1和2的区别见以下2篇文章。大致意思是,第二种方式是自己去$PATH下找bash

  1. Why is it better to use “#!/usr/bin/env NAME” instead of “#!/path/to/NAME” as my shebang?
  2. What is the difference between “#!/usr/bin/env bash” and “#!/usr/bin/bash”?

声明版本信息

阅读全文 »
0%