im6ull学习总结(三-3)freetype
1、Freetype简介
FreeType是一个开源的字体渲染引擎,主要用于将字体文件转换为位图或矢量图形,并在屏幕上渲染出高质量的字体。它提供了一组API,使开发者能够在自己的应用程序中使用和呈现字体。
FreeType最初是作为一个独立项目开发的,后来成为许多其他开源软件的重要组成部分,例如GNU Image Manipulation Program(GIMP)、Ghostscript、LibreOffice等。它也被广泛应用于操作系统中,用于在屏幕上显示和打印文本。
FreeType支持多种字体格式,包括TrueType(TTF)、OpenType(OTF)、PostScript(PS)、以及其他一些常见的字体格式。它具有强大的字体轮廓解析和渲染功能,可以处理各种字体效果,如抗锯齿、子像素渲染等。它还支持字体缓存管理、跨平台适配等功能,使得字体的渲染和显示更加高效和灵活。
通过使用FreeType,开发者可以轻松地在自己的应用程序中实现高质量的字体渲染,无论是在计算机、移动设备还是嵌入式系统中。它对于构建图形用户界面(GUI)、排版系统、图像处理软件等具有重要的作用。
总结起来,FreeType是一个功能强大的开源字体渲染引擎,为应用程序提供了丰富的字体处理和渲染功能,使得字体在屏幕上呈现更加清晰和准确。
2、交叉编译freetype
echo ‘main(){}’| arm-buildroot-linux-gnueabihf-gcc -E -v -
可以确定头文件的系统目录为:
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/…/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/include

库文件的系统目录为:
LIBRARY_PATH=/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/…/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/:/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/…/lib/gcc/:/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/…/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/…/…/…/…/arm-buildroot-linux-gnueabihf/lib/:/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/lib/:/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/lib/

我们编译的目的是什么呢
这里先引入一些编译的知识
头文件和库文件
头文件(Header File)通常包含一些函数、变量、结构体等声明,用于将这些声明导入到当前源文件中,以便在当前源文件中使用这些声明。头文件通常以.h为扩展名,并通过#include预处理指令将其包含到源文件中。
库文件(Library File)则是已经编译好的二进制代码,包含了一些函数、变量、结构体等定义,并提供了对它们的访问接口。库文件通常以.lib(Windows)或.a(Linux)为扩展名,并通过链接器将其与当前源文件进行链接,以便在运行时使用这些函数和变量。
头文件和库文件通常都是由第三方库提供的,可以通过官方网站下载或者在操作系统上进行安装。在使用一个库时,需要将其头文件包含到源文件中,并将其库文件链接到当前可执行程序中,以便在运行时使用其中的函数和变量。
也就是说头文件是我们编译时需要导入到源文件(.c)的(.h)文件用于编译。而库文件是编译好的二进制文件链接器将他们链接起来生成可执行文件
编译是将高级语言代码翻译成机器语言代码的过程,通常分为四个流程:预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。
复习一下编译过程:
预处理(Preprocessing):预处理器将源代码中以“#”开头的预处理指令进行处理,如#include、#define等,将它们转换为实际的代码,并生成一个新的扩展名为“.i”的文件。这个过程主要是为了方便代码重用和管理,以及提高编译效率。
编译(Compilation):编译器将预处理后的代码(即.i文件)翻译成汇编语言代码(即.s文件),并检查代码中的语法错误。编译器将高级语言代码转换成汇编语言代码的过程中,包括了词法分析、语法分析、语义分析、优化等过程。
汇编(Assembly):汇编器将汇编语言代码(即.s文件)翻译成机器语言代码(即.o文件)。汇编器将高级语言代码转换成机器语言代码的过程中,主要是将汇编语言代码中的指令、寄存器、内存地址等转换成相应的二进制码。
链接(Linking):链接器将目标文件(即.o文件)和库文件(如果有的话)链接成一个可执行文件(即.exe文件或.out文件)。链接器将目标文件和库文件中的代码、数据等内容合并起来,生成一个独立可执行的文件,它包含了程序的完整功能。
c/h->i->s->o->(o+a)->.out/.exe
我们想用一个开源库就会用到开源库里面的头文件和库文件,那么如何找到我们编译的开源库的头文件和库文件,就需要我们将库的头文件和库文件放到指定的编译工具链中,这样编译时就会找到了
也就是说我们要进行一下两个步骤
1、如果你编译的是一个库,请把得到的头文件、库文件放入工具链的 include、lib 目录里。别的程序要使用这些头文件、库时,会很方便。
echo ‘main(){}’| arm-buildroot-linux-gnueabihf-gcc -E -v –
它会列出头文件目录、库目录(LIBRARY_PATH)。
2、把库文件放到板子上的/lib 或/usr/lib 目录里
程序在板子上运行时,需要用到板子上/lib 或/usr/lib 下的库文件;程序运行时不需要头文件。
交叉编译freetype的过程
freetype 依赖于 libpng,libpng 又依赖于 zlib,所以我们应该:先编译安装 zlib,再编译安装 libpng,最后编译安装 freetype。
第1步 确定头文件、库文件在工具链中的目录
先设置交叉编译工具链:
export ARCH=arm
export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_imx6ullsdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin
这里注意这只是将当前shell中的环境变量更换了,并不会将.bashrc中的环境变量进行变换。所以当我们更换一个终端后就失效了,想要永久生效,就是修改.bashrc中的文件。
我们可以通过echo $环境变量名来查看当前shell下环境变量的值
比如

但是.bashrc中的值还是arm
以 IMX6ULL 开 发 板 为 例 , 它 的 工 具 链 是 arm-buildroot-linux-gnueabihf-gcc,可以执行以下命令:
echo ‘main(){}’| arm-buildroot-linux-gnueabihf-gcc -E -v -
这个命令是用来测试交叉编译器的预处理功能。具体来说它通过管道将字符串 ‘main(){}’ 传递给 arm-buildroot-linux-gnueabihf-gcc 编译器,并要求其执行预处理操作。
-E 选项告诉编译器只执行预处理操作并将结果输出到标准输出。-v 选项用于显示编译器的版本和配置信息。最后的短横线 - 表示从标准输入读入数据。
执行该命令后,arm-buildroot-linux-gnueabihf-gcc 将对输入的代码进行预处理,并输出预处理后的代码到标准输出。同时还会显示编译器的版本和配置信息。
需要注意的是,由于这是一个测试命令,它不会生成可执行文件或目标文件,而是用来验证编译器是否能够正确地执行预处理操作。
可以确定头文件的系统目录为:
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/
bin/…/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/include
库文件的系统目录为:
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/
bin/…/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/…/…/…/…/arm-buildroot-linux-gnueabihf/lib
第2步 交叉编译、安装 libpng
freetype 依赖于 libpng,所以需要先编译、安装 libpng
将libpng-1.6.37.tar.xz拷贝到./当前目录下
tar xJf libpng-1.6.37.tar.xz
这个命令是用来解压缩 libpng-1.6.37.tar.xz 压缩包的。
tar 是一个常用的归档工具,可以将多个文件和目录打包成单个文件,并在需要的时候进行解包。xJf 参数告诉 tar 解包并解压缩一个 xz 压缩过的 tarball 文件。
具体来说,x 选项表示解包,J 表示使用 xz 压缩格式,f 表示从文件中提取数据,并且后面必须跟随要解包的文件名。因此,tar xJf libpng-1.6.37.tar.xz 命令会将当前目录下的 libpng-1.6.37.tar.xz 文件解压缩到当前目录,并创建一个名为 libpng-1.6.37 的目录,其中包含所有的文件和子目录。
注意这是个小写x大写J小写f
这个命令是用来配置软件包以在 arm-buildroot-linux-gnueabihf 主机上进行交叉编译,并指定一个临时目录。
./configure --host= arm-buildroot-linux-gnueabihf --pre
fix=$PWD/tmp
./configure 是一个常见的脚本,用于自动检测系统环境并生成适合当前系统的编译选项。通过运行这个脚本,您可以为软件包指定一些选项,例如安装路径、编译器、依赖项等。
–host=arm-buildroot-linux-gnueabihf 参数告诉 configure 脚本,我们希望将软件包配置为在 arm-buildroot-linux-gnueabihf 主机上进行交叉编译。这是因为该主机使用的是 ARM 架构,与当前系统架构不同。
–prefix=$PWD/tmp 参数设置安装路径为当前工作目录下的 tmp 目录。通常,这个临时目录用于存放交叉编译后的二进制文件和库文件,而不会对系统产生影响。
注意, P W D 表示当前工作目录的路径。然后执行 b o o k @ 100 a s k : / l i b p n g − 1.6.37 PWD 表示当前工作目录的路径。 然后执行 book@100ask:~/libpng-1.6.37 PWD表示当前工作目录的路径。然后执行book@100ask: /libpng−1.6.37 make
book@100ask:~/libpng-1.6.37$ make install
运行配置文件时不会生成tmp文件
需要make 和 make install 后自动生成
然后复制文件
cp include/* -rf /home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/…/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/include
cp lib/* -rfd /home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/…/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/…/…/…/…/arm-buildroot-linux-gnueabihf/lib/
引入知识点
/…/
在 Linux 和 Unix 系统中,/…/ 是一个特殊的路径符号,表示返回到上一级目录。这个符号用于简化路径,在指定路径时可以去掉它。
例如,假设当前工作目录为 /home/user/Documents,那么路径 /home/user/Documents/…/Downloads 可以简化为 /home/user/Downloads,因为 /…/ 表示返回到上一级目录 /home/user。
需要注意的是,如果一个路径中包含多个 /…/,则它们可以被合并成一个,例如:
/home/user/Documents/…/…/Downloads 可以简化为 /home/Downloads。
/home/user/Documents/…/Downloads/…/Pictures 可以简化为 /home/user/Pictures。
在编写脚本或命令时,正确使用路径符号可以让代码更加简洁和可读,也可以避免一些路径相关的错误。
cp
cp -rfd 是 cp 命令的另一种参数组合,用于复制文件或目录,并在复制过程中进行一些操作。具体含义如下:
-r 选项表示递归地复制目录及其内容。
-f 选项表示强制复制,即在目标位置已有同名文件或目录时,不提示用户而是直接覆盖。
-d 选项表示复制时保留符号链接,而不是解引用它们。
因此,cp -rfd 命令通常用于递归地复制目录及其内容,并且在复制过程中保留符号链接。同时,它也会在目标位置已存在同名文件或目录时进行覆盖。这种参数组合可以在需要复制目录结构并保留符号链接的情况下使用。
当使用 cp 命令复制文件或目录时,如果原始文件或目录中包含符号链接(软链接),默认情况下 cp 命令会解引用这些符号链接,并复制它们所指向的实际文件或目录。但是使用 -d 选项后,cp 命令会保留这些符号链接,而不是解引用它们。
举个例子,假设有一个名为 source 的目录,其中包含一个名为 file1 的普通文件和一个名为 link1 的符号链接,指向 file1。现在我们使用 cp -rd source destination 命令将 source 目录复制到 destination 目录:
bash
$ ls -l source
-rw-r–r-- 1 user user 10 Jan 3 15:00 file1
lrwxrwxrwx 1 user user 5 Jan 3 15:01 link1 -> file1
默认情况下,如果我们运行 cp -r source destination,那么 destination 目录中的 link1 将会变成一个指向 file1 的新文件,而不再是一个符号链接。但是如果我们运行 cp -rd source destination,那么 destination 目录中的 link1 将保持为一个符号链接,仍然指向 file1。
这样做的好处是,在目标位置保留符号链接可以使得目标位置的目录结构保持原样,符号链接仍然指向正确的文件或目录,而不会被解引用导致指向错误的位置。
编译freetype
freetype 依赖于 libpng,libpng 又依赖于 zlib,所以我们应该:先编译安装 zlib,再编译安装 libpng,最后编译安装 freetype。但是,有些工具链里有 zlib, 那就不用编译安装 zlib,比如 STM32MP157。本节文档以 IMX6ULL 开发板中 arm-buildroot-linux-gnueabihf-gcc 工具链为例,对于其他开发板:工具链可能不一样,请灵活变通。
第一步设置交叉编译工具链
export ARCH=arm
export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_imx6ullsdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin
以 IMX6ULL 开 发 板 为 例 , 它 的 工 具 链 是 arm-buildroot-linux-gnueabihf-gcc,可以执行以下命令:
echo ‘main(){}’| arm-buildroot-linux-gnueabihf-gcc -E -v -
可以确定头文件的系统目录为:
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/…/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/include
库文件的系统目录为:
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/…/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/…/…/…/…/arm-buildroot-linux-gnueabihf/lib
第二步编译libpgn
但是注意这个存在问题我在这搞了一天还是官方帮搞定的
逻辑是这样的先编译freetype
./configure --host=arm-buildroot-linux-gnueabihf --prefix=$PWD/tmp

这里已经包含bzip2和libpng了那就不要按照原有手册上编译libpng了,编译了反而出错。导致lib里面的文件为x86-64具体原因我没弄明白。
这个 注意编译后的头文件和库文件都放在这两个链接下,这个手册上有问题:
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/…/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/include
库文件的系统目录为:
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/…/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/…/…/…/…/arm-buildroot-linux-gnueabihf/lib
相关文章:
im6ull学习总结(三-3)freetype
1、Freetype简介 FreeType是一个开源的字体渲染引擎,主要用于将字体文件转换为位图或矢量图形,并在屏幕上渲染出高质量的字体。它提供了一组API,使开发者能够在自己的应用程序中使用和呈现字体。 FreeType最初是作为一个独立项目开发的&…...
基于OpenCV的谷物颗粒识别
基于OpenCV的谷物颗粒识别 一、程序整体功能介绍1.1 导入库与函数定义1.2 颜色分割与灰度处理1.3 二值化与轮廓检测1.4 绘制与计数1.5 主程序与结果展示 二、算法原理与实现流程2.1算法原理(1)颜色分割(2)灰度处理与二值化&#x…...
Aloha 机械臂的学习记录3——AWE:Pycharm运行代码记录
之前的博客创作了三偏关于Aloha_AWE的liunx终端指令运行代码的示例: Aloha 机械臂的学习记录——AWE:Bimanual Simulation Suite: https://blog.csdn.net/qq_54900679/article/details/134889183?spm1001.2014.3001.5502 Aloha 机械臂的学习记录1——AWE&#x…...
开源协议概览
身为程序员,我们不可避免的要和开源项目打交道,不管是我们自己做了些开源项目,还是使用开源项目,对各种开源协议的了解是必要的。 OSI(Open Source Initiative) OSI,开发源代码组织,是一个旨在推动开源软件…...
分布式缓存
分布式缓存 缓存雪崩 缓存雪崩我们可以简单的理解为:由于原有缓存失效,新缓存未到期间所有原本应该访问缓存的请求都去查询数据库了,而对数据库 CPU 和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应…...
BSC/平衡记分卡
一、Balanced Score Card BSC即平衡计分卡(Balanced Score Card),是常见的绩效考核方式之一,是从财务、客户、内部运营、学习与成长四个角度,将组织的战略落实为可操作的衡量指标和目标值的一种新型绩效管理体系。 是…...
论文阅读_训练大模型用于角色扮演
英文名称: Character-LLM: A Trainable Agent for Role-Playing 中文名称: 角色-LLM:训练Agent用于角色扮演 文章: [https://arxiv.org/abs/2310.10158](https://arxiv.org/abs/2310.10158) 作者: Yunfan Shao, Linyang Li, Junqi Dai, Xipeng Qiu 机构: 复旦大学…...
v-if控制div内容显示,克隆这个div但是v-if没有效果
问题描述: 我的子页面打印的时候通过isPdf来隐藏“选择参加人员”按钮。 我子页面有个el-dialog,el-dialog里面有个大的div它的id为app-pre-meet-add,在子页面我通过isPdf来显示我想要的内容。现在我在父页面先通过this.$refs.child.control…...
flutter的状态管理学习
文章目录 1.flutter widget分类2. 代理组件又分为3. 状态 state 数据4. 刷新 数据变化5. code 1.flutter widget分类 组合渲染代理 2. 代理组件又分为 Positioned向父组件传递数据InheritedWidget向子组件传递数据 3. 状态 state 数据 状态就是用到了向子组件传递数据ÿ…...
开源免费虚拟化KVM的部署及其虚拟机资源变更、快照、克隆等常见运维操作
实践说明:基于RHEL9(AlmaLinux9.1)部署,同类系统(CentOS9,RockyLinux9等)适用,但适用场景是不限于此的。 文档说明:本文档旨在帮助快速应用KVM虚拟化技术,重在实践操作,提供了简要参考。 文档形成时期&…...
阿里云git clone超时报错解决方法
参考:引用文章...
力扣刷题-二叉树-合并二叉树
617.合并二叉树(经典) 合并二叉树是操作两棵树的题目里面很经典的,如何对两棵树遍历以及处理? 给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。 你需要将他们合并…...
了解JavaScript 加密、混淆和生成签名
分析并理解网站的 JavaScript 加密、混淆和生成签名的方法是 JavaScript 逆向工程中的一个重要方面。这些技术通常用于保护代码免遭未授权的访问和修改,或确保数据在传输过程中的安全性。 加密 目的:加密用于保护敏感数据,使得只有拥有正确密…...
Go语言的指针(深度解析)
指针是Go语言中的一个重要概念,它提供了对内存地址的直接访问和操作能力。通过指针,我们可以高效地传递和修改变量的值,避免了值传递所带来的拷贝开销。在本文中,我们将深入探讨Go语言指针的概念、使用方法和注意事项。 指针的本…...
HTB-SAU
信息收集 # cat port.nmap # Nmap 7.94 scan initiated Thu Jan 11 19:26:51 2024 as: nmap -sS --min-rate 10000 -p- -oN port.nmap 10.10.11.224 Nmap scan report for 10.10.11.224 (10.10.11.224) Host is up (0.28s latency). Not shown: 65531 closed tcp ports (r…...
AI创新之美:AIGC探讨2024年春晚吉祥物龙辰辰的AI绘画之独特观点
🎬 鸽芷咕:个人主页 🔥 个人专栏:《粉丝福利》 《linux深造日志》 ⛺️生活的理想,就是为了理想的生活! ⛳️ 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下…...
Linux的SSH服务
一.SSH服务简介 1.什么是SSH SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程复制等功能。SSH 协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令,SSH 为建立在应…...
MySQL连续案例续集
01)查询学过「张三」老师授课的同学的信息 SELECT s.*, c.cname, t.tname, sc.score FROM t_mysql_teacher t, t_mysql_course c, t_mysql_student s, t_mysql_score sc WHERE t.tid c.tid AND c.cid sc.cid AND sc.sid s.sid AND t.tname ‘张三’ 02&#x…...
【STM32读取HX711的函数】
[两个普通IO读取HX711数据的函数-主芯片是STM32F407] 以下是.h文件中的内容: #ifndef __hx711_h #define __hx711_h #define HX711CH1_DIO_GROUP GPIOA #define HX711CH1_CLK_GROUP GPIOA #define HX711CH1_DIO_PIN GPIO_Pin_1 #define HX711CH1_CLK_PIN GPIO_Pin…...
MATLAB对数据隔位抽取和插值的几种方法
对于串行的数据,有时我们需要转成多路并行的数据进行处理,抽取;或者是需要对数据进行隔点抽取,或对数据进行插值处理。此处以4倍抽取或插值为例,MATLAB代码实现。 文章目录 抽取方法一:downsample函数方法…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
