- 博客(103)
- 资源 (9)
- 收藏
- 关注
原创 2.1写一个梅林dynv6插件(上)
前面十多章已经把shell的基本编程语法和一些特常用的命令都介绍了,从本章开始写一些实用的技巧和笔者爬过的坑吧。先从koolshare梅林系列的插件开始。上一个单元已经写了一个比较完整的dynv6的脚本。读者稍微组织一下就可以实用于各型linux路由上,但是网上多的是这类的东西嘛,还是完整可以抄作业的… 所以这章咱做个网上没有的。给koolshare梅林380、384、386、388写个插件,插件就更方便用户使用了。正是因为笔者有这个想法,所以前面也没写完整的脚本,有插件谁用脚本嘛~
2024-01-29 17:23:53 360
原创 1.8用REST API实现dynv6脚本(下)
上一章我们基本实现了dynv6的HTTP REST API最简单脚本,这一章我们继续完善这个程序,给它添加解析IP对比、错误反应、日志记录等功能。好像也没人看这一系列的文章,可能笔者这水平也太low了哈。不过挖了这坑总得填。写本系列文章的本意也是自我学习,笔者对shell也并不精通,毕竟只是一个搞运维的,能看明白多个语言的代码,但写起来也确实不得心应手。这一个单元就这么结束吧,下一个单元就是实际应用了,先写一个dynv6的完整梅林386插件吧。
2024-01-29 11:06:51 149
原创 1.7用REST API实现dynv6脚本(上)
前面我们学了文本处理的基本命令,本章介绍一些正则式的初步知识。并且终于要写dynv6的脚本了,我们先实现一个梅林用的自定义ddns-start,当然其它固件也能用。
2024-01-13 10:41:58 276
原创 1.6用命令得到ip和域名解析<网络>
前文我们主要学习了使用ifconfig和ip命令,在本机的wan口得到自己的ip地址,要想写出一个ddns程序,这显然是不够的,我们还需要知道服务器把我们的域名解析到哪个地址,经过对比之后才能知道是否要更改我们的域名解析,所以本章主要学习如何得到我们域名解析值,包括A解析和AAAA解析。所谓A解析就是ipv4地址解析,AAAA自然就是ipv6解析的地址。笔者猜测,因为ipv4是32位的,既然32位叫A解析,128位的ipv6就应该叫AAAA~ 纯瞎猜的哈,我没去了解过这事!读者当玩笑看就行。
2024-01-13 00:38:58 215
原创 1.5如何用命令得到自己的ip<本地>
上一章原计划是要讲选择分支的,不过上一章难点较多,又讲了很多文本处理的方法,就没有把选择分支放入。这一章一定要讲了,从编程的角度来讲,有基本命令、有选择分支、有循环就能够写出任何想要的功能代码。grep文本搜索、hea从头截取行、tail从尾部截取行、awk的按特定字符切割和读取特定行、sed的文本匹配打印、tr替换和删除以及数组的认识和循环。
2024-01-11 10:37:28 675
原创 编程基础 - 基本语法
人与人交流需要双方都会同一种语言,我们与计算机交流自然也要双方遵循同一种规则,这种规则就是计算机编程语言。编程所说语法就是用来规定如何与计算机交流的,它与英语规定动词怎么变形是一回事。当然它比英语简单太多了,没有动词变形这么麻烦的事。前面说了shell就是一聊天机器人,我们学习使用shell,自然要学习这个交流规则。当今流行的编程语言其实都是差不多的,除了写法有区别。在逻辑上都是一样的,甚至所用的单词也就那么几个。
2024-01-11 09:48:19 335
原创 编程基础 - 数据类型
这个问题对于c/c++来说,那至少要有三五章来说明。对于shell来说那太简单了,严格来说,shell并没有数据类型的概念,无论你输入的是字符串还是数字,都是按照字符串类型来存储的。那么我们来看看shell是怎么用字符串实现和其它编程语言一样的功能的。
2024-01-10 17:46:51 458
原创 编程基础 - 变量与常量
变量是编程最重要知识点之一,从根本上讲,编程就是对数据的操作,让数据按我们设定的逻辑进行运算。变量是用于存储数据的内存地址的人性化表示方式。在shell中,数据类型比较简单,它属于弱数据类型的编程语言,简而言之它自动帮你处理了有关数据类型的工作。
2024-01-10 17:45:27 352
原创 编程基础 - 初识shell
shell是Linux内核外的一层壳,是用户与Linux交互的桥梁。也可以叫他命令解释器,用户输入的命令由它告诉内核要做什么,内核是负责对硬件进行管理与操作的,我们用户无法直接告诉内核我们要做什么,所以要通过shell和内核进行沟通,从而达到使用计算机资源的目的。shell有两种工作方式,交互式命令解释:用户输入命令,它立即执行给出结果。另一种就是解释程序脚本,用户给出一个已编写好的由多个命令按一定逻辑组织好的文本文件。shell读取并执行这个程序脚本,按设计好的程序运行,就是我们所说的真正意义上的编程。
2024-01-06 16:57:09 1262
原创 编程基础 - 初识Linux
为什么要学习Linux呢?我这Windows用得好好的,简单易用傻瓜式、用的人还超多!但是我要告诉你的是,你用的Linux类(注意这个类字,不要抬杠)操作系统也不少,甚至很可能比Windows还多!不信你拿出手机看看,安卓、华为鸿蒙是正宗的Linux洐生产品,苹果倒是说源于Unix,但实际上还是同一个爷爷的东西。路由器几乎全是Linux系统的,所谓智能软路由系统本身就是较完整的Linux。监控摄像头、某些监控主机甚至能跑shell代码。
2024-01-05 18:37:24 1445
原创 跟我用路由器学Linux编程 - 专栏目录
本专栏文章以梅林、openwrt等linux路由为基础硬件,和笔者一起学习使用shell语言。带你从编写简单的插件开始,学习怎么折腾路由器,顺便学会编程。专门找一台Linux主机用来学习很不容易,但软路由用的都是Linux基础系统,除了被精简掉一些功能以外,路由系统和Linux主机并没什么差别。学会了在路由上编程,自然也就学会了在Linux上编程。本专栏以shell语言为主,在实例中也可能用到其它编程语言。
2024-01-05 03:00:42 497
原创 1.4具有通用性的花生壳ddns脚本
上一章我们只学了一个新命令let用于整数计算,但是我们重点学习了函数的写法,for循环的用法。这两个比什么新命令都重要!函数用花括号界定边界,for循环用do…done界定。上一章最后说了,这一章是要打造一个有脸放上github的脚本…/bin/sh。
2024-01-04 17:27:15 1155
原创 1.2如何让花生壳ddns脚本自动工作
前面第一章我们学习了几个命令,主要是curlwgetscpsshchmod。还写好了一个脚本,并将其上传到路由。本章我们就来让这个脚本自动工作,主要是在梅林固件上演示,因为这个固件最麻烦。padavan 和 openwrt 都有图形接口,可以直接编辑,梅林得自己写代码实现。
2024-01-01 15:38:16 1010
原创 1.1简单编程实现花生壳的ddns功能
路由刷完固件正常工作后,第一件事就是想远程控制它吧?所以咱就直接从写ddns脚本开始,不用怕,一个简单的ddns脚本没几句代码的。最简单的甚至只要一句代码就行了。本章详细讲解了一个最简单的ddns脚本是怎么炼成的,并且讲了如何用scp命令上传文件、用ssh命令连接路由器、以及chmod的简单用法,这些都是非常基础的知识,也非常容易学会。
2024-01-01 01:02:12 1152
原创 C++算法:多源最短路径(Floyd)
前文单源最短路径Dijkstra中我们讨论了如何解决有向无环图的最短路径问题,Dijkstra只能解决一个起始点的问题,如果要解决每个顶点到任一顶点的最短路径呢?一个方法就是再循环一次,以每个顶点作为起点就可以了嘛,虽然不可避免的会有部分重复工作,但确实能解决,就是代码更复杂了。有没有一个优雅点的办法呢?今天要介绍的算法Floyd(弗洛伊德,好熟悉的名字~)就是一个优雅的解决办法。它与用Dijkstra循环每个顶点的时间复杂度差不多O(n3),但是代码极简。
2023-06-20 19:03:21 2335 1
原创 C++算法:单源最短路径Dijkstra
如果你有一份北京地图,想从中关村走到三元桥,那么怎样能找出实现这一目的的最短路径呢?一种可能的方法就是将这两点之间所有的路线都找出来,然后求出每条路线的距离,找出最短的路线。但是仔细想想我们就会发现这种办法几乎是不可行的,因为这样的路线太多了,而且有些路线是完全不值得考虑的,比如你从中关村到昌平再到三元桥。那这样的问题有没有更科学的解决办法呢?答案是肯定的。
2023-06-17 23:55:03 3369
原创 C++算法:加权连通图的最小生成树(Prim)
在前文加权连通图的最小生成树(Kruskal)中已经用以边找点的方式实现最小生成树的生成。Prim算法也是一种常用的最小生成树算法,和Kruskal不同,Prim算法是以顶点找边实现的。
2023-06-16 23:37:32 1485
原创 C++算法:加权连通图的最小生成树(Kruskal)
最小生成树算法就是在众多可行的方案中选择代价最小的方法。生活中我们经常会遇到类似可以抽象成最小生成树的例子:比如你要给家中布电线,我们将每个用电器看作是顶点,那你可以从总闸布设到每一电器的电线,也可以从就近点接线。假设我们用从就近点接线,那就存在如何布线更节约的问题。这就是最小生成树可以解决的问题。用数学话来说,存在一个有n个顶点的带权连通图G。如果存在一个包含了G中所有顶点以及部分边的子图G,且子图G的各边权值和最小,并且还不形成回路。那么我们就可以称子图G是图G的最小生成树。
2023-06-14 18:34:11 1152
原创 C++算法:有向无环图拓扑排序(领接链表)
前文有向无环图实现游戏技能树中我们使用了矩阵存储图的关系,可以称之为邻接矩阵。显然,链表也是可以实现的。在图结构入门一文中,我们也提到了链表存储的原理。本文我们就以链表形式来完成这一结构,并进行拓扑排序。
2023-06-09 13:37:24 1080
原创 C++算法:有向无环图实现游戏技能树
前面文章图结构入门提到了图结构的两种存储方式,但没有代码演示。这篇就用一个简单示例来学习一下有向无环图的具体应用,图的应用比较广泛,本文就简单实现一个游戏的技能树。别看游戏技能树叫树,实际上它多半是用有向图实现,类似科技树也一样。说明白了它也很简单,就是一个拓扑排序问题。
2023-06-08 16:41:07 921
原创 C++算法:排序之四(计数、基数、桶排序)
这些算法各有优缺点,适用于不同的场景。一般来说,冒泡排序、选择排序和插入排序适用于小规模的数据,因为它们的时间复杂度较高,但是空间复杂度较低,且易于实现。希尔排序是对插入排序的改进,通过增加间隔来减少比较次数,适用于中等规模的数据。归并排序和快速排序是分治法的典型应用,它们可以将大规模的数据分成小块进行排序,然后再合并,适用于大规模的数据,但是需要额外的空间。堆排序是利用堆这种数据结构来实现的,它可以在不使用额外空间的情况下,对大规模的数据进行排序,但是比较次数较多,且不稳定。计数排序、桶排序和基数排序。
2023-06-07 09:03:35 497
原创 C++算法:排序之二(归并、希尔、选择排序)
此外,归并排序多用于需要外部排序的场景,比如磁盘文件的情况下比快排好,因为快排很依赖数据的随机存取,而归并是顺序存取,对磁盘这种外存比较友好。希尔排序是一种基于插入排序的算法,它比插入排序和选择排序要快得多,并且数组越大,优势越大。排序的时间复杂度会比O(n^2)好,但没有快速排序算法快O(n(logn)),在中等大小规模数组表现良好,总之不怎么常用。归并排序也是一种遵循分治算法思想的排序方法,它将一个大数组分成两个小数组,对每个小数组进行排序,然后将两个已排序的小数组合并成一个有序的大数组。
2023-06-05 15:54:55 576
原创 C++算法:排序之一(插入、冒泡、快速排序)
排序算法很多,一直有十大经典的说法。实际工作中除了个别有争议的排序算法,各有各擅长的领域,不能因为选择排序又慢又简单就小看它,有时候还真是非它不可。也不能因为桶排序、计数排序是理论上时间复杂度最小的就觉得能包圆所有排序工作。
2023-06-04 23:56:15 507
原创 C++算法:了解算法的复杂度
有计算机科学家说过“程序=数据结构+算法”,前面学习了基本的数据结构和树形、图结构,那么就可以开始算法学习了。算法是一个程序员必须掌握的指导工具,算法可以认为是解决问题的具体方法步骤。那么怎么描述一个算法的优劣就成了最先要了解的事了。
2023-06-03 20:35:17 1061
原创 C++数据结构:图结构入门
前面系列文章介绍了线性结构和树形结构,线性结构的前驱与后续非常清晰,很明确的一对一的关系。树形结构是层次分明的结构,同时树形结构的父节点可以有一个或多个(二叉树为两个)子节点,叶子节点没有子节点,这是一种一对多的关系。而图结构更加复杂,是多对多的关系,这种结构在现实生活中应用很广泛,比如公交线路图,计算机的网络结构等等。
2023-06-02 19:48:05 532
原创 C++数据结构:二叉树之三(二叉搜索树扩展)
我们接着写二叉树,在前文链接:《二叉树之二》中,我们生成了如下的有序二叉树,并且实现了插入、删除和四种遍历方法。今天我们继续实现一些二叉树的常用操作。如上图所示本文介绍了关于有序二叉树的一些有用的扩展方法,比如搜索前驱后续节点可以用于查找树中小于且最接近某个值的节点,或大于且最接近的。熟练掌握这些方法,有助于后面更复杂的二叉树的学习。当然还有一些诸如将一棵二叉树插入为另一棵树的子树、求左子树或右子树的高度等文中未写的方法也值得掌握。
2023-06-01 13:33:12 649
原创 C++数据结构:二叉树之二(二叉搜索树)
前文已经讲了二叉树概念,并搞出一个数组存储的没写具体实用意义的二叉树,这篇文章将讲解二叉树的另一种存储方式:链式存储,它和链表的存储方式有点像,这也是前面用了很多篇幅写链表的原因,实现了链表再来看本文会容易很多。因为光写链式存储水一篇文章也太没意义了,所以本文将实现一个链式存储基本有序的二叉搜索树,并实现四种遍历方式,它在排序搜索方面有一定的实用意义。
2023-05-31 16:47:33 687
原创 C++数据结构:二叉树之一(数组存储)
树是一种非线性数据结构,它由若干个节点和边组成。每个节点都有一个值,而边则表示节点之间的关系。树具有层次结构,其中一个节点被称为根节点,它没有父节点。除根节点外,每个节点都有且仅有一个父节点。树的基本性质包括树的深度、高度、度数等。森林是由若干棵互不相交的树组成的集合。一棵树可以看作是一个仅包含一棵树的森林。二叉树是一种特殊的树,它的每个节点最多只有两个子节点,分别称为左子节点和右子节点。二叉树是树的一种特殊形式,它具有树的所有基本性质,同时还有一些独特的性质。
2023-05-30 10:48:42 2704
原创 C++数据结构:栈和队列的应用
C++ 是一种面向对象的编程语言,它提供了多种数据结构,前面文章已介绍过数组、链表、hash表,并用自己的方法实现。用于存储和操作数据的结构在STL中还有很多,其中两种常用的数据结构是栈和队列。本文将介绍栈和队列的概念,特点,实现方式和应用场景。
2023-05-29 10:39:31 1762
原创 C++数据结构:散列表简单实现(hash表)
散列表是一种常用的数据结构,它可以快速地存储和查找数据。散列表的基本思想是,将数据的关键字映射到一个有限的地址空间中,然后在该地址空间中存储数据。这样,当需要查找某个数据时,只需要计算其关键字的映射地址,然后在该地址处访问数据,从而实现高效的查找操作。
2023-05-28 17:30:50 1684
原创 C++数据结构:Python风格双向链表Pylist的实现
线性顺序表(链表)已经完成了单向链表基本的插入、取值、删除等操作,本文将在前文的基础上更进一步完善其功能。参照Python的 List 列表的函数常用功能来实现。如+运算直接将两个列表合并,[] 运算赋值、取值。笔者是很喜欢python中列表这种骚操作的,本文就在C++中实现它。当然基本的C++语法规则笔者是没法改变的。赋值得用{},类型还是要声明的,泛型自然是可以的,但你也别想着在一个列表中同时塞入 string 和 int。
2023-05-27 17:37:57 1260
原创 C++数据结构:线性顺序表(链表)
前一篇文章介绍用数组实现的顺序表时已经提到链表这种结构,在STL中的 list 就是以链表实现的顺序表。这种结构与数组相比最大好处就是可以很方便的在头部和中部插入数据,而数组比较麻烦,需要移动之后的所有数据。链表也可以实现顺序表的功能。链表是一种动态数据结构,它可以根据需要自动调整大小,存储不连续的元素。
2023-05-26 03:45:00 2427 2
原创 C++数据结构:线性顺序表(数组)
将一个线性表存储到计算机中,把线性表的结点按逻辑顺序依次存放到一组地址连续的存储单元里,用这种方法存储的线性表称为顺序表。C++中数组、vector、list就是典型的顺序表,其中list是以链表实现的,本文主要以仿写一个数组实现的顺序表,进而更深入了解顺序表。
2023-05-25 01:43:08 1282
原创 C++中读写文件方法(fstream用法)
日常工作中肯定会用到文件读写操作,C++ STL中 fstream 是一种用于文件读写的流类,它可以方便地对文件进行输入输出操作。本文将详细介绍C++ fstream的使用方法,以及各种常用的函数方法和参数。
2023-05-24 03:00:00 10332
原创 C++详解NOI题:[NOIP2021] 报数
受不了CSDN每日一练的在线竞赛系统了,bug多就算了,勉强能用,可那些题目的神描述,到处是错。所以找点别的题来玩,看到一道NOI的题挺有意思,就试着解解。
2023-05-23 01:03:01 890
原创 C++每日一练:饿龙咆哮-逃离城堡(避坑指南)&非负整数求和
饿龙这一题要说难度嘛,还真是挺简单的,但要满分也是有坑的!本文就记录了笔者解题过程,希望能对读者使用C++编程有所启发。至于非负整数求和代码是挺长的,难度也不算高吧。
2023-05-20 14:53:34 706
原创 C++每日一练:贝博士的机械零件(补全题目)&奇偶排序(巧妙快排)&寻因找祖
今天的题目中寻因找祖最难了,明显的数学题,笔者这数学文盲水平肯定不会,用暴力搞了一波,只有50%。就去考察学习了一下,记录学习过程以备复习。贝博士的机械零件在笔者这里题目都不显示,费了点劲把题目补全了。给有需要的童鞋参考一下。奇偶排序遇到很多次了,这回突发奇想,用了快排思想优雅地解了一把,总算可以稍稍找回点不会数学的自信。
2023-05-19 19:50:16 540
原创 C++中的 cout 和 printf 用法
C++是一种面向对象的编程语言,它继承了C语言的特点,同时也增加了许多新的特性。在C++中的cout 和 printf是两种常用的输出函数,它们都可以将数据显示在屏幕上,但是它们也有一些区别和优缺点。本文将详细说明这两种函数的区别及格式化输出的不同实现方法。
2023-05-18 13:27:54 4795 1
dynv6 的动态ddns自定义ipv4、v6双栈脚本,首页显示域名
2023-12-31
最短路径经典数据结构算法-dijkstra
2023-12-30
最小生成树(MTS)之Kruskal数据结构与算法
2023-12-30
用C++实现python的list风格
2023-12-30
C++二叉树,实现增删改查,多种遍历方式
2023-12-30
ChatGPT指令示范,指导如何更好的让AI为你服务
2023-05-12
chrome 最新114版 64 位 .rpm(适用于 Fedora/openSUSE)
2023-05-01
chrome 最新114版64 位 .deb(适用于 Debian/Ubuntu)
2023-05-01
Chrome网页浏览器windows64位114版
2023-04-30
Chrome网页浏览器windows32位114版
2023-04-30
CH34x系列usb转接芯片驱动
2023-04-28
某讯K3用openwrt带nfs(LEDE源码编译略加小组件)
2022-05-24
用于获取本机的ipv6地址,自动复制到粘贴板!win7和win10单网卡下测试通过。
2022-04-18
Windows版的SOCAT!强大的端口转发工具
2019-01-13
Windows-CMD做的批量PING测试工具
2019-01-12
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人