搭建图床系列
搭建简单图床 EasyImage
注意:注意定时压缩下载进行备份
GitHub - icret/EasyImages2.0: 简单图床 - 一款功能强大无数据库的图床 2.0版
EasyImage2.0 简单图床
【宝塔面板系列】10分钟搭建一个简单图床——EasyImage 简单到无需数据库! | 爱玩实验室 (iwanlab.com)
搭建 Telegraph-Image 图床
注意:①上传后的文件删除不了,但可以设置黑白名单使其不能被正常访问,但文件实际还储存在tg的服务器上,②只要知道图片文件名,别人使用相同程序搭建该图床,别人也能通过他的域名+你的图片文件名访问图片
GitHub - cf-pages/Telegraph-Image: Image Hosting solution, Flickr/imgur alternative, make it easy for users to share their images. Using Cloudflare Pages and Telegraph.
【更新】Telegraph-Image免费自建图床新增后台图片管理功能
...
随身WiFi刷debian
工具包介绍
miko_service_tool_pro:备份自己的rom,以防后续操作出问题,救砖用。
Qualcomm Premium Tool :备份全部分区文件
星海和apk文件夹:备份qcn和root
搞机工具箱:很多功能,可以不用这个,但是我一并上传到文件夹里了
随身WiFi助手:酷铵水遍的工具,可以一键刷机,可以直接刷他的包,但有些功能要钱,我没用他的,仅用此工具安装驱动等
DiskGeniusEng_Pro(没用过)
详细备份过程看下方酷安帖子:
高通骁龙芯片的随身wifi入门刷机教程 来自 伏莱兮浜 - 酷安 (coolapk.com)
刷机包介绍
本教程有两种,刷机包介绍(基于GitHub - OpenStick/OpenStick修改),均为酷安jsbsbxjxh66大佬的
2.1Ghz-btrfs-debian-ufi+001c-其他型号自行替换boot和基带文件.7z
作者原帖介绍:410随身wifi_debian系统btrfs文件系统正式上线 来自 jsbsbxjxh66 - 酷安 (coolapk.com)
文件地址(作者 ...
zram与swap交换内存
介绍
zRAM 和传统的交换空间(Swap)都是 Linux 系统用来增加可用内存的技术,但它们的工作方式和使用场景有所不同。
一般来说,能用ZRAM更好,但是有些VPS的cpu配置不行那就不要开zram了。
ZRAM:
存储介质: zRAM 是一种压缩的 RAM 块设备,它使用内存本身来存储压缩的数据。
性能: zRAM 的读写速度远快于传统 Swap,因为它直接在 RAM 上操作。压缩和解压缩数据需要一定的 CPU 资源,但通常这种开销小于从硬盘读写数据的时间。
可靠性: 由于 zRAM使用的是 RAM,频繁的读写可能会对 RAM 的寿命造成影响,尽管实际影响非常小。
用途: zram 非常适合用于拥有有限 RAM 或需要快速交换区的设备,如嵌入式设备或旧计算机,也常用于Android设备。
传统交换空间(Swap):
存储介质: Swap 通常使用硬盘驱动器(HDD)或固态驱动器(SSD)作为交换区。
性能: 因为硬盘速度远慢于 RAM,使用 Swap 可能会显著减慢系统速度,尤其是在内存耗尽时。
可靠性: Swap 在不同的物理介质上,因此不会影响 ...
C语言学习八:函数
函数入门
前言
在 C 语言的编程中,其实用到很多的函数,而每一个函数就可以理解为一个独立的模块,因此 C 语言也称为模块化编程。
我们封装函数应该尽可能左到:低耦合,高内聚
对于函数的使用者来说,应该尽可能简单地去使用该函数接口,使用者只管往函数中输入需要的数据,通过该函数获得一个结果即可
函数的定义
函数头:函数对外公开的接口信息。 比如:void *calloc(size_t nmemb, size_t size);
函数的返回值 , 该函数运行结束后会返回什么东西给你 , 比如: void *
函数名, 命名规则跟变量一致。应该尽量顾名思义。比如: calloc
参数列表,告诉用户该函数需要输入的数据以及类型,有可能有多个也可能没有 , 比如(size_t nmemb, size_t size)
语法:
123456返回值类型 函数名 ( 参数1 , 参数2 ,参数3 , ... , 参数N ){// 函数体 return 返回值 ;}
示例:
1234567891011121314151617181920212223242526 ...
C语言学习七:内存
进程的内存布局
程序:就是我们写好的代码并编译完成的那个二进制文件,它被存放与磁盘中,它是死的。
进程:把磁盘中的二进制文件"拷贝"到内存中取执行它,让运行起来,它是活的。
所有的程序被执行起来之后,系统会为他分配各种资源内存,用来存放该进程中用到的各种变量、常量、代码等等。这些不同的内容将会被存放到内存中不同的位置(区域),不同的内存区域他的特性有差别
每一个进程所拥有的内存都是一个虚拟的内存,所谓的虚拟内存是用物理内存中映射(投影)而来的,对于每一个进程而言所有的虚拟内存布局都是一样的。让每个进程都以为自己独自拥有了完整的内存空间
物理内存(Physical Memory)-----------------------------虚拟内存(Virtual Memory)
虚拟内存的布局(区域)
栈 (stack)
堆(heap)
数据段
代码段
栈空间
特点:
空间非常有限,尤其在嵌入式的环境下,因此应该尽可能少去使用栈空间内存,特别是要存放比较大的数据。
每当一个函数被调用的时候,栈空间会向下增长一段,用来存放该函数的局部变量
当一个函数 ...
C语言学习六:数组与指针的结合
基础
示例一:
123456int arr [5] = {1,2,3,4,5} ;int * p1 = &arr ;int * p2 = arr ;printf("*p1:%d\n" , *(p1+1)) ;printf("*p2:%d\n" , *(p2+1)) ;
示例二:
123456int arr [5] = {1,2,3,4,5} ;int * p2 = &arr[2] ;printf("*p2‐1:%d\n" , *(p2‐1)) ;printf("*p2:%d\n" , *p2) ;printf("*p2+1:%d\n" , *(p2+1)) ;
以上代码是通过指针 p2 来访问数组中的元素。一开始定义p2并初始化让指针p2 指向数组中第3个元素的地址。当我们使用p2 进行指针加减运算的时候 ,由于指针是整型的,可以访问到数组中的下一个元素以及上一个元素。
数组指针
概念:专门用来指向一个数组的指针。
1234567 ...
C语言学习五:指针
指针入门
基础知识
内存地址
字节: 字节是内存容量的一个单位, byte ,一个字节 byte 有 8个位 bit
地址: 系统为了方便区分每一个字节的数据,而对内存进行了逐一编号,而该编号就是内存地址。
基地址
单字节的数据: char 它所在地址的编号就是该数据的地址
多字节的数据:int 它拥有4个连续的地址的编号 ,其中地址值最小的称为该量的地址
取地址符号
每一个变量其实都对应了一片内存,因此都可以通过 & 取地址符号将其地址获得。
12345678910111213141516int i ;double d;float f ;char c ; printf("i的地址为:%p\n" , &i);printf("d的地址为:%p\n" , &d);printf("f的地址为:%p\n" , &f);printf("c的地址为:%p\n" , &c);//运行结果:i的地址为:0x7ffec726bc58d的地址为:0x7ffec726bc ...
C语言学习四:数组
数组入门
概念
逻辑: 一次性定义多个相同类型的变量,并且给他分配一片连续的内存
语法:int arr [5] ;
初始化
只有在定义的时候赋值,才可以称为初始化。数组只有在初始化的时候才可以统一赋值。
123456789int arr [5] = {1,2,3,4,5} ; // 正确,定义并初始化数组int arr [5] = {1,2,3} ; //可以, 为不完全初始化,后面的两个为0;若完全的不初始化则为随机值int arr [5] = {1,2,3,4,5,6,7,8,9} ; // 错误(但是可以用),越界初始化, 越界部分将会被编译器舍弃int arr [ ] = {1,2,3,4,5,6,7,8,9} ; // 可以, 用户没有直接给定数组大小,// 但是有初始化, 因此数组的大小会在初始化时确定, 大小为 9int arr [ ]; // 错误, 没有给定大小也没有初始化, 因此数组的内存大小无法确定,系统无法分配
注意:
数组在定义的时候必须确定他的大小。
说白了就是 ...
C语言学习三:控制流
二路分支 :if 语句
逻辑: 程序中某一段代码需要满足一定的条件才会被执行
语法:
if 语句: 表达一种,如果条件满足则执行某个代码块
if-else 语句: 表达一种,如果条件将满足则执行某个代码块否则执行另外一个代码块
1234567891011121314151617181920212223242526272829303132//if 语句:int a = 100 ;if ( a > 100 )//判断条件{/* 如果满足则执行该代码块 */printf("啊啊啊!\n");}// if ‐ else 语句if (a < 99 ){printf("哦哦哦!!\n");}else{printf("噢噢噢!!\n");}// if‐ esle if ‐ esle if ‐ elseif (a < 99 ){printf("啊啊啊!!!\n");}else if (a > 99 ){ ...









