未分类。
暂未指定分类的 70 篇文章。
解决Ubuntu24安装搜狗输入法失败
新安装了Ubuntu24之后,无法成功安装搜狐输入法,原因是Ubuntu24使用的是fcitx5,版本过新,最简单的办法就是卸载fcitx5,安装老fcitx 然后剩下的内容按照搜狐官网的安装教程安装即可 https://pinyin.sogou.com/linux/help.php
hexo环境配置记录
该博客用于记录如何快速恢复博客环境 配置node 安装node环境 https://nodejs.cn/download/ 安装最新版node,解压后配置环境变量,进入node的bin目录后链接npm和node到/usr/local/bin 然后配置lib/nodemodules到环境变量,node
openssl生成自签名证书
使用openssl可以方便的生成自签名证书,步骤如下 1. 创建私钥 由于是自签名,该私钥会同时用于签名和服务器本身,采用如下命令生成 2. 基于私钥创建csr(证书请求签名),csr中包含服务器公钥 3. 最后使用csr和key来生成证书
在linux上安装wireshark
wireshark是一款很好用的抓包工具,它可以安装在windows,linux,macos等平台上,在这个教程中,会告诉你如何安装wireshark在ubuntu上 用apt安装wireshark 可以直接使用apt安装wireshark,但是这样无法安装新版本,所以最好先手动添加仓库 安装时你可
kube-proxy工作机制浅析
kube-proxy是k8s中的重要组件,在k8s的整个网络模型中有着重要的作用,kube-proxy有着多种工作模式,本博客只考虑在iptables模式下工作的kube-proxy iptables iptables是linux中著名的防火墙,有着过滤,转发等多种功能,iptables中有多张ta
Go init函数分析
Go的所有init函数会在main函数执行之前运行,init的执行是runtime帮助我们完成的,我们来看看init的运行机制。 init函数的编译处理 initTask是init初始化工作的关键结构体,一个包会有一个对应的initTask: 1. state: 该包的初始化函数是否被执行 - 0:
记录一次双系统linux未删除干净导致系统无法正常启动
由于自己电脑的磁盘总共只有512G,能分配给双系统linux的空间实际上不会太多,所以我决定将其删除,安装到1T大小SSD的U盘上,但是删除以后由于linux的分区信息还存在,所以开机以后将进入grub,正常开机只能通过进入BIOS,或许也可以调正分区的启动顺序,但是我的电脑并不可以。 下面记录一下
Dockerfile中CMD和ENTRYPOINT的区别
CMD和ENTRYPOINT的功能看起来比较类似,但是两者还是存在一些区别。 容器启动命令的构成 我们可以通过docker ps查看容器的启动信息 可以通过COMMAND字段查看到容器的启动命令为/app/web 实际上COMMAND由ENTRYPOINT+CMD构成 我们在docker run后默
记录一次Go打包Docker镜像的问题
在Linux环境下编译好Go源文件以后我尝试将最后的可执行文件复制到Docker镜像alpine中。 这是一个最简单的Go Web代码 以及对应的Dockerfile 在最后运行容器时始终出现了file not found的警告,容器一直启动失败,我尝试通过exec进入到容器内部查看文件,发现文件确
Go切片扩容
以下的内容为Go1.20.2版本的扩容方式 Go数组的扩容机制简单来说分为两种情况 - 一种是原来的容量小于256,此时会将原来的容量翻倍作为新的容量 - 一种是容量大于等于256,会按照以下方式扩容直至可以满足需求 $$ newcap+=(newcap+3∗256)/4 $$ 这是大致的分配方式,
xv6中创建syscall
xv6的启动过程大致可以分为BIOS-bootloader-kernel,三个环节,本小节主要讲述bootloader的相关内容。 BIOS的作用是将磁盘的第一个扇区的内容移入到地址为0x7c00的位置,然后把控制权交给这份内容。这一份内容就是bootloader。 bootloader由boota
xv6系统启动——bootloader
我们以在xv6中添加一个date系统调用为例,介绍在xv6中添加系统调用的方法和原理。 date syscall介绍 date系统调用可以获取系统当前的UTC时间。 在我们完成date系统调用后,我们利用这个系统调用做一个小小的工具,可以打印当前的系统时间,工具代码如下: date.c 变量r是我们
ssh的原理
SSH是一种网络协议,用于计算机间的加密登录。 ssh保证安全的原理 SSH之所以能够保证安全,原因在于它采用了公钥加密。 整个过程是这样的: 1. 远程主机收到用户的登录请求,把自己的公钥发给用户。 2. 用户使用这个公钥,将登录密码加密后,发送回来。 3. 远程主机用自己的私钥,解密登录密码,如
mapreduce简介
MapReduce是一个编程模型,用于处理和生成大数据。用户通过编写Map函数处理输入键值对生成中间键值对,通过编写Reduce函数来合并所有的中间键值对并生成结果。在我们的日常生活中,大部分的任务都可以被抽象成一个MapReduce模型,并通过这个模型解决问题。 MapReduce介绍 我们所遇到
C语言的内存模型
- 程序为什么要被编译器编译之后才可以运行 - 编译器在把C语言转换成机器码的过程中做了什么 - 最后编译出来的可执行文件里面是什么,除了机器码还有什么,是如何组织的 - include 是什么意思,这意味着什么,C语言库是如何实现的 - 不同编译器和不同硬件平台以及不同的操作系统,最终编译出来的结
https简述
在了解https之前,我们先来了解一下非对称加密。 非对称加密的数学原理 非对称加密,就是加密和解密用到的不是一个密钥,一般来说,我们用公钥加密,私钥解密。 下面我们来介绍非对称加密的数学原理,我们来举一个简单的例子: 易知x = 4,然后,我们将x的位置切换 我们通过枚举,似乎也可以得到答案,x
80386内存管理
80386转换逻辑地址到物理地址经过下面的两步: 1. 段翻译,把一个逻辑地址(包含一个段选择子和段偏移量)转换成一个线性地址 2. 页翻译,把一个线性地址准换成一个物理地址,这一步是可选的,取决于系统软件的设计者,在保护模式下段翻译是必须的而页翻译是可选的 这些转换对应用程序而言都是不可见的,下图
linux搭建dosbox环境
dosbox能够让我们在现代os上使用早期dos环境。 dos环境下的汇编是比较友好的,dos本身简单的机制也有利于我们对系统有初步的理解。 下面我们来在linux环境中搭建dosbox和其汇编环境。 安装dosbox 我们直接使用包管理工具安装dosbox即可。 安装完成以后我们需要修改一些配置。
ubuntu美化macos主题
最近突然想美化一下自己ubuntu的风格,想试一试macos风格的ubuntu,本博客记录这次的美化过程。 视频参考: https://www.bilibili.com/video/BV1gT411m7FF/?spmidfrom=333.337.search-card.all.click 此外先下载
编译x86_64 linux并运行在qemu上
本节内容将会告诉你如何自己编译内核并且将这个内核运行在qemu模拟器上。在成功运行之后,我们可以自由的修改并验证我们的内核,以下操作均在Ubntun 22.04下完成。 在开始之前我们有一些需要注意的东西: 1. 在编译过程中,你会遇到各种各样的环境问题,造成的原因可能是多样的,尤其是在遇到这样比较
在u盘中安装ubuntu
你是否因为经常使用不同的电脑,但是编程环境不同而苦恼呢,今天的文章会教你把ubuntu装入移动固态中,现在SSD的价格已经很便宜了,这里我会用1T的移动固态为例,教会你如何将ubuntu装入移动其中(同时支持UEFI和BIOS)。 在开始之前,有几点需要提醒: 1. 操作不当可能会导致数据损失,严重
如何阅读一本书
阅读的四个阶段 1. 基础阅读 2. 检视阅读 3. 分析阅读 4. 主题阅读 阅读中我们应该对下面四个问题有自己的答案 1. 整体来说,这本书在谈什么 2. 作者说了什么,是怎么说的 3. 这本书说的有道理吗,是部分有道理还是全部有道理 4. 这本书和你有什么关系吗 基础阅读 基础阅读就是有着阅读
C语言声明
C语言的声明可以嵌套,所以可以构成一些相当复杂的嵌套,这种过于复杂的声明并不推荐,但是我们应该学会如何去阅读这些声明。并在后面的部分会讲述如何利用typedef去简化这些声明 left-right rule "left-right" rule是解读C语言声明的强力规则,掌握这个规则足够让我们解决几乎
C语言的数据存储
C语言允许类型之间进行转换,包括隐式的转换和强制转换,为了我们能更好的理解这些特性,我们需要了解C语言的数据在计算机中到底是如何存储的。 整型数据 我们先从简单的整型数据开始。 无符号整数的储存比较简单,直接以二进制形式储存,64位机的signed int存储形式如下 而有符号整数的表示稍复杂,有符
C语言的弱类型性
C语言是一个强类型的语言,变量必须先定义再使用,而且变量如果不经过转换,那么将永远保持原来的类型。但强和弱是相对的,如果我们把C语言和其它的一些强类型语言相比较,我们会发现C语言的一些弱类型特性,这些特性会在某些时候坑害我们。当然,讨论强类型还是弱类型是没有意义的事情,重要的是从这些对比中学到一些东
GDB快速入门
GDB全称GNU symbolic debugger,诞生于GNU计划,是一款程序调试器,如果脱离IDE环境,GDB将会是你强大的帮手。 GDB下载和使用 在windows环境中只要下载过C语言应该就会有GDB,这里主要介绍linux环境,也很简单 调试一个程序,例如我们现在要调试可执行程序a.ou
指针和数组并不相同——C语言
在我们初学C语言时,我们会有这样一个认知或者感觉:指针和数组是相同的。我们也经常干着这样的事情,比如下面这样代码。 这样看起来两者似乎确实没有差别,指针可以像数组一样使用[],而数组名也可以解引用,而且它们的结果是一致的。 或者在我们定义函数时,也可能会把两者当成一种处理。 一切看起来都是那么自然。
Dosbox和masm搭建汇编环境
学习汇编语言之前,需要有一个环境来运行汇编代码,所以此文记录下自己的环境搭建过程 下载Dosbox和masm Dosbox提供32位机环境,masm负责编译汇编代码 Doxbox下载地址 Dos官网 点击Download下载即可 接下来安装masm https://github.com/xDarkL
(二)docker的基本使用
在第一节的内容中,我们了解了docker的作用,以及完成了docker的安装和docker的hello world,初步进入了docker的时间,这一节内容会从docker的基本架构出发,讲解组成架构中组成部分的关系以及如何操作它们。 Docker的架构 接下来我会讲解docker的基本使用方式,在
(一)开启docker的旅程
天下苦环境久矣 printf("Hello World!"),这也许是你学习C语言时打印的第一行语句,C语言作为大多数人的入门语言,Hello World开始了我们的代码生涯。对于过去初学的我们而言,要打印出这一行代码并不轻松,我们要安装一个集成开发环境,可能是CodeBlocks,可能是visua
mysql索引使用指南
mysql索引概述 在我们正式开始讲索引之前,我们不妨回想一个场景,当我们使用字典的时候,我们并不会直接去整本书去检索内容,而是先去查找目录,根据目录给我们提供的页码,在从字典中查询信息,索引就类似于字典中的目录,可以大大提高数据检索的效率。 mysql的索引机制是mysql提供给我们的一个超强的功
nginx基本使用指南
nginx是什么 nginx是一个由C语言编写的轻量级web服务器,占用内存小,并发能力强,性能非常优越,是当下非常流行的web服务器。除此以外,nginx还支持相当多的功能,包括但不限于 1. 反向代理 2. 负载均衡 3. 动静分离 这些也是nginx常见的应用场景,今天我们就来全面的介绍一下n
用git hooks自动化部署hexo
背景 hexo是知名的博客部署框架,采用SSG(Static Site Generation)的方式生成静态页面,结合使用github等托管平台可以快速部署我们的站点。hexo也给我们提供了支持部署的插件,安装完成以后我们可以使用hexo deploy推送内容到托管平台。 虽然hexo已经给我们提供
从github page到github action
Github Pages和Github Actions github pages是github给我们提供了托管静态网站的强大功能,让我们可以快速部署自己的一些应用。 github actions是github的一个CI/CD平台,可以帮助我们自动化测试,构建和部署项目,也拥有着十分强大的功能。 看似
hexo部署到自己的云服务器
开始之前 本文不会涉及hexo的使用,请先去了解hexo的基本使用和部署,也可以参考我的文章 。 本教程基于Centos7.6,如果是其它linux发行版请自行修改相应命令。 构建服务器环境 安装git和nginx 配置git仓库 下面的用户和目录都可以自己定义,但注意要保持上下文统一 然后我们添加
github-action简明教程
Github Actions是什么 GitHub Actions 是一种持续集成和持续交付 (CI/CD) 平台,可用于自动执行生成、测试和部署管道。简单地说,就是通过编写符合Github Actions要求的"脚本",让Github来执行这一的"脚本"。 在开始之前,还是有必要简单的介绍一下持续集
hexo建站简明教程
安装node.js 前往官网下载长期稳定版的node.js Node.js 下载完成以后检查一下能否打印出版本,正常打印就表示下载成功 安装hexo 我们用npm在全局安装hexo 检查一下是否下载成功 初始化博客 找到你想要放置博客的目录,在当前目录下执行初始化命令,后面跟着你想给博客目录取的名字
『mysql』mysql语法速记
一、数据定义 主要使用DDL,用于定义数据对象(数据库,数据表,视图,索引等) 数据库(DATABASE) 创建数据库 删除数据库 选择数据库 数据表(TABLE) 数据表的创建与删除 创建数据表 根据已有表创建 删除数据表 修改数据表 添加列 删除列 修改列 添加主键 删除主键 视图(VIEW)
『mysql』mysql快速入门
一、基本概念 数据库术语 - 数据库(database)-保存有组织的数据的容器 - 数据表(table)-某种特定数据类型的结构化清单 - 模式(schema)-关于数据库和数据表的特性信息 - 列(column):表中的一个字段 - 行(row)表中的一个记录 - 主键(primary key)
『git』git和github入门教程
git简介 git是一个分布式的版本控制系统。 git快速开始 安装git Git - Download 这里不讲述安装教程 体验git 我们先来快速的体验一下git,这一部分我将尽量避开git的细节,专注于git的使用 git和github 要体验git的强大功能,github是必不可少的。 但是
『rss』ttrss极速搭建rss服务
什么是rss Really Simple Syndication,简易资讯聚合。 名字并不重要,你可以理解为这是一个软件,可以帮助你订阅互联网上各种各样的信息,就好像微博你订阅了博主,然后你就可以特别的收到它的消息一样。只不过现在你可以订阅的范围变成了所有支持rss的网站 下面我们就尝试着使用ttr
『JavaWeb』基本坏境配置
配置Tomcat 下载Tomcat9或者更低版本,Tomcat10的包目录结构有较大的改变,没有熟悉之前不建议使用 Apache Tomcat® - Apache Tomcat 9 Software Downloads 下载好之后解压到任意目录里 然后把Tomcat配置到环境变量里,我们需要有三个必
『创新实践』创新实践总结1
Web服务器:sailboat: 什么是Web服务器 Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以处理浏览器等Web客户端的请求并返回相应响应,也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载。 Web服务器的本质 Web服务器的本质就是一个程序,不过这
『Go』在Go中使用JWT
什么是JWT JWT即JSON Web Token,工作机制是在用户通过鉴权之后,服务端发送一个JSON作为凭证给客户端,让客户端又权限可以访问一些资源 JWT 的三个部分依次如下。 我们需要注意的是Payload中的数据不会被加密,所以不要存放重要 签名保存在服务端,是绝对不可泄露的 最后,服务器
『springboot』shiro鉴权
Shiro是什么 shiro是java的一个安全框架,关于它的优势和一些功能就不细讲了 Shiro的架构 先放一张经典的Shiro架构图 - Subject:可以理解为资源的请求者 - Shiro SecurityManager:作为一个中间的过度,管理着shiro各种资源 - Realm:存放着真
(十五)密码加密和jwt认证
开始前的准备 开始编码 密码加密 pkg/hash/hash.go 这里要注意的是BcryptCheck()函数的参数位置不能错误,否则函数将无法正常运行 添加钩子函数 app/models/user/userhooks.go 这里我们使用了gorm的钩子函数,注意参数和函数名都不要出错 验证密码
(十四)邮箱发送验证码
开始前的准备 - 发送邮箱验证码时请确保开启MailHog 开始编码 整体逻辑和手机发送短信差不多 接受前端数据 app/requests/signuprequest.go 控制器 注册路由 测试
(十三)手机号发送短信验证码
开始前的准备 编码开始 接受前端数据 app/requests/signuprequest.go 从前端接受到数据,为了满足我们的自定义需求,我们需要自己来拓展验证包 自定义规则 app/requests/validators/customrules.go 自定义验证器 app/requests/v
(十二)用邮件来发送验证码
开始前的准备 我们用mailhog来作为邮箱服务器 - SMTP端口:1025 - 网页端口:8025 我们再powershell使用MailHog命令开启服务 编码 封装mail包 我们依然先去封装mail包 pkg/mail/driverinterface.go pkg/mail/drivers
(十一)利用阿里云平台发送短信
开始前的准备 开始编码 封装sms pkg/sms/driverinterface.go pkg/sms/driveraliyun.go pkg/sms/sms.go 我们先把阿里云的sms包封装成一个Send函数 验证手机验证码 在这里值得一提的是,我们要注意在整个用手机发送短信的过程中,有两个不
(九)使用redis和captcha
开始前的准备 开始编码 redis包 pkg/redis/redis.go 我们对redis包中的redis函数进行了封装并且添加了日志 redis的配置 config/redis.go captcha包 base64Captcha内置了一个内存储存,但是这并不方便,我们用redis实现它的储存接口
(八)在gin和gorm中使用zap
开始前的准备 gin整合zap 还记得我们在gin中自定义中间件的函数吗,我们将自定义中间件并整合zap来代替原来的中间件 bootstrap/route.go 接下来的内容涉及到的内容很多,只需要理解大概即可,所以这一部分的讲解只会介绍大概的思路。 logger中间件 app/http/middl
(五)完成验证手机和邮箱是否存在接口
开始前的准备 简单好用的go验证包,可以自定义验证规则和错误信息 创建controller app/http/controllers/api/v1/baseapicontroller.go 和前面一样,先创建一个Controller基类 app/http/controllers/api/v1/aut
(三)集成viper
开始前的准备 - viper viper是一个相当常用的配置管理包,功能相当强大。但是如果之前没有接触过这个包,第一次学习可能感到疑惑,你可以根据自己的情况去先学习viper的用法或者保持一定的疑惑。 - cast 一个非常方便的类型转换包 编码 编写viper工具包 pkg/config/co
(一)项目基础信息和说明
所需要的Go语言基础 这并不是一个完全零基础的Go语言Web项目教程,你需要对包括但不限于gin,gorm等常用框架有一定的了解。此外,如果你之前有过其它语言的Web开发经验,那么我相信你也可以很快学会这些内容。如果没有这些基础,你可以跟着本教程做下去,我们会在每一部分的练习中写上所需要的基础,你可