ZFile学习笔记——启动!
项目介绍 ZFile 是一个适用于个人或小团队的在线网盘程序,可以将多种存储类型统一管理,再也不用登录各种网站管理文件,现在你只需要在 ZFile 中畅快使用!——GitHub README 我第一次见到这个项目是在折腾LG手机刷机的时候发现的,有人用它托管刷机包。后来我自己把它部署到服务器上试了一下,发现可以很方便的挂载OneDrive,并且可以直接生成下载链接。 最近在学习Java项目,但是网上找到的学习项目都是玩具项目(黑马全家桶、各种知识星球项目),他们很多都存在功能简陋、代码不规范、没有完善的配套前端等等问题……最重要的是项目的需求和功能都是虚拟的,根本没有实际意义。于是想到了之前用过的ZFile恰好就是用Java开发的,并且复杂程度貌似并不高🤨(我猜的),用来学习实际的Java项目岂不是完美? ZFile使用的技术 把项目从GitHub上克隆下来后我首先查看了maven的配置文件pom.xml,从中可以查看该项目所使用到的技术。 1. SpringBoot与Java版本 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.3.2</version> <relativePath/> <!-- 不要去本地找父 POM,而是直接去仓库下载它 --> </parent> ... <java.version>21</java.version> <maven.compiler.source>21</maven.compiler.source> <maven.compiler.target>21</maven.compiler.target> 使用Spring Boot 3.3.2作为基础框架并使用Java 21,表明这个项目的技术是比较新的。 2.依赖 依赖分为几大类,反映了项目的功能模块和技术栈: Spring Boot相关 spring-boot-starter-web: 提供Web开发支持,用于构建RESTful API或Web应用。 spring-boot-starter-aop: 支持面向切面编程(AOP),用于日志、事务等横切关注点。 spring-boot-configuration-processor: 生成配置元数据,支持Spring Boot的自动配置。 spring-boot-starter-data-redis: Redis支持,可能用于缓存或会话管理。 spring-boot-starter-cache: 提供缓存支持,可能与Redis结合使用。 spring-boot-starter-thymeleaf: Thymeleaf模板引擎,用于服务端渲染HTML页面。 spring-boot-starter-validation: Hibernate Validator,用于参数校验。 数据库相关 mysql-connector-j: MySQL数据库驱动(运行时依赖)。 sqlite-jdbc: SQLite数据库驱动,支持轻量级数据库。 flyway-core, flyway-mysql: Flyway数据库迁移工具(版本10.12.0),用于数据库版本管理和Schema迁移。 mybatis-plus-spring-boot3-starter: MyBatis-Plus(版本3.5.6),增强型ORM框架,简化数据库操作。 存储策略相关 upyun java-sdk: 又拍云存储SDK。 software.amazon.awssdk:s3: AWS S3存储支持。 qiniu-java-sdk: 七牛云存储SDK。 jsch: SSH/SFTP支持,可能用于文件传输。 sardine: WebDAV协议支持。 google-api-client: Google API客户端,可能用于Google Drive等存储服务。 认证/权限 sa-token-spring-boot3-starter: Sa-Token(版本1.38.0),轻量级认证授权框架,可能用于用户登录、权限管理和会话控制。 API文档 knife4j-openapi3-jakarta-spring-boot-starter: Knife4j(版本4.5.0),基于OpenAPI 3的API文档生成工具,提供交互式API文档。 工具类 hutool-all: Hutool工具库,提供丰富的Java工具方法。 poi-ooxml: Apache POI,用于处理Excel、Word等Office文档。 commons-compress: 文件压缩/解压支持。 lombok: 简化Java代码(如自动生成Getter/Setter)。 commons-net: 网络工具库,支持FTP、Telnet等协议。 okhttp: HTTP客户端,用于网络请求。 fastjson2: JSON处理库,性能优异。 guava: Google Guava工具库,提供集合、缓存等功能。 mapstruct: 对象映射工具,简化DTO与实体转换。 commons-chain: 责任链模式实现。 totp: 时间戳一次性密码(TOTP),可能用于双因素认证。 jcommander: 命令行参数解析。 json: JSON处理库。 httpclient5, httpmime: Apache HttpClient,支持HTTP请求和文件上传。 bcprov-jdk15on: Bouncy Castle加密库,支持加密操作。 spring-retry: Spring重试机制,处理失败重试逻辑。 commons-fileupload: 文件上传支持。 dns-cache-manipulator: DNS缓存操作,可能用于优化网络请求。 oshi-core: 系统监控库,用于获取系统资源信息。 GraalVM支持 graal-sdk: GraalVM SDK(版本24.1.0,provided scope),用于支持GraalVM原生镜像编译。 构建配置() 插件 spring-boot-maven-plugin: Spring Boot构建插件,支持打包可执行JAR。 maven-compiler-plugin: 配置Java 21编译,启用MapStruct、Lombok等注解处理器。 flyway-maven-plugin: Flyway数据库迁移插件,用于执行数据库迁移任务。 Profiles 使用 native-maven-plugin(GraalVM构建工具)。 配置了特定的JVM参数和构建参数(如-march=compatibility, AddAllCharsets等)。 启用了自定义的AOT(Ahead-of-Time)特性,包括Lambda、加密(Bouncy Castle)和SQLite支持。 项目支持GraalVM原生编译,以提高启动性能和降低内存占用。 ZFile的功能 在深入ZFile的源码之前我打算先把它的基本功能搞清楚,然后按照不同的功能模块分别去细致地学习代码实现。 ...
搭建IPv6+SSL中转服务器
前言 在一年多前我写了一个教程利用云服务器实现校园网免流,在这篇文章中介绍了如何搭建一个使用ShadowSocks协议的IPv6中转服务器,这种方式存在一些弊端,例如:非常容易被GFW嗅探到、客户端已经停更、一些软件的流量无法被接管…经过研究,我找到了一个目前理论上安全性比较高速度也比较快的解决方案,即基于Trojan协议,利用TLS加密并且把我们的中转服务器伪装成一个站点。这种方案从技术上来说基本杜绝了被嗅探的可能,让我们的中转服务器更加的稳定。 购买服务器 目前支持IPv6的且价格便宜的云服务商也就一个Vultr了,如果还没有注册点击这里注册。 这里选择最普通的服务器就行 地区我选择的是纽约,因为这里有3.5$一个月的套餐 系统镜像选择CentOS 7 我这里选择的是3.5$一个月的套餐,每个月有500g的流量,如果你的需求比较大可以选择5$一个月的套餐 查看服务器信息,用IP地址还有密码进行ssh登录 刚开通服务器的几分钟内是无法进行ssh连接的,需要等待系统安装完毕 要使用IPv6地址的话得先去设置里添加一个IPv6地址 在域名的DNS解析里添加一条AAAA记录指向刚刚分配的IPv6地址 申请SSL证书 使用Trojan协议需要一个SSL证书,在等待系统安装的时候我们去SSL For Free申请一个。 点击申请一个新的证书 填入需要申请的域名 选择免费的90天证书 这个自动填入信息开着就好 选择免费的套餐就行 在这里需要验证域名的所有权,点击通过DNS验证 按照上一步的提示去设置域名的DNS解析 DNS设置完成后就回到申请页面点击验证 验证通过后就可以点击下载证书把证书给下载下来 将压缩包解压可以得到这几个文件 将证书文件上传至服务器 安装和配置x-ui x-ui是一个支持多协议多用户的 xray 面板,支持vmess、vless、trojan、shadowsocks、dokodemo-door、socks、http协议,功能非常强大,我们的trojan服务就是使用它创建和管理的。 安装x-ui 在服务器终端输入命令: bash <(curl -Ls https://raw.githubusercontent.com/vaxilu/x-ui/master/install.sh) 之后将会执行脚本自动安装,中途需要自行输入后台用户名密码还有端口号。 安装完成后先停用CentOS的防火墙 systemctl stop firewalld 然后在浏览器访问服务器IP:你设置的端口号看看是否能够进入x-ui后台,如果成功进入则表示安装成功。 配置x-ui 在面板设置里填入刚刚上传的SSL证书路径,点击重启面板,之后就可以通过域名:端口号来访问x-ui面板了 在入站列表添加一个trojan节点,端口填443,公钥和密钥还是填刚刚上传的证书路径,最后点击添加即可 使用Clash连接 虽然支持trojan的客户端有很多,但我最喜欢用的还是Clash,因为它的功能特别强大,甚至可以当作一个网关使用。 ...
Hackintosh-黑苹果
什么是黑苹果 根据Stack Overflow在2021年的统计中显示:在专业的开发者中有30.04%的人选择使用macOS操作系统。 可以看到包括macOS在内,类Unix操作系统的使用占比接近60%,这个统计结果足以说明大部分的专业程序员是更加偏向于与类Unix系统的。原因也很好解释,在各种开发过程中不可避免的要使用各式各样的命令行工具、配置各种环境,Windows操作系统的命令行使用体验实在谈不上优秀。 但是为什么大家不直接使用Linux作为主力开发操作系统呢?原因是各大常用软件基本上都把Linux视作孤儿,例如“国民级软件”qq和微信到现在都无法在Linux上正常使用。 然而macOS就很好的平衡了这些需求,有强大的终端、与Linux师出同门很多的命令可以通用、各种常用软件都有这与Windows同等级的支持…由于本质上是属于闭源的定制系统,所以可以很好的和苹果其他设备例如:iPhone、iPad、AirPods或者另一台Mac设备协同使用。我觉得macOS相较于Windows的高分辨率屏幕体验要强太多,在4k甚至更高的分辨率下绝大多数软件仍然有着优秀的使用体验,但是Windows这边一旦开启了150%以上的缩放,很多常用软件都会变得模糊不堪。大体上我们可以把macOS当作一个深度定制的Linux发行版使用,但是代价是你必须花大价钱购入一台Mac电脑。 那么我们有没有可能把macOS当作普通的操作系统一样安装在自己的电脑上呢?答案是肯定的。 2005年6月的苹果全球开发者大会(WWDC 2005),当时苹果宣布他们将把其个人电脑从PowerPC架构转向英特尔架构。所以从2005年开始一直到2020年苹果推出的最后一台基于英特尔架构的电脑从理论上都是可以运行在我们所熟知的英特尔x86架构PC上的。 如何打造一台自己的Mac 目前最流行的制作黑苹果方案是使用OpenCore bootloader来引导进入macOS。 既然想做那就一定要做一台完美的Mac,我们的目标不仅仅是要能运行macOS,而是要实现一台Mac电脑所能实现的所有功能(Wi-Fi、蓝牙、隔空投送、随航、通用控制…) 因为在macOS中无法自行安装驱动,所有的硬件驱动都是直接写入系统中的,所以我们需要使用已经在系统中写好了驱动的程序,俗称“免驱设备”。在这里查看支持macOS的硬件设备 购买到合适的硬件后,根据OpenCore的文档定制属于自己硬件的引导程序就大功告成啦(实际上中间有很多的坑和困难,感兴趣的同学可以自行搜索教程) 我的Mac Pro Mini 经过不断的折腾和捣鼓,我自己打造了一台Mac Pro Mini。 它的具体配置如下: 硬件 型号 主板 ROG STRIX B460-I GAMING 处理器 Intel® Core™ i9-10900 显卡 蓝宝石 RX580 8G D5 白金版 OC 网卡 BCM94352Z(fenvi) 内存 芝奇 Ripjaws V 16Gx2 硬盘 西数 WD_BLACK™ SN750 500G 基于OpenCore和以上硬件定制的EFI引导程序我已经开源至GitHub,欢迎各位有兴趣的同学来抄作业、提交issues。本项目持续更新,如果喜欢的话也可以给个star。 ROG-B460i_Hackintosh_OpenCore_EFI
计算机中的数字
计算机中的数字是如何表示的 由于计算机所使用的硬件特性,导致了在计算机的底层数字只能以二进制的形式进行表达。二进制和十进制一样,也是一种进位计数制,但是它的基数是 2。二进制表达式中 0 和 1 的位置不同,它所代表的数值也不同。例如,二进制数 0000 1010 表示十进制数 10。一个二进制数具有两个基本特点:两个不同的数字符号,即 0 和 1,逢二进一。 关于二进制的维基百科解释 无符号数 无符号数顾名思义就是单纯的数字,没有正负号也没有小数点,是非负整数。这一类型的数字表示起来最简单,只需用二进制的方式写出即可。 为了更加清楚的解释无符号数的表示方法CSAPP中介绍了一种图形化的表示方法来帮助读者理解无符号数的编码方式。 二进制数从右往左的第i位即表示为$2^{i-1}$,将不为0的项相加得到所表示的无符号数。 有符号数 在现实世界中,无符号数的局限性是相当大的,那么拥有正负号的数字该如何进行编码呢? 计算机中使用补码来表示有符号数,简单的来说就是在无符号数表示方法的基础上新增了一个符号位以表示正负。最高位若为0则表示正数,最高位若为1则表示负数。需要注意的是,符号位并不是单纯的表示数的正负性,它代表负权重的概念。 若一个有符号数的二进制形式如下: 那么它的十进制的计算方法为: 两个例子: 为了便于理解,补码也有对应的图形化表示方式: 其中蓝色代表正数,灰色代表负数,由图可知当最高位为1时得到的必定为负数。 数字的表示范围 无符号数的表示范围 对于无符号数,当字长为n时,其能表示的最大数为:$$1\times 2^{0} +1\times 2^{1} +\dots +1\times 2^{n-1} =2^{n} -1$$ 字长为8到64的无符号数所能表示的范围图表: 有符号数的表示范围 有符号数与无符号数的区别在于其最高位充当符号位,所以只有n-1位能够表示数的大小。 所能表示的最大值为:$$1\times 2^{0} +1\times 2^{1} +\dots +1\times 2^{n-2} - 0\times 2^{n-1} =2^{n-1} -1$$ 所能表示的最小值为:$$0\times 2^{0} +0\times 2^{1} +\dots +0\times 2^{n-2} - 1\times 2^{n-1} =-2^{n-1}$$ ...
Git基础命令
获取 Git 仓库 通常有两种获取 Git 项目仓库的方式: 将尚未进行版本控制的本地目录转换为 Git 仓库; 从其它服务器克隆一个已存在的 Git 仓库。 两种方式都会在你的本地机器上得到一个工作就绪的 Git 仓库。 在已存在目录中初始化仓库 git init 该命令将创建一个名为 .git的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是Git 仓库的骨干。 但是,在这个时候,我们仅仅是做了一个初始化的操作,你的项目里的文件还没有被跟踪。 克隆现有的仓库 克隆仓库的命令是 git clone <url>。比如,要克隆 Git 的链接库libgit2,可以用下面的命令: git clone https://github.com/libgit2/libgit2 这会在当前目录下创建一个名为libgit2的目录,并在这个目录下初始化一个 .git文件夹, 从远程仓库拉取下所有数据放入 .git文件夹,然后从中读取最新版本的文件的拷贝。 如果你进入到这个新建的 libgit2文件夹,你会发现所有的项目文件已经在里面了,准备就绪等待后续的开发和使用。 如果你想在克隆远程仓库的时候,自定义本地仓库的名字,你可以通过额外的参数指定新的目录名: git clone https://github.com/libgit2/libgit2 mylibgit 这会执行与上一条命令相同的操作,但目标目录名变为了mylibgit。 记录每次更新到仓库 现在我们的机器上有了一个真实项目的 Git 仓库,并从这个仓库中检出了所有文件的工作副本。 通常,你会对这些文件做些修改,每当完成了一个阶段的目标,想要将记录下它时,就将它提交到仓库。 请记住,你工作目录下的每一个文件都不外乎这两种状态:已跟踪(tracked)或未跟踪(untracked)。 已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后, 它们的状态可能是未修改,已修改或已放入暂存区。简而言之,已跟踪的文件就是 Git 已经知道的文件。 工作目录中除已跟踪文件外的其它所有文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有被放入暂存区。 初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态,因为 Git刚刚检出了它们, 而你尚未编辑过它们。 编辑过某些文件之后,由于自上次提交后你对它们做了修改,Git 将它们标记为已修改文件。 在工作时,你可以选择性地将这些修改过的文件放入暂存区,然后提交所有已暂存的修改,如此反复。 检查当前文件状态 可以用 git status命令查看哪些文件处于什么状态。如果在克隆仓库后立即使用此命令,会看到类似这样的输出: $ git status On branch master Your branch is up-to-date with 'origin/master'. nothing to commit, working directory clean 跟踪新文件 使用命令git add开始跟踪一个文件。所以,要跟踪README文件,运行: ...
SQL语句笔记
本文所使用的数据库 //学生:学号S#, 姓名Sname, 性别Ssex, 年龄Sage, 所属系别D#,班级Sclass Student (S# char(8),Sname char(10),Ssex char(2),Sage integer,D# char(2),Sclass char(6)) //院系:系别D#,系名Dname, 系主任Dean Dept (D# char(2),Dname char(10),Dean char(10)) //课程:课号C#, 课名Cname, 教师编号T#, 学时Chours,学分Credit Course (C# char(3),Cname char(12),Chours integer,Credit float(1),T# char(3)) //教师:教师编号T#,教师名Tname, 所属院系D#,工资Salary Teacher (T# char(3),Tname char(10),D# char(2),Salary float(2)) //选课:学号S#, 课号C#, 成绩Score SC (S# char(8),C# char(3),Score float(1)) 建立数据库 定义数据库和表 创建Database 数据库(Database)是若干具有相互关联关系的Table/Relation的集合 数据库可以看作是一个集中存放若干Table的大型文件 创建数据库的简单语法形式: create database 数据库名; 示例:创建课程学习数据库SCT create database SCT; 创建Table 创建table简单语法形式: Create table 表名(列名 数据类型[Primary key|Unique][Notnull][, 列名 数据类型[Primary key|Unique][Notnull] , ... ]) ; “[ ] ”表示其括起的内容可以省略,“| ”表示其隔开的两项可取其一 ...
Android系统获取root权限教程
众所周知Android系统在获取root权限之后可以解锁各种各样的玩法(超频、删温控、刷模块、修改系统配置…)没有root权限的安卓机是没有灵魂的。现在的主流方法是用magisk修补boot镜像来获取root权限,操作十分简单。 详细的视频教程和相关链接 《玩机必看!带你入坑安卓刷机,小白也能看懂的ROOT基础指南来啦!》 https://www.bilibili.com/video/BV1BY4y1H7Mc 各种玩机地址/工具/命令汇总:http://wanji.jamcz.com/ Android SDK(ADB和Fastboot电脑端工具):https://developer.android.google.cn/studio/releases/platform-tools?hl=zh-cn ADB/Fastboot驱动:https://cz-jam.lanzouj.com/iZICY02v2k8j TWRP:https://twrp.me/ Magisk:https://github.com/topjohnwu/Magisk 小米解锁工具:https://www.miui.com/unlock/index.html 小米ROM下载:https://xiaomirom.com/series/ 小米刷机工具:https://cdn.alsgp0.fds.api.mi-img.com/micomm/MiFlash2020-3-14-0.rar 一加ROM下载:https://www.oneplus.com/cn/support/softwareupgrade 三星刷机工具:https://odindownload.com/ 三星ROM下载:https://www.sammobile.com/firmwares/ 魅族ROOT链接:https://mroot.flyme.cn/ OPPO解锁:https://www.oppo.cn/thread-397164526-1 OPPO ROM:https://www.coloros.com/rom Realme解锁:https://www.realmebbs.com/post-details/1275426081138028544 Realme刷机工具:https://www.realmebbs.com/post-details/1271082970484060160 Realme ROM:https://www.realme.com/support/software-update 索尼解锁:https://developer.sony.com/develop/open-devices/get-started/unlock-bootloader 索尼ROM:https://xperifirm.com/ MOTO解锁:https://motorola-global-portal.custhelp.com/app/standalone/bootloader/unlock-your-device-a MOTO ROM:https://mirrors.lolinet.com/firmware/motorola/ payload-dumper解包工具:https://mrzzoxo.lanzouw.com/iR65zpaueyd 酷安(玩机社区):https://www.coolapk.com/ XDA(海外玩机论坛):https://forum.xda-developers.com/ 解锁bootloader 手机厂商会出场默认锁定bootloader(用来防止系统启动文件被替换),刷入magisk的第一步就是把这个bootloader解开,每家厂商的解锁方法不尽相同,这里放出一个b站教程。 『解BL锁』B站最强 之 一个视频解决你手机的BL锁困扰 https://www.bilibili.com/video/BV1tT4y1d7ao 获取系统镜像中的boot.img文件 刷入magisk获取root的核心步骤就是要利用magisk对boot.img进行修补然后替换掉原厂的boot文件,所以第一步就是要获取原厂镜像的boot.img。这里以Google Pixel 4为例,下拉状态栏查看当前系统版本。 进入手机镜像官网下载该版本的刷机包。 把它解压,我们想要的boot.img就在这里,将它传入待root手机 使用magisk修补boot.img 下载并安装magisk:https://github.com/topjohnwu/Magisk/releases,此时超级用户选项还无法进入 点击安装-选择并修补一个文件-选择刚刚传入手机的boot.img-开始 完成后在/Download目录中会出现一个被修补好的boot文件,将它传回电脑 刷入boot.img 手机进入开发者模式,开启USB调试功能连接电脑 如果不会配置adb环境和驱动这里推荐使用酷安晨钟酱开发的《搞机工具箱》 https://jamcz.com/gjgjx/ 进入bootloader adb reboot bootloader 由于Pixel系列在Android12直接刷入修补后的boot.img会开不了机(我在写这篇博客的时候就翻车了,其他手机保险起见也可以用下列方法,头铁直接fastboot flash刷入也行)所以先不刷入,使用修补后的boot开机。如果你不小心直接刷入无法开机,可以Google一下有没有关闭verify的方法,或者把各个分区单独刷回官方固件,如果都无法启动,只能丢失数据重刷系统了。 fastboot boot /你的boot.img存放路径/修改后的boot.img 启动后打开magisk可以看到超级用户已经可以打开了,但是重启后root就没了,还差最后一个步骤 ...
利用云服务器实现校园网免流
学校的宽带每个月限流60g的问题困扰我很久了。虽然下载基本都去pt站,但是看视频没有办法免流,因此有了自己做一个ipv6节点用来免流的想法 首先是找vps服务器,国内绝大部分都没有分配ipv6地址,并且宽带小的可怜,所以决定使用国外的服务器,这样带来的另一个好处是可以同时实现科学上网。最终我选择了vultr的东京数据中心,在国内的延迟尚可接受,并且最低5usd一个月的价格也不错 如果你所在学校分配了edu邮箱,可以申请GitHub Education项目,省去服务器费用 服务器的购买和连接参考https://zhuanlan.zhihu.com/p/112198146 购买服务器是注意是否支持ipv6地址 我使用的操作系统是CentOS 7,理论上Ubuntu/Debian都可以 进入控制台后使用秋水逸冰大神的一键安装脚本安装shadowsocks,在控制台输入如下代码 wget --no-check-certificate -O shadowsocks-all.sh https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-all.sh chmod +x shadowsocks-all.sh ./shadowsocks-all.sh 2>&1 tee shadowsocks-all.log 选择Shadowsocks-Python版本,期间会询问密码,加密方式,端口等,等待安装完毕,最终得到类似下面这样的提示 ongratulations, shadowsocks install completed! Your Server IP:your_server_ip Your Server Port:4396 Your Password:your_password Your Local IP:127.0.0.1 Your Local Port:1080 Your Encryption Method:aes-256-cfb Welcome to visit:http://teddysun.com/486.html Enjoy it! 因为我们需要使用ipv6所以需要对shadowsocks的配置作一点简单的修改 vim 打开配置文件 vim /etc/shadowsocks-python/config.json 按i进入编辑模式在第一行增加ipv6监听(此方法在新python版本ss中会拒绝IPv4的访问) { "server":"::", ... ... ... } 重点是server那里的::这样可以同时监听ipv4和ipv6 ctrl+c退出编辑模式 输入 “:x” (英文冒号+x)保存并退出 重启 shadowsocks /etc/init.d/shadowsocks-python restart 使用方法 /etc/init.d/shadowsocks-python start # 开启 /etc/init.d/shadowsocks-python stop # 关闭 /etc/init.d/shadowsocks-python restart # 重启 /etc/init.d/shadowsocks-python status # 状态 至此,服务端的shadowsocks搭建完毕 ...