0xL4ugh 2023
这回跟着个队伍跑,不过还是2X以后的成绩,前边太卷了。
自己会的部分,有些是别人已经提交了的。记录一下。
Crypto
crypto 1
给了一些数据,像这样就没有别的了
ct = [0, 1, 1, 2, 5, 10, 20, 40, 79, 159, 317, 635, 1269, 2538, 5077, 10154, 20307, 40615, 81229, 162458, 324916, 649832, 1299665, 2599330, 5198659, 10397319, 20794638, 41589276, 83178552, 166357103, 332714207, 665428414, 1330856827, 2661713655, 5323427309, 10646854619, 21293709237, 42587418474, 85174836949, 170349673898, 340699347795, 681398695591, 1362797391181, 2725594782363, 5451189564725, 10902379129451, 21804758258901, 43609516517803, 87219033035605, 174438066071211, 348876132142421, 697752264284843, 1395504528569685, 2791009057139370, 5582018114278740, 11164036228557480, 22328072457114960, 44656144914229920, 89312289828459841, 178624579656919682, 357249159313839363, 714498318627678726, 1428996637255357453, 2857993274510714906, 5715986549021429811, 11431973098042859623, 22863946196085719246, 45727892392171438492, 91455784784342876983, 182911569568685753966, 365823139137371507933, 731646278274743015865, 1463292556549486031730, ...]看了会发现一个规律:
ct[i] = bit + sum(ct[:i])把这些0,1弄出来就OK了。我来得早,这时候还没人上线,两个crypto都是1血,跟签到抢到1血一样。
#Alice and Bob decided to create their own super cryptosystem. However.. it has a super flaw
k = 0
f = ''
for i in range(1,len(ct)):f += str(ct[i]-k)k += ct[i]print(f)#前面的和+bit
f = '0'+f
for i in range(0, len(f),8):print(chr(int(f[i:i+8],2)), end='')#OSC{SUP3r!NCr3451NG_53QU3NC3}crypto 2
一个e=3的RSA题
from Crypto.Util.number import bytes_to_long, getPrime
from secret import messagesdef RSA_encrypt(message):m = bytes_to_long(message)p = getPrime(1024)q = getPrime(1024)N = p * qe = 3c = pow(m, e, N)return N, e, cfor m in messages:N, e, c = RSA_encrypt(m)print(f"n = {N}")print(f"e = {e}")print(f"c = {c}")给了好多的n,c显然,感觉如果flag不是很大可以爆破,不过只有第1行爆破出来了,正好是flag
from gmpy2 import iroot
from Crypto.Util.number import long_to_bytesmsg = open('output.txt').readlines()for i in range(11):n = int(msg[i*3][4:])e = int(msg[i*3+1][4:])c = int(msg[i*3+2][4:])print(n)print(e)print(c)while True:a,b = iroot(c,3)if b:print(long_to_bytes(a))break c+=n #OSC{C0N6r47U14710N5!_Y0U_UND3r574ND_H0W_70_U53_H4574D5_8r04DC457_4774CK_______0xL4ugh}Rev
snake
python 字节码
2 0 LOAD_CONST 1 (0)2 LOAD_CONST 0 (None)4 IMPORT_NAME 0 (base64)6 STORE_FAST 0 (base64)3 8 LOAD_CONST 1 (0)10 LOAD_CONST 2 (('Fernet',))12 IMPORT_NAME 1 (cryptography.fernet)14 IMPORT_FROM 2 (Fernet)16 STORE_FAST 1 (Fernet)18 POP_TOP4 20 LOAD_CONST 3 (b'gAAAAABj7Xd90ySo11DSFyX8t-9QIQvAPmU40mWQfpq856jFl1rpwvm1kyE1w23fyyAAd9riXt-JJA9v6BEcsq6LNroZTnjExjFur_tEp0OLJv0c_8BD3bg=')22 STORE_FAST 2 (encMessage)5 24 LOAD_FAST 0 (base64)26 LOAD_METHOD 3 (b64decode)28 LOAD_CONST 4 (b'7PXy9PSZmf/r5pXB79LW1cj/7JT6ltPEmfjk8sHljfr6x/LyyfjymNXR5Z0=')30 CALL_METHOD 132 STORE_FAST 3 (key_bytes)6 34 BUILD_LIST 036 STORE_FAST 4 (key)7 38 LOAD_FAST 3 (key_bytes)40 GET_ITER>> 42 FOR_ITER 9 (to 62)44 STORE_FAST 5 (k_b)8 46 LOAD_FAST 4 (key)48 LOAD_METHOD 4 (append)50 LOAD_FAST 5 (k_b)52 LOAD_CONST 5 (160)54 BINARY_XOR56 CALL_METHOD 158 POP_TOP60 JUMP_ABSOLUTE 21 (to 42)10 >> 62 LOAD_GLOBAL 5 (bytes)64 LOAD_FAST 4 (key)66 CALL_FUNCTION 168 STORE_FAST 4 (key)11 70 LOAD_FAST 1 (Fernet)72 LOAD_FAST 4 (key)74 CALL_FUNCTION 176 STORE_FAST 6 (fernet)12 78 LOAD_FAST 6 (fernet)80 LOAD_METHOD 6 (decrypt)82 LOAD_FAST 2 (encMessage)84 CALL_METHOD 186 LOAD_METHOD 7 (decode)88 CALL_METHOD 090 STORE_FAST 7 (decMessage)13 92 LOAD_GLOBAL 8 (print)94 LOAD_FAST 7 (decMessage)96 CALL_FUNCTION 198 POP_TOP100 LOAD_CONST 0 (None)102 RETURN_VALUE
None
手扣
import base64
from cryptography.fernet import FernetencMessage = b'gAAAAABj7Xd90ySo11DSFyX8t-9QIQvAPmU40mWQfpq856jFl1rpwvm1kyE1w23fyyAAd9riXt-JJA9v6BEcsq6LNroZTnjExjFur_tEp0OLJv0c_8BD3bg='key_bytes = base64.b64decode(b'7PXy9PSZmf/r5pXB79LW1cj/7JT6ltPEmfjk8sHljfr6x/LyyfjymNXR5Z0=')key = []
for k_b in key_bytes:key.append(k_b^160)
key = bytes(key)decMessage = Fernet(key).decrypt(encMessage)
print(decMessage)#FLAG{FLY_L1k3_0xR4V3N}
#0xL4ugh{FLY_L1k3_0xR4V3N}easy-Peasy
高低4位互换
v11[0] = 1947518052;v11[1] = 84227255;v11[2] = -181070859;v11[3] = -972881100;v11[4] = 1396909045;v11[5] = 1396929315;v12 = -10397;v13 = 0;v3 = 0i64;v16 = 0i64;v17 = 15i64;LOBYTE(Block[0]) = 0;sub_140001350(Block);sub_1400015D0(std::cout, (__int64)"Enter The Flag: ");sub_140001A50(std::cin, Block); // 读入Blockif ( v16 == 26 ){while ( 1 ){v4 = Block;if ( v17 >= 0x10 )v4 = (void **)Block[0];v5 = Block;if ( v17 >= 0x10 )v5 = (void **)Block[0];if ( *((unsigned __int8 *)v11 + v3) != ((*((char *)v4 + v3) >> 4) | (16 * (*((_BYTE *)v5 + v3) & 0xF))) )// 高低互换break;if ( ++v3 >= 26 ){v6 = sub_1400015D0(std::cout, (__int64)"The Flag is: ");v7 = Block;if ( v17 >= 0x10 )v7 = (void **)Block[0];sub_140001C50(v6, v7, v16);goto LABEL_12;}}}解
va = [1947518052,84227255,-181070859,-972881100,1396909045,1396929315,-10397]from pwn import p32v11 = b''.join([p32(v&0xffffffff) for v in va])
f = ''
for v in v11:f += chr(((v&0xf)<<4)+(v>>4))print(f)
#FLAG{CPP_1S_C00l_24527456}
#0xL4ugh{CPP_1S_C00l_24527456}lets go
代码看着很复杂,但明显能看出是字节变换
void __cdecl main_main()
{__int64 v0; // r14__int128 v1; // xmm15__int64 *v2; // rax__int64 v3; // r8__int64 v4; // r9__int64 v5; // rax__int64 v6; // rcxunsigned __int64 v7; // rbx__int64 v8; // rsiint v9; // r10d__int64 v10; // r11int v11; // r10d__int64 v12; // raxunsigned __int64 v13; // rcxint v14; // r10d__int64 v15; // raxunsigned __int64 v16; // rcx__int64 v17; // raxunsigned __int64 v18; // rcx__int64 v19; // rax__int64 v20; // [rsp-46h] [rbp-D8h]char v21; // [rsp+0h] [rbp-92h]char v22; // [rsp+1h] [rbp-91h]char v23; // [rsp+1h] [rbp-91h]__int64 v24; // [rsp+2h] [rbp-90h]__int64 v25; // [rsp+Ah] [rbp-88h]__int64 v26; // [rsp+12h] [rbp-80h]__int64 v27; // [rsp+3Ah] [rbp-58h] BYREF__int64 *v28; // [rsp+42h] [rbp-50h]void *v29; // [rsp+4Ah] [rbp-48h]char **v30; // [rsp+52h] [rbp-40h]__int128 v31; // [rsp+5Ah] [rbp-38h]const char *v32; // [rsp+6Ah] [rbp-28h]__int64 *v33; // [rsp+72h] [rbp-20h]void *v34; // [rsp+7Ah] [rbp-18h]char **v35; // [rsp+82h] [rbp-10h]if ( (unsigned __int64)&v27 <= *(_QWORD *)(v0 + 16) )runtime_morestack_noctxt_abi0();v34 = &unk_494360;v35 = &off_4C3F50;fmt_Fprint();runtime_newobject();v28 = v2;*v2 = 0LL;v32 = "\b";v33 = v2;fmt_Fscanln();v3 = *v28;v27 = *v28;v4 = v28[1];v25 = v4;v5 = 0LL;v6 = 0LL;v7 = 0LL;v8 = 0LL;while ( v5 < v4 ){v24 = v6;v26 = v5;v9 = *(unsigned __int8 *)(v3 + v5);if ( (unsigned __int8)(v9 - 65) > 0x19u ){if ( (unsigned __int8)(v9 - 97) > 0x19u ) // 符号{v10 = v6 + 1;if ( v7 < v6 + 1 ){v21 = *(_BYTE *)(v3 + v5);runtime_growslice(v20);v10 = v8 + 1;v3 = v27;v4 = v25;LOBYTE(v9) = v21;v8 = v17;v7 = v18;v5 = v26;v6 = v24;}*(_BYTE *)(v8 + v6) = v9;}else{v10 = v6 + 1;v14 = v9 - 26 * ((unsigned __int8)(v9 - 81) / 0x1Au);if ( v7 < v6 + 1 ){v23 = v14;runtime_growslice(v20);v10 = v8 + 1;v3 = v27;v4 = v25;LOBYTE(v14) = v23;v8 = v15;v7 = v16;v5 = v26;v6 = v24;}*(_BYTE *)(v8 + v6) = v14 + 16;}}else{v10 = v6 + 1;v11 = v9 - 26 * ((unsigned __int8)(v9 - 49) / 0x1Au);if ( v7 < v6 + 1 ){v22 = v11;runtime_growslice(v20);v10 = v8 + 1;v3 = v27;v4 = v25;LOBYTE(v11) = v22;v8 = v12;v7 = v13;v5 = v26;v6 = v24;}*(_BYTE *)(v8 + v6) = v11 + 16;}++v5;v6 = v10;}runtime_slicebytetostring();if ( v8 == 32 && (unsigned __int8)runtime_memequal() ){v31 = v1;v19 = runtime_convTstring();*(_QWORD *)&v31 = &unk_494360;*((_QWORD *)&v31 + 1) = v19;fmt_Fprintf();}else{v29 = &unk_494360;v30 = &off_4C3F60;fmt_Fprint();}
}这个只需要个码表就行,输入字母得到的就是码表,然后手工对应填一下
输入得到对应关系
abcdefghijklmnopqrstuvwxyz012345
qrstuvwxyzabcdefghijklmnop012345ABCDEFGHIJKLMNOPQRSTUVWXYZ012345
QRSTUVWXYZABCDEFGHIJKLMNOP01234567890{_} 数字符号不变c = b"u507rv78qr5t6q99941422uursv94464"u507rv78qr5t6q99941422uursv94464
e507bf78ab5d6a99941422eebcf94464手工输入得到flag
ef➤
Correct:)
FLAG{e507bf78ab5d6a99941422eebcf94464}
52 in example/user/hello/hello.go换头
0xL4ugh{e507bf78ab5d6a99941422eebcf94464}XPacker 未完成
看上去是运行时释放一个程序再找,但怎么运行都不释放,也许想错了
Misc
ATT-IP
流量题,wireShark打开一点点到结果

57包:
tcp://91.243.59.76:23927/
0xL4ugh{91.243.59.76_23927}
PVE
这个是别的提交的,只因为第1步没作出来后边的就没想弄。
给的一vmware的临时文件.vmem 一直想用什么软件找到。其实只有第1题用软件,其它都是在时差搜文本。
后来下了volatility 3才弄好这一步
┌──(kali㉿kali)-[~/volatility3]
└─$ py vol.py -f ~/ctf/PVE.vmem Banners
Volatility 3 Framework 2.4.1
Progress: 100.00 PDB scanning finished
Offset Banner0x1a00180 Linux version 4.4.0-186-generic (buildd@lcy01-amd64-002) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12) ) #216-Ubuntu SMP Wed Jul 1 05:34:05 UTC 2020 (Ubuntu 4.4.0-186.216-generic 4.4.228)
0x211e6a4 Linux version 4.4.0-186-generic (buildd@lcy01-amd64-002) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12) ) #216-Ubuntu SMP Wed Jul 1 05:34:05 UTC 2020 (Ubuntu 4.4.0-186.216-generic 4.4.228)
0x1aaf7338 Linux version 4.4.0-186-generic (buildd@lcy01-amd64-002) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12) ) #216-Ubuntu SMP Wed Jul 1 05:34:05 UTC 2020 (Ubuntu 4.4.0-186.216-generic 4.4.228)
0x1fde00a8 Linux version 4.4.0-186-generic (buildd@lcy01-amd64-002) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12) ) #216-Ubuntu SMP Wed Jul 1 05:34:05 UTC 2020 (Ubuntu 4.4.0-186.216-generic 4.4.228)flag1:0xL4ugh{Ubuntu_4.4.0-186-generic}第二步是Apache的版本,搜apache有很多,主要是两个版本,第2个=的是
0xL4ugh{2.2.14}第三步找 flag 搜0xL4ugh
sudo echo "0xL4ugh{S4D_Y0U_G07_M3}" > flag.txt
0xL4ugh{S4D_Y0U_G07_M3}第四个找程序里隐写的flag
int main(void){char flag[] = "0xL4ugh{H1DD3N_1N_PR0CE$$}";sleep(6969696969);return 0;
}0xL4ugh{H1DD3N_1N_PR0CE$$}第五个找攻击求密码,没弄成,linux的密码存在shadow文件但这里没密码,再找passwd也没有,按密码的特征 $1$salt$enc_pass 搜$1$得到一个密码
Name: passwd/user-password-crypted
Template: passwd/user-password-crypted
Value: $1$JULXDu5H$c/QbtxOmwiX0rR7f0NXxj.
Owners: ubiquity
Flags: seen从网站上解密得到 mrx 提交不正确。
队友还作了一些,刚开始已经狂飙到第2了,后来慢慢又多了1位成2x了
相关文章:
0xL4ugh 2023
这回跟着个队伍跑,不过还是2X以后的成绩,前边太卷了。自己会的部分,有些是别人已经提交了的。记录一下。Cryptocrypto 1给了一些数据,像这样就没有别的了ct [0, 1, 1, 2, 5, 10, 20, 40, 79, 159, 317, 635, 1269, 2538, 5077, 1…...
Mybatis(4)之跟着老杜做一个简单的银行转账会话
这是个MVC项目,我不一定可以完整的实现这个项目,但力求把这个复现出来,尽量的复现细节。 第一步:创建数据库 表 创建表如下: 我们使用 int 是为了方便 然后采用 demcial,精确度较高 添加两个用户 然后…...
VBA提高篇_ 22 事件处理
文章目录1.事件编程2.常用工作簿事件名称与对应处理过程名称示例3. 事件编程的步骤4.工作簿事件4.1 Open4.2 BeforeClose4.3 NewSheet5.工作表事件6.变量和过程函数的作用域1.事件编程 写在事件发生地(对应工作簿或工作表) 2.常用工作簿事…...
【蓝桥杯集训·周赛】AcWing 第91场周赛
文章目录第一题 AcWing 4861. 构造数列一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解第二题 AcWing 4862. 浇花一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解第三题 AcWing 4861. 构造数列一、题目1、原题…...
【人工智能AI】三、NoSQL 实战《NoSQL 企业级基础入门与进阶实战》
帮我写一篇介绍NoSQL的技术文章,文章标题是《NoSQL 实战》,不少于3000字。这篇文章的目录是 3.NoSQL 实战 3.1 MongoDB 入门 3.1.1 MongoDB 基本概念 3.1.2 MongoDB 安装与配置 3.1.3 MongoDB 数据库操作 3.2 Redis 入门 3.2.1 Redis 基本概念 3.2.2 Red…...
platform 总线
驱动的分离与分层思想 分离:硬件信息分离; 在编写硬件驱动的时候,需要操作许多硬件寄存器。比如gpio 驱动,你需要知道gpio控制器 寄存器的地址,你想要哪个gpio输出?或是输入? 这些操作最终都是靠设置寄存…...
2023第10届生物发酵展3月30-4月1号山东济南开展,参观路线来了
2023第10届生物发酵展3月30-4月1号山东济南开展,参观路线来了!展会时间:2023年3月30日-4月1日展馆地址:山东国际会展中心(济南市槐荫区日照路1号)展馆:4号馆、5号馆BIO CHINA生物发酵展…...
RK356x U-Boot研究所(命令篇)3.6 fdt命令的用法
平台U-Boot 版本Linux SDK 版本RK356x2017.09v1.2.3文章目录 一、fdt命令的配置二、fdt命令的定义三、fdt命令的用法3.1 fdt list3.2 fdt rm3.3 fdt set一、fdt命令的配置 .config配置文件需要有以下配置: rk3568_defconfig默认已使能。 二、fdt命令的定义 usb命令定义在cm…...
2023年社工工资多少钱一月 能领多少补贴
2023年社会工作者人员的待遇还算可以,每月的全额工资一共5000多,扣完五险一金以后每月的到手工资一共4000多,不同地区薪资也是不同的,一线城市会在7千元以上,还可以领取几百到几千元不等的补贴。 12023年社工工资多少钱…...
面试攻略,Java 基础面试 100 问(十一)
抽象类(abstract class)和接口(interface)有什么异同? 抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现ÿ…...
接口测试(Fiddler工具)
目录 1.Fiddler是什么? 2.Fiddler的原理 3.Fiddler安装 4.Fiddler界面 4.1.常用工具 4.2 会话列表 4.3 状态栏 4.4 内容显示区 1.Fiddler是什么? Fiddler是客户端与服务器之间的HTTP代理,是当前最常用的HTTP协议抓包工具。 主要功能&a…...
Debian/Ubuntu 安装和使用 perf 调试工具
为操作系统安装基本依赖环境:apt-get update -y apt-get upgrade -y apt-get install lrzsz zip unzip libkrb5-dev libicu-dev screen iftop openssl libssl-dev libunwind8 iftop net-tools gcc gdb cmake curl wget -y apt-get install gcc gdb cmake python-dev…...
【Python语言基础】——Python NumPy 数组连接
Python语言基础——Python NumPy 数组连接 文章目录 Python语言基础——Python NumPy 数组连接一、Python NumPy 数组连接一、Python NumPy 数组连接 连接 NumPy 数组 连接意味着将两个或多个数组的内容放在单个数组中。 在 SQL 中,我们基于键来连接表,而在 NumPy 中,我们按…...
解决IDEA报错:无效的目标发行版: 17
解决IDEA报错:无效的目标发行版: 17 目录解决IDEA报错:无效的目标发行版: 17报错由来解决报错【1】检查setting设置,查看编译器编译模块的编译版本是否是你需要的【2】尝试去修改当前项目的启动设置,设置JRE为你需要的版本。【3】…...
Redis第四讲
目录 四、Redis04 4.1 Redis集群应用场景 4.2 集群 4.2.1 基本原理 4.2.2 主从复制的作用 4.3 配置集群(一台虚拟机) 4.3.1 规划网络 4.3.2 创建节点 4.3.3 创建目录 4.3.4 配置redis7001.conf 4.3.5 配置其余文件 4.3.6 后台启动redis 4.3…...
Linux Ubuntu 软件安装与卸载
文章目录1 下载 deb 安装包后安装2 清理安装包3 卸载安装2 Ubuntu升级某个软件参考:1 下载 deb 安装包后安装 进入下载位置,执行 terminal sudo dpkg -i *.deb推荐sudo apt install *.deb 2 清理安装包 sudo apt-get install 会将下载的文件放在 /var…...
metasploit穷举模块
目录 工具介绍 常用模块 参数介绍 工具使用 工具介绍 Metasploit框架(Metasploit Framework, MSF)是一个开源工具, 旨在方便渗透测试,它是由Ruby程序语言编写的模板化框架,具有很好的扩展性,便于渗透测试人员开发、使用定制的…...
day35 贪心算法 | 435、无重叠区间 763、划分字母区间 56、合并区间
题目 435、无重叠区间 给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。 注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。 示例 1: 输入: [ [1,2], [2,3], […...
C++Primer15.5节练习
练习15.18: Base* p &d1:合法 p &d2:不合法,只有当派生类公有地继承基类时,用户代码才能使用派生类向基类的转换 p &d3:不合法,只有当派生类公有地继承基类时࿰…...
【日常点滴019】Python制作流浪气球游戏(导弹射击类)
Python制作流浪气球游戏(导弹射击类)教学课程代码(分步教学版)1、构建全局通用代码结构2、构建气球精灵类3、构建导弹精灵类4、碰撞检测5、构建游戏信息类 (最终完整代码)教学课程代码(分步教学…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
java高级——高阶函数、如何定义一个函数式接口类似stream流的filter
java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用(Math::max) 2 函数接口…...
